diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
index 69e618282e..a43e6129b7 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
@@ -167,7 +167,7 @@
/obj/item/book/manual/wiki/barman_recipes,
/obj/item/book/granter/action/drink_fling,
/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/turf/open/floor/wood,
/area/ruin/powered/beach)
"aI" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index a22d1a21e7..60ae409ea2 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -161,7 +161,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/powered/animal_hospital)
"av" = (
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/item/reagent_containers/spray/cleaner,
/obj/effect/turf_decal/tile/blue{
dir = 1
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index b330592a8e..8e0d9a523a 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -4728,7 +4728,7 @@
/area/ruin/unpowered/syndicate_lava_base/bar)
"lz" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/glass/rag{
+/obj/item/reagent_containers/rag{
pixel_x = -4;
pixel_y = 9
},
diff --git a/_maps/RandomRuins/SpaceRuins/advancedlab.dmm b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm
new file mode 100644
index 0000000000..39e29018ea
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/advancedlab.dmm
@@ -0,0 +1,582 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/advancedlab)
+"c" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"d" = (
+/obj/machinery/vending/assist,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"e" = (
+/obj/machinery/vending/snack/random,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"f" = (
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"g" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"h" = (
+/obj/structure/table/glass,
+/obj/item/crowbar/advanced,
+/obj/item/multitool/advanced{
+ pixel_x = 4;
+ pixel_y = -1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"i" = (
+/obj/machinery/computer/rdconsole,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"j" = (
+/obj/structure/chair/comfy/beige,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"k" = (
+/obj/structure/table/glass,
+/obj/item/screwdriver/advanced{
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"l" = (
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"m" = (
+/obj/structure/table/glass,
+/obj/item/gps{
+ gpstag = "Abductor Replication Lab";
+ pixel_x = -2;
+ pixel_y = 3
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"n" = (
+/obj/structure/chair/comfy/beige{
+ icon_state = "comfychair";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"o" = (
+/obj/structure/table/glass,
+/obj/item/weldingtool/advanced{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"p" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/paper{
+ name = "Note to finder";
+ pixel_x = -1;
+ pixel_y = 3;
+ info = "As of yet, our experiments have seen a fair bit of success. Unfortunately, our business partners have stopped funding us as they realised they utterly hate each other. To whoever finds this place, they are yours. Use them how you will. I leave you with the next generation of greytiding."
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"q" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"r" = (
+/obj/structure/table/glass,
+/obj/item/wirecutters/advanced{
+ pixel_y = 7
+ },
+/obj/item/wrench/advanced{
+ pixel_x = -1;
+ pixel_y = 3
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"s" = (
+/obj/structure/chair/comfy/beige{
+ icon_state = "comfychair";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"t" = (
+/obj/machinery/light/small,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"u" = (
+/obj/machinery/light/small{
+ icon_state = "bulb";
+ dir = 4
+ },
+/obj/structure/closet,
+/obj/item/clothing/suit/hooded/wintercoat/miner,
+/obj/item/clothing/shoes/sneakers/brown,
+/obj/item/clothing/under/pants/classicjeans,
+/obj/item/clothing/neck/scarf,
+/obj/item/clothing/neck/stripedgreenscarf,
+/obj/item/toy/tennis/rainbow,
+/obj/item/toy/tennis,
+/obj/item/clothing/suit/hooded/wintercoat/miner,
+/obj/item/clothing/shoes/sneakers/brown,
+/obj/item/clothing/under/pants/classicjeans,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"v" = (
+/obj/machinery/vending/boozeomat{
+ req_access = null;
+ shut_up = 1
+ },
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/advancedlab)
+"w" = (
+/obj/machinery/door/airlock/command{
+ name = "Dorms"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"x" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/table/glass,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"y" = (
+/obj/machinery/light/small{
+ icon_state = "bulb";
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"z" = (
+/obj/machinery/door/airlock/security{
+ name = "Visiting Business Partners"
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"A" = (
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"B" = (
+/obj/structure/bed,
+/obj/item/bedsheet/syndie,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"C" = (
+/obj/structure/closet{
+ name = "Clothes"
+ },
+/obj/item/clothing/head/chameleon,
+/obj/item/clothing/gloves/combat,
+/obj/item/clothing/suit/chameleon,
+/obj/item/clothing/under/chameleon,
+/obj/item/clothing/shoes/chameleon,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"D" = (
+/obj/machinery/light/small,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"E" = (
+/obj/structure/table/wood,
+/obj/item/radio/headset/chameleon,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"F" = (
+/obj/structure/falsewall,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"G" = (
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"H" = (
+/obj/structure/table/wood,
+/obj/item/radio/headset/headset_cent/alt{
+ keyslot2 = null
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"I" = (
+/obj/structure/closet{
+ name = "Official Clothing"
+ },
+/obj/item/clothing/under/rank/centcom_commander,
+/obj/item/clothing/head/centhat,
+/obj/item/clothing/gloves/combat,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/clothing/shoes/sneakers/brown,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"J" = (
+/obj/machinery/door/airlock/command{
+ name = "Dorms"
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"K" = (
+/obj/machinery/door/airlock/command{
+ name = "Visiting Officials"
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"L" = (
+/obj/structure/bed,
+/obj/item/bedsheet/centcom,
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+"M" = (
+/obj/structure/lattice,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/space/basic,
+/area/ruin/space/has_grav/powered/advancedlab)
+"N" = (
+/obj/structure/extinguisher_cabinet,
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/advancedlab)
+"O" = (
+/obj/structure/reagent_dispensers/water_cooler,
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"P" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"Q" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"R" = (
+/obj/machinery/light/small{
+ icon_state = "bulb";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/has_grav/powered/advancedlab)
+"T" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ruin/space/has_grav/powered/advancedlab)
+
+(1,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+b
+d
+j
+l
+q
+s
+O
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+b
+e
+j
+m
+l
+s
+f
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+c
+f
+j
+l
+l
+s
+f
+M
+M
+M
+M
+M
+M
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+b
+f
+f
+n
+n
+f
+f
+w
+f
+Q
+f
+f
+M
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+b
+f
+f
+f
+f
+f
+f
+M
+M
+M
+M
+f
+M
+a
+a
+a
+a
+"}
+(7,1,1) = {"
+a
+b
+g
+f
+f
+f
+f
+f
+b
+P
+P
+M
+R
+M
+a
+a
+a
+a
+"}
+(8,1,1) = {"
+a
+N
+f
+f
+f
+f
+f
+u
+b
+P
+P
+M
+f
+M
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+b
+f
+f
+f
+f
+f
+b
+b
+b
+b
+M
+J
+M
+b
+a
+a
+a
+"}
+(10,1,1) = {"
+a
+b
+h
+k
+o
+r
+f
+b
+y
+A
+A
+F
+T
+A
+b
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+b
+i
+f
+f
+f
+t
+b
+z
+v
+b
+b
+b
+K
+b
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+b
+p
+f
+f
+f
+f
+b
+A
+C
+b
+G
+A
+A
+b
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+b
+l
+l
+x
+l
+f
+b
+A
+D
+b
+H
+A
+D
+b
+a
+a
+a
+"}
+(14,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+B
+E
+b
+I
+A
+L
+b
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+b
+b
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm
index fe624c19bf..c731bcac5e 100644
--- a/_maps/RandomRuins/SpaceRuins/bus.dmm
+++ b/_maps/RandomRuins/SpaceRuins/bus.dmm
@@ -260,7 +260,7 @@
/turf/open/floor/plating/asteroid/airless,
/area/ruin/unpowered/no_grav)
"aQ" = (
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/turf/open/floor/plating/asteroid/airless,
/area/ruin/unpowered/no_grav)
"aR" = (
diff --git a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
index 8956267108..e21c3a92f7 100644
--- a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
+++ b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
@@ -103,7 +103,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/freezer,
/area/ruin/space/has_grav/gasthelizard)
"n" = (
/obj/structure/closet/crate/freezer,
@@ -117,7 +117,7 @@
},
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/freezer,
/area/ruin/space/has_grav/gasthelizard)
"o" = (
/obj/structure/closet/crate/freezer,
@@ -129,7 +129,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/freezer,
/area/ruin/space/has_grav/gasthelizard)
"p" = (
/obj/structure/window/reinforced{
@@ -158,7 +158,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/gasthelizard)
"r" = (
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"s" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -203,14 +203,14 @@
/area/ruin/space/has_grav/gasthelizard)
"x" = (
/obj/structure/kitchenspike,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"y" = (
/obj/structure/table/reinforced,
/obj/item/kitchen/knife/butcher,
/obj/item/restraints/handcuffs,
/obj/item/reagent_containers/spray/pepper,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"z" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -230,14 +230,14 @@
/area/ruin/space/has_grav/gasthelizard)
"C" = (
/obj/machinery/gibber,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"D" = (
/obj/structure/table/reinforced,
/obj/item/clothing/suit/straight_jacket,
/obj/item/reagent_containers/syringe/lethal,
/obj/item/reagent_containers/syringe/lethal/choral,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"E" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
@@ -258,7 +258,7 @@
/area/ruin/space/has_grav/gasthelizard)
"H" = (
/obj/machinery/door/airlock/security,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"I" = (
/obj/item/reagent_containers/glass/bottle/morphine{
@@ -282,7 +282,7 @@
pixel_y = 6
},
/obj/structure/table/reinforced,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"J" = (
/obj/structure/rack,
@@ -328,12 +328,12 @@
/obj/item/cautery,
/obj/item/circular_saw,
/obj/machinery/light,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"Q" = (
/obj/structure/table/optable,
/obj/effect/decal/cleanable/blood/old,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"R" = (
/obj/structure/table/reinforced,
@@ -342,7 +342,7 @@
/obj/item/reagent_containers/glass/bottle/mutagen,
/obj/item/reagent_containers/glass/bottle/mutagen,
/obj/item/razor,
-/turf/open/floor/plasteel/airless/dark,
+/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/gasthelizard)
"S" = (
/obj/machinery/suit_storage_unit/security,
diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index c64a73eada..69b56946f2 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -2010,7 +2010,7 @@
/area/ruin/space/has_grav/hotel/bar)
"gd" = (
/obj/structure/table/reinforced,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
diff --git a/_maps/RandomZLevels/VR/syndicate_trainer.dmm b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
index f68a799b76..a8c316d770 100644
--- a/_maps/RandomZLevels/VR/syndicate_trainer.dmm
+++ b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
@@ -1973,7 +1973,7 @@
/turf/open/indestructible,
/area/awaymission/centcomAway/thunderdome)
"lB" = (
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/turf/open/indestructible,
/area/awaymission/centcomAway/general)
"lD" = (
diff --git a/_maps/RandomZLevels/beach.dmm b/_maps/RandomZLevels/beach.dmm
index dddeadb0be..7aab25e400 100644
--- a/_maps/RandomZLevels/beach.dmm
+++ b/_maps/RandomZLevels/beach.dmm
@@ -150,7 +150,7 @@
/area/awaymission/beach)
"aB" = (
/obj/structure/table,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/turf/open/floor/wood,
/area/awaymission/beach)
"aC" = (
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 61c606dcde..7edc7b4518 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -5383,7 +5383,7 @@
"kn" = (
/obj/structure/table/reinforced,
/obj/machinery/door/firedoor,
-/obj/item/reagent_containers/glass/rag{
+/obj/item/reagent_containers/rag{
pixel_y = 5
},
/obj/machinery/door/poddoor/shutters{
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm
index 39f7d99173..f6d46ef97d 100644
--- a/_maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/RandomZLevels/undergroundoutpost45.dmm
@@ -3601,7 +3601,7 @@
"hn" = (
/obj/structure/table,
/obj/item/stack/packageWrap,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 4420059f62..62b426d352 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -42,23 +42,20 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aad" = (
-/obj/structure/bed,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/button/door{
- id = "Dorm4";
- name = "Dorm Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/plasteel,
+/area/security/prison)
"aae" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
@@ -596,18 +593,21 @@
/turf/closed/wall/r_wall,
/area/security/execution/transfer)
"abz" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm5";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"abA" = (
/obj/machinery/light,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -1880,16 +1880,16 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"aef" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{
dir = 1
},
+/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/prison)
"aeg" = (
@@ -2150,54 +2150,30 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"aeD" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm6";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_y = -25;
- specialfunctions = 4
+/obj/machinery/door/airlock/security{
+ name = "Firing Range";
+ req_access_txt = "2"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aeE" = (
-/obj/structure/bed,
-/obj/machinery/airalarm{
- pixel_y = 23
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/obj/machinery/button/door{
- id = "Dorm3";
- name = "Dorm Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
+/obj/machinery/light/small{
+ dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
+/turf/open/floor/plating,
+/area/security/prison)
"aeF" = (
-/obj/structure/bed,
-/obj/machinery/airalarm{
- pixel_y = 23
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/machinery/button/door{
- id = "Dorm2";
- name = "Dorm Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
+/turf/open/floor/plating,
+/area/security/prison)
"aeG" = (
/obj/structure/cable,
/obj/machinery/power/solar{
@@ -2273,17 +2249,13 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"aeM" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/structure/window/reinforced{
+ dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/security/prison)
"aeN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -2575,10 +2547,9 @@
/turf/open/floor/plasteel,
/area/security/main)
"afn" = (
-/obj/structure/bed,
-/obj/item/bedsheet/medical,
-/turf/open/floor/plasteel/white,
-/area/medical/virology)
+/obj/structure/table,
+/turf/open/floor/plasteel/showroomfloor,
+/area/security/warden)
"afo" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Three"
@@ -2600,13 +2571,19 @@
/turf/open/space/basic,
/area/space)
"afq" = (
-/obj/structure/bed,
-/obj/item/tank/internals/anesthetic,
-/obj/item/clothing/mask/breath,
-/obj/effect/decal/cleanable/semen,
-/obj/effect/spawner/lootdrop/bedsheet,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"afr" = (
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/maintenance/bar)
+/area/security/prison)
+"afs" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"aft" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -2663,16 +2640,16 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/transfer)
"afz" = (
-/obj/structure/table,
-/obj/item/restraints/handcuffs,
-/obj/effect/turf_decal/tile/red{
- dir = 1
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/machinery/door/window/westleft{
+ base_state = "right";
+ dir = 4;
+ icon_state = "right";
+ name = "Shooting Range"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/security/prison)
"afA" = (
/turf/closed/wall/r_wall,
@@ -2916,6 +2893,16 @@
/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"age" = (
+/obj/machinery/door/window/southleft{
+ name = "Target Storage"
+ },
+/obj/item/target/clown,
+/obj/item/target/clown,
+/obj/item/target,
+/obj/item/target,
+/turf/open/floor/plating,
+/area/security/prison)
"agf" = (
/obj/structure/table,
/obj/item/stack/sheet/metal,
@@ -3069,6 +3056,16 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"agv" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"agw" = (
/obj/structure/table,
/obj/machinery/syndicatebomb/training,
@@ -3193,10 +3190,13 @@
/turf/open/floor/plasteel,
/area/security/main)
"agH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/door/window/southright{
+ name = "Target Storage"
},
-/turf/open/floor/plasteel/dark,
+/obj/item/target/alien,
+/obj/item/target/alien,
+/obj/item/target/syndicate,
+/turf/open/floor/plating,
/area/security/prison)
"agI" = (
/obj/machinery/airalarm{
@@ -3567,6 +3567,15 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"ahw" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"ahx" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -4590,26 +4599,18 @@
/turf/open/floor/plasteel,
/area/security/processing)
"ajt" = (
-/obj/structure/sign/warning/securearea{
- pixel_x = 32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/structure/table,
-/obj/item/storage/box/prisoner,
-/obj/machinery/camera{
- c_tag = "Labor Shuttle Dock North"
- },
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/security/prison)
"aju" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/machinery/computer/security/labor,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/security/prison)
"ajv" = (
/obj/machinery/light{
dir = 8
@@ -4923,6 +4924,29 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"ajX" = (
+/obj/structure/table,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/recharger,
+/obj/item/gun/energy/laser/practice,
+/obj/item/gun/energy/laser/practice,
+/turf/open/floor/plasteel,
+/area/security/prison)
+"ajY" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/prison)
"ajZ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external{
@@ -4947,20 +4971,18 @@
/area/security/processing)
"akc" = (
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
},
/turf/open/floor/plasteel,
-/area/security/processing)
+/area/security/prison)
"akd" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/lattice,
+/turf/closed/wall,
+/area/security/prison)
"ake" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -5229,6 +5251,44 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"akC" = (
+/obj/machinery/door/airlock/security{
+ name = "Labor Shuttle";
+ req_access_txt = "2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/security/processing)
+"akD" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/security/prison)
+"akE" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
+"akF" = (
+/obj/structure/sign/warning/securearea{
+ pixel_x = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Labor Shuttle Dock North"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/security/processing)
"akG" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
@@ -5249,11 +5309,12 @@
/turf/open/floor/plasteel,
/area/security/processing)
"akJ" = (
-/obj/machinery/light_switch{
- pixel_x = 27
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
},
/turf/open/floor/plasteel,
/area/security/processing)
@@ -5538,12 +5599,42 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"alj" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"alk" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"all" = (
+/obj/machinery/light_switch{
+ pixel_x = 27
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/computer/security/labor,
+/turf/open/floor/plasteel,
+/area/security/processing)
+"alm" = (
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/chair{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/processing)
"aln" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
@@ -5555,6 +5646,12 @@
},
/turf/open/floor/plating,
/area/security/processing)
+"alo" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/table,
+/obj/item/storage/box/prisoner,
+/turf/open/floor/plasteel,
+/area/security/processing)
"alp" = (
/turf/open/floor/plating,
/area/security/processing)
@@ -5562,13 +5659,10 @@
/turf/open/floor/plasteel,
/area/security/processing)
"alr" = (
-/obj/machinery/airalarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
+/obj/structure/target_stake,
+/obj/item/target/syndicate,
+/turf/open/floor/plating,
+/area/security/prison)
"als" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -5620,6 +5714,18 @@
},
/turf/open/floor/plasteel,
/area/security/brig)
+"alx" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"aly" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -5774,6 +5880,24 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"alM" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/power/apc{
+ areastring = "/area/security/main";
+ dir = 4;
+ name = "Firing Range APC";
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"alO" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -5829,6 +5953,44 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"alY" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/camera{
+ c_tag = "Firing Range";
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
+"alZ" = (
+/obj/structure/table,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/item/clothing/glasses/sunglasses{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/glasses/sunglasses{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/clothing/ears/earmuffs{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/item/clothing/ears/earmuffs{
+ pixel_x = -3;
+ pixel_y = -2
+ },
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/security/prison)
"ama" = (
/mob/living/simple_animal/sloth/paperwork,
/turf/open/floor/plasteel,
@@ -5848,10 +6010,6 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
-"amd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plasteel,
-/area/security/processing)
"ame" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -6124,26 +6282,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/security/processing)
-"amN" = (
-/obj/structure/table,
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/glasses/sunglasses{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/obj/item/clothing/ears/earmuffs{
- pixel_x = -3;
- pixel_y = -2
- },
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/warden)
"amQ" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -7503,6 +7641,24 @@
},
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
+"aqn" = (
+/obj/structure/bed,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/machinery/button/door{
+ id = "Dorm4";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aqo" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -8283,6 +8439,19 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
+"asu" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm5";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_y = -25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"asv" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance{
@@ -8374,6 +8543,19 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"asL" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm6";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_y = -25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"asM" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
@@ -8980,6 +9162,24 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness)
+"auw" = (
+/obj/structure/bed,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/machinery/button/door{
+ id = "Dorm3";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aux" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -10846,6 +11046,24 @@
},
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
+"ayV" = (
+/obj/structure/bed,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/machinery/button/door{
+ id = "Dorm2";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"ayW" = (
/turf/closed/wall,
/area/ai_monitored/storage/eva)
@@ -20908,7 +21126,7 @@
pixel_x = 32
},
/obj/item/book/manual/wiki/barman_recipes,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
@@ -31259,6 +31477,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/keycard_auth{
+ pixel_y = 25
+ },
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"bvH" = (
@@ -39377,6 +39598,11 @@
/obj/machinery/announcement_system,
/turf/open/floor/plasteel,
/area/tcommsat/computer)
+"bOm" = (
+/obj/structure/bed,
+/obj/item/bedsheet/medical,
+/turf/open/floor/plasteel/white,
+/area/medical/virology)
"bOn" = (
/obj/machinery/light{
dir = 1
@@ -56671,12 +56897,6 @@
/obj/item/stock_parts/cell/high,
/turf/open/floor/plasteel/white,
/area/science/circuit)
-"eef" = (
-/obj/machinery/autolathe{
- name = "public autolathe"
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/office)
"evR" = (
/turf/open/floor/plating,
/area/maintenance/bar)
@@ -56912,6 +57132,12 @@
/obj/item/pen,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"ium" = (
+/mob/living/simple_animal/bot/cleanbot{
+ name = "C.L.E.A.N."
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/central)
"izv" = (
/obj/machinery/vending/clothing,
/obj/machinery/light/small{
@@ -57146,12 +57372,6 @@
},
/turf/open/floor/plating,
/area/construction/mining/aux_base)
-"lKX" = (
-/mob/living/simple_animal/bot/cleanbot{
- name = "C.L.E.A.N."
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
"lMg" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -57383,6 +57603,14 @@
},
/turf/open/floor/plating,
/area/construction)
+"rMN" = (
+/obj/structure/bed,
+/obj/item/tank/internals/anesthetic,
+/obj/item/clothing/mask/breath,
+/obj/effect/decal/cleanable/semen,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/plating,
+/area/maintenance/bar)
"rNc" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -57594,6 +57822,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"urE" = (
+/obj/machinery/autolathe{
+ name = "public autolathe"
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/office)
"usO" = (
/obj/machinery/vending/snack/random,
/obj/machinery/light/small{
@@ -57658,7 +57892,7 @@
/area/ai_monitored/storage/eva)
"vjm" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/machinery/light/small{
dir = 1
},
@@ -79853,7 +80087,7 @@ sAM
imH
evR
evR
-afq
+rMN
bCq
bUs
bLv
@@ -80532,12 +80766,12 @@ adB
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+acd
+acd
+acd
+afr
+acd
+acd
aaa
aaa
aaa
@@ -80790,11 +81024,11 @@ abc
abc
afu
abc
-aaa
-aaa
-aaa
-aaa
-aaa
+age
+aeE
+afs
+ahw
+acd
aaa
aaa
aaa
@@ -81047,11 +81281,11 @@ aea
aeH
aft
abc
-aaa
-aaa
-aaa
-aaa
-aaa
+agH
+aeF
+alr
+ajt
+afr
aaa
aaa
aiU
@@ -81305,10 +81539,10 @@ aeJ
afw
abc
abc
-aaf
-aaa
-aaf
-aaf
+aeF
+aay
+ajt
+akd
aaf
aaf
aiU
@@ -81562,9 +81796,9 @@ aeI
afv
agf
abc
-aaf
-aaa
-aaa
+aeF
+aay
+ajt
aiT
aiT
aiV
@@ -81615,7 +81849,7 @@ cNG
cNJ
bLF
aZK
-eef
+urE
bbR
bqt
cBq
@@ -81819,9 +82053,9 @@ aeL
afy
agh
abc
-aaf
-aaa
-aaf
+aeM
+afz
+aju
aiT
ajs
akb
@@ -82076,9 +82310,9 @@ aeK
afx
agg
abc
-aaf
-aaa
-aaa
+ajX
+alx
+alY
aiU
ajr
aka
@@ -82332,13 +82566,13 @@ aeg
aeN
afA
afA
-afA
-aaf
-aaa
-aaa
-aiU
-aju
-akd
+abc
+afq
+agv
+ajY
+akC
+akE
+akJ
akK
als
ame
@@ -82585,20 +82819,20 @@ acd
acC
ada
adF
+aad
+abz
aef
-aeM
-afz
-aai
-aai
-aai
-aai
-aai
-aai
-ajt
+aeD
+aav
akc
-akJ
-alr
-amd
+alM
+alZ
+akD
+akF
+alj
+all
+alm
+alo
amL
anu
alq
@@ -82845,11 +83079,11 @@ adH
aei
aeO
afJ
-acd
-agL
-agK
-agK
-aiB
+aai
+aai
+aai
+aai
+aai
aai
ajw
akf
@@ -83103,10 +83337,10 @@ aeh
aeO
afI
agl
-agH
+agL
ags
ags
-aho
+aiB
acd
ajv
ake
@@ -87728,7 +87962,7 @@ bkA
acF
aes
avB
-amN
+afn
agt
awN
aHp
@@ -88517,13 +88751,13 @@ aoD
aod
aqe
arf
-aad
+aqn
ath
arf
-aeE
+auw
ath
arf
-aeF
+ayV
ath
dgz
aCd
@@ -90317,7 +90551,7 @@ cSA
aqe
arf
ari
-abz
+asu
aun
auW
avR
@@ -91345,7 +91579,7 @@ apr
aqj
arf
ark
-aeD
+asL
aun
avu
awt
@@ -94210,7 +94444,7 @@ blm
bmL
boi
bpw
-lKX
+ium
bsx
btX
bvj
@@ -96541,7 +96775,7 @@ bof
fTg
bLV
bNd
-afn
+bOm
bPp
bQF
bRN
@@ -98347,7 +98581,7 @@ bRQ
bOr
bSQ
bWj
-afn
+bOm
bXc
bYe
bNd
@@ -98861,7 +99095,7 @@ bRQ
bOr
bSQ
bWj
-afn
+bOm
bXc
bYe
bNd
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index bfc4a60f08..cefc0eb1a5 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -124,22 +124,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
-"aaq" = (
-/obj/structure/bed,
-/obj/machinery/status_display{
- pixel_y = 32
- },
-/obj/item/bedsheet/clown,
-/turf/open/floor/plasteel/grimy,
-/area/hallway/secondary/service)
-"aar" = (
-/obj/structure/bed,
-/obj/machinery/status_display{
- pixel_y = 32
- },
-/obj/item/bedsheet/mime,
-/turf/open/floor/wood,
-/area/hallway/secondary/service)
"aas" = (
/obj/docking_port/stationary/random{
id = "pod_lavaland1";
@@ -159,52 +143,6 @@
/obj/effect/landmark/xeno_spawn,
/turf/open/space,
/area/solar/starboard/fore)
-"aav" = (
-/obj/structure/bed,
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/status_display{
- pixel_y = 32
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"aaw" = (
-/obj/structure/bed,
-/obj/effect/decal/cleanable/dirt{
- desc = "A thin layer of dust coating the floor.";
- name = "dust"
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"aax" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"aay" = (
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plasteel/grimy,
-/area/crew_quarters/dorms)
-"aaz" = (
-/obj/structure/bed,
-/obj/machinery/light,
-/obj/machinery/status_display{
- pixel_y = -32
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"aaA" = (
-/obj/structure/bed,
-/obj/item/tank/internals/anesthetic,
-/obj/item/clothing/mask/breath,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plating,
-/area/crew_quarters/abandoned_gambling_den)
"aaE" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -1072,6 +1010,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
+"aez" = (
+/obj/machinery/keycard_auth,
+/turf/closed/wall,
+/area/quartermaster/qm)
"aeB" = (
/obj/machinery/status_display,
/turf/closed/wall,
@@ -13768,6 +13710,14 @@
},
/turf/open/floor/plasteel/grimy,
/area/hallway/secondary/service)
+"aDF" = (
+/obj/structure/bed,
+/obj/machinery/status_display{
+ pixel_y = 32
+ },
+/obj/item/bedsheet/clown,
+/turf/open/floor/plasteel/grimy,
+/area/hallway/secondary/service)
"aDG" = (
/turf/open/floor/plasteel/grimy,
/area/hallway/secondary/service)
@@ -14482,7 +14432,7 @@
},
/obj/item/book/manual/wiki/barman_recipes,
/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -16922,6 +16872,14 @@
},
/turf/open/floor/wood,
/area/hallway/secondary/service)
+"aIP" = (
+/obj/structure/bed,
+/obj/machinery/status_display{
+ pixel_y = 32
+ },
+/obj/item/bedsheet/mime,
+/turf/open/floor/wood,
+/area/hallway/secondary/service)
"aIQ" = (
/obj/structure/dresser,
/turf/open/floor/wood{
@@ -79006,6 +78964,17 @@
/obj/structure/dresser,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"cCi" = (
+/obj/structure/bed,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/status_display{
+ pixel_y = 32
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"cCj" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/suit/jacket{
@@ -81023,10 +80992,24 @@
icon_state = "wood-broken2"
},
/area/crew_quarters/dorms)
+"cFx" = (
+/obj/structure/bed,
+/obj/effect/decal/cleanable/dirt{
+ desc = "A thin layer of dust coating the floor.";
+ name = "dust"
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"cFy" = (
/obj/item/twohanded/required/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"cFz" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"cFA" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp/green,
@@ -88896,6 +88879,11 @@
/obj/structure/chair/office/dark,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"cTc" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/dorms)
"cTd" = (
/obj/structure/table,
/obj/item/storage/fancy/donut_box,
@@ -90092,6 +90080,15 @@
},
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"cUX" = (
+/obj/structure/bed,
+/obj/machinery/light,
+/obj/machinery/status_display{
+ pixel_y = -32
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"cUY" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/item/clothing/suit/jacket{
@@ -114279,11 +114276,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/stripes/line{
dir = 2
@@ -114291,6 +114283,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Chapel Maintenance";
+ req_access_txt = "27"
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"dKE" = (
@@ -118990,7 +118986,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -119335,7 +119330,6 @@
/turf/closed/wall,
/area/chapel/office)
"dTx" = (
-/obj/structure/bodycontainer/morgue,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -119346,6 +119340,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dTy" = (
@@ -121771,7 +121766,6 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"dYv" = (
-/obj/structure/bodycontainer/morgue,
/obj/structure/sign/poster/official/ian{
pixel_y = -32
},
@@ -121785,6 +121779,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/crate/coffin,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"dYw" = (
@@ -122827,7 +122822,6 @@
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"eat" = (
-/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
icon_state = "1-8"
},
@@ -123564,9 +123558,6 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -123577,6 +123568,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"ebU" = (
@@ -123819,7 +123813,6 @@
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"ecw" = (
-/obj/structure/bodycontainer/morgue,
/obj/machinery/firealarm{
dir = 1;
pixel_y = -24
@@ -126415,6 +126408,13 @@
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior,
/turf/open/floor/engine,
/area/science/mixing)
+"fwr" = (
+/obj/machinery/door/poddoor{
+ id = "chapelgun";
+ name = "Chapel Launcher Door"
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"fFK" = (
/obj/machinery/ore_silo,
/obj/effect/turf_decal/tile/neutral{
@@ -126433,6 +126433,10 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"fHS" = (
+/obj/structure/sign/warning/vacuum,
+/turf/closed/wall/r_wall,
+/area/chapel/office)
"fLR" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -126465,6 +126469,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/circuit)
+"gJj" = (
+/obj/machinery/door/window/northleft{
+ name = "Mass Driver"
+ },
+/obj/machinery/mass_driver{
+ id = "chapelgun";
+ name = "Holy Driver"
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"gKr" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -126482,6 +126496,22 @@
},
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"gNJ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"gNS" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/tile/neutral{
@@ -126546,6 +126576,10 @@
},
/turf/open/floor/plating,
/area/quartermaster/storage)
+"hei" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/closed/wall/r_wall,
+/area/chapel/office)
"hic" = (
/obj/structure/table/reinforced,
/obj/item/integrated_electronics/analyzer,
@@ -126607,6 +126641,22 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"hLO" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/closet,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"hNZ" = (
/obj/structure/chair/office/light{
dir = 8
@@ -126653,6 +126703,9 @@
},
/turf/open/floor/engine/vacuum,
/area/science/mixing)
+"iyd" = (
+/turf/open/space,
+/area/space)
"iQh" = (
/obj/structure/bodycontainer/morgue{
dir = 1
@@ -126717,6 +126770,9 @@
},
/turf/open/floor/plasteel,
/area/science/research/abandoned)
+"jhK" = (
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"jjN" = (
/obj/structure/table/reinforced,
/obj/machinery/camera{
@@ -126814,6 +126870,28 @@
/obj/machinery/chem_master,
/turf/open/floor/plasteel/dark,
/area/medical/medbay/central)
+"jPA" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/computer/pod/old{
+ density = 0;
+ icon = 'icons/obj/airlock_machines.dmi';
+ icon_state = "airlock_control_standby";
+ id = "chapelgun";
+ name = "Mass Driver Controller";
+ pixel_x = 0;
+ pixel_y = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"jRy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -127098,6 +127176,33 @@
},
/turf/open/floor/engine,
/area/science/mixing)
+"mXJ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
+"nht" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"nyN" = (
/obj/machinery/vending/kink,
/turf/open/floor/plating,
@@ -127106,6 +127211,19 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"owr" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"oIl" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -127214,6 +127332,13 @@
dir = 1
},
/area/science/circuit)
+"poI" = (
+/obj/structure/bed,
+/obj/item/tank/internals/anesthetic,
+/obj/item/clothing/mask/breath,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
"psi" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/bodycontainer/morgue{
@@ -127277,6 +127402,12 @@
/obj/effect/spawner/lootdrop/keg,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"qMR" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/chapel/office)
"rhO" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -127426,6 +127557,14 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
+"uZN" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
"vhA" = (
/obj/item/clothing/under/color/grey,
/turf/open/floor/plating,
@@ -127563,6 +127702,25 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/science/research)
+"xWZ" = (
+/obj/structure/bodycontainer/morgue{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/office)
"xXn" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output,
/turf/open/floor/engine/vacuum,
@@ -151680,7 +151838,7 @@ djm
fow
dod
dod
-aaA
+poI
dfY
ajr
aad
@@ -159671,12 +159829,12 @@ dWI
dZf
dZM
eat
-dLY
-dLY
-dLY
-dLY
-dLY
-dLY
+dZN
+dZN
+dZN
+dZN
+fHS
+dZN
dLY
dLY
aad
@@ -159926,20 +160084,20 @@ dWJ
dLW
dYu
dZg
-dYu
-dYu
-dZg
-ebR
-dLW
-ecQ
-edl
-aad
+jhK
+jhK
+dZN
+owr
+mXJ
+gJj
+qMR
+fwr
aaa
aaa
-aad
+iyd
aaa
aaa
-aad
+iyd
aaa
aaa
aaa
@@ -160183,14 +160341,14 @@ dTw
dTw
dTw
dTw
-dLX
-dLW
-dLW
-dLW
-ecv
-dNt
-edl
-aad
+hLO
+uZN
+hei
+gNJ
+jPA
+dTw
+dTw
+dTw
aad
aad
aad
@@ -160443,8 +160601,8 @@ dTw
dZN
dZN
dZN
-dZN
-dZN
+xWZ
+nht
dTw
dTw
dTw
@@ -160834,11 +160992,11 @@ ary
aAf
aBu
aCB
-aaq
+aDF
aEJ
aFV
aDI
-aar
+aIP
aKo
aLE
aMX
@@ -174465,7 +174623,7 @@ aaa
aaa
aad
aQQ
-aQQ
+aez
aUp
aVY
aXE
@@ -178374,7 +178532,7 @@ cyY
cAx
cCd
cDD
-aaw
+cFx
cGU
cAw
cJl
@@ -178382,7 +178540,7 @@ cLa
cMx
cIi
cPR
-aax
+cFz
cDG
cUW
cAw
@@ -179155,7 +179313,7 @@ cNU
cDI
cFB
cDI
-aaz
+cUX
cAw
cYj
cZV
@@ -179402,7 +179560,7 @@ czc
cAw
cCg
cDG
-aax
+cFz
cGW
cIi
cJo
@@ -180171,7 +180329,7 @@ bHq
cxt
coI
cAw
-aav
+cCi
cDI
cFB
cDI
@@ -180439,7 +180597,7 @@ cMB
cIi
cPW
cRv
-aay
+cTc
cVb
cAw
cYp
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 4de1657e48..75d7466371 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -2,58 +2,10 @@
"aaa" = (
/turf/open/space/basic,
/area/space)
-"aab" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Cabin3";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
"aac" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
/area/space)
-"aad" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/button/door{
- id = "Cabin4";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/structure/bed,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"aae" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Cabin2";
- name = "Cabin Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = 25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 4
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"aaf" = (
/obj/structure/lattice,
/turf/open/space,
@@ -300,19 +252,6 @@
},
/turf/open/floor/plating,
/area/security/prison)
-"aaM" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Cabin5";
- name = "Dorm Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = -25;
- specialfunctions = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
"aaN" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -355,37 +294,6 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
-"aaU" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Cabin6";
- name = "Dorm Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = -25;
- specialfunctions = 4
- },
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
-"aaV" = (
-/obj/machinery/button/door{
- id = "Cabin7";
- name = "Door Bolt Control";
- normaldoorcontrol = 1;
- pixel_x = -25;
- specialfunctions = 4
- },
-/obj/structure/bed,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
"aaY" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -10233,6 +10141,22 @@
/obj/item/clothing/under/assistantformal,
/turf/open/floor/wood,
/area/crew_quarters/dorms)
+"asV" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Cabin3";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"asW" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -10271,6 +10195,23 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"ata" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/button/door{
+ id = "Cabin4";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"atb" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/machinery/airalarm{
@@ -11951,6 +11892,21 @@
/obj/item/clothing/under/suit_jacket/tan,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"awE" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Cabin2";
+ name = "Cabin Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"awF" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -11964,6 +11920,19 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"awG" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Cabin5";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"awH" = (
/obj/machinery/newscaster{
pixel_y = 32
@@ -15014,6 +14983,22 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"aCJ" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Cabin6";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"aCK" = (
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/machinery/airalarm{
@@ -17590,6 +17575,21 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/dorms)
+"aHS" = (
+/obj/machinery/button/door{
+ id = "Cabin7";
+ name = "Door Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/structure/bed,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"aHT" = (
/obj/structure/chair/wood/normal{
dir = 4
@@ -20373,6 +20373,9 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
+/obj/machinery/keycard_auth{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"aNS" = (
@@ -38985,7 +38988,7 @@
pixel_y = 5
},
/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/reagent_containers/glass/rag{
+/obj/item/reagent_containers/rag{
pixel_y = 5
},
/obj/effect/turf_decal/tile/bar,
@@ -59281,7 +59284,7 @@
},
/area/maintenance/port/aft)
"ckR" = (
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/structure/table/wood,
/turf/open/floor/wood{
icon_state = "wood-broken4"
@@ -120053,10 +120056,10 @@ agz
aoV
dhs
arB
-aab
+asV
auf
arB
-aae
+awE
axE
arB
dhA
@@ -121595,19 +121598,19 @@ anK
aoZ
aqk
arB
-aad
+ata
aul
avp
-aaM
+awG
axJ
avp
aAj
arB
-aaU
+aCJ
aEe
arB
boS
-aaV
+aHS
aJh
aKt
aLW
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index cef0aefc50..0c55f05fcb 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -13484,7 +13484,7 @@
/obj/structure/table/wood,
/obj/item/book/manual/wiki/barman_recipes,
/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index e03ba4fcd2..ee97af14fc 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -2,44 +2,12 @@
"aaa" = (
/turf/open/space/basic,
/area/space)
-"aab" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm3Shutters";
- name = "Privacy Shutters Control";
- pixel_y = 26
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/wood,
-/area/crew_quarters/dorms)
-"aac" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm2Shutters";
- name = "Privacy Shutters Control";
- pixel_y = 26;
- req_access_txt = "0"
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"aad" = (
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
-"aae" = (
-/obj/structure/bed,
-/obj/machinery/button/door{
- id = "Dorm1Shutters";
- name = "Privacy Shutters Control";
- pixel_y = 26;
- req_access_txt = "0"
- },
-/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/plasteel/grimy,
-/area/crew_quarters/dorms)
"abf" = (
/obj/structure/bed,
/turf/open/floor/plating,
@@ -49,6 +17,13 @@
/obj/structure/grille,
/turf/open/space,
/area/space/nearstation)
+"abD" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"abI" = (
/obj/structure/lattice,
/turf/open/space,
@@ -8637,6 +8612,16 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
+"ave" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm3Shutters";
+ name = "Privacy Shutters Control";
+ pixel_y = 26
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"avf" = (
/obj/machinery/light/small{
dir = 1
@@ -10080,6 +10065,17 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
+"ayj" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm2Shutters";
+ name = "Privacy Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "0"
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"ayk" = (
/obj/machinery/light/small{
dir = 1
@@ -11527,6 +11523,17 @@
},
/turf/open/floor/plating,
/area/crew_quarters/dorms)
+"aBM" = (
+/obj/structure/bed,
+/obj/machinery/button/door{
+ id = "Dorm1Shutters";
+ name = "Privacy Shutters Control";
+ pixel_y = 26;
+ req_access_txt = "0"
+ },
+/obj/effect/spawner/lootdrop/bedsheet,
+/turf/open/floor/plasteel/grimy,
+/area/crew_quarters/dorms)
"aBN" = (
/obj/machinery/light/small{
dir = 1
@@ -14549,6 +14556,18 @@
},
/turf/open/space,
/area/solar/port)
+"aIA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"aIC" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
@@ -15277,13 +15296,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"aKm" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"aKn" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -16688,9 +16700,22 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"aNV" = (
+/obj/machinery/mineral/stacking_unit_console{
+ dir = 2;
+ machinedir = 8;
+ pixel_x = -32;
+ pixel_y = 32
+ },
/obj/machinery/conveyor{
- dir = 8;
- id = "EngLoad"
+ dir = 4;
+ id = "garbagestacked"
+ },
+/turf/open/floor/plating,
+/area/maintenance/disposal)
+"aNW" = (
+/obj/machinery/conveyor{
+ dir = 4;
+ id = "garbagestacked"
},
/turf/open/floor/plating,
/area/maintenance/disposal)
@@ -17182,7 +17207,7 @@
/area/maintenance/department/cargo)
"aPg" = (
/obj/machinery/conveyor{
- dir = 8;
+ dir = 4;
id = "garbage"
},
/obj/structure/disposaloutlet{
@@ -17566,7 +17591,7 @@
dir = 8
},
/obj/machinery/conveyor{
- dir = 2;
+ dir = 1;
id = "garbage"
},
/turf/open/floor/plating,
@@ -21118,7 +21143,7 @@
"aYf" = (
/obj/structure/table/reinforced,
/obj/item/book/manual/wiki/barman_recipes,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -24110,6 +24135,10 @@
/obj/effect/turf_decal/tile/brown{
dir = 8
},
+/obj/machinery/keycard_auth{
+ pixel_x = -23;
+ pixel_y = 0
+ },
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"beK" = (
@@ -24169,6 +24198,17 @@
/obj/item/caution,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"beT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/public/glass{
+ name = "Monastery Transit"
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/chapel/dock)
"beU" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -29401,6 +29441,13 @@
dir = 1
},
/obj/effect/landmark/start/chemist,
+/obj/machinery/button/door{
+ id = "chemistry_shutters";
+ name = "Shutters Control";
+ pixel_x = 26;
+ pixel_y = 4;
+ req_access_txt = "5; 33"
+ },
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
@@ -29442,6 +29489,15 @@
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
+"brp" = (
+/obj/item/twohanded/required/kirbyplants{
+ icon_state = "plant-03"
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/lab)
"brq" = (
/obj/structure/sink/kitchen{
desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
@@ -31924,27 +31980,13 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bwW" = (
-/obj/structure/rack,
-/obj/item/stack/packageWrap,
-/obj/item/hand_labeler,
-/obj/item/clothing/glasses/science,
-/obj/item/clothing/glasses/science,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "chemistry_shutters";
+ name = "chemistry shutters"
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/medical/chemistry)
-"bxa" = (
-/obj/structure/table/glass,
-/obj/item/book/manual/wiki/research_and_development,
-/obj/item/disk/tech_disk,
-/obj/item/disk/design_disk,
-/turf/open/floor/plasteel/dark,
-/area/science/lab)
"bxc" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -32453,17 +32495,19 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bxY" = (
-/obj/structure/closet/emcloset,
/obj/machinery/light/small{
dir = 1
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bxZ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bya" = (
/obj/structure/extinguisher_cabinet{
@@ -32472,7 +32516,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"byb" = (
/obj/structure/table,
@@ -33186,17 +33230,14 @@
/area/space/nearstation)
"bzz" = (
/obj/effect/turf_decal/stripes/line,
-/obj/structure/chair{
- dir = 4
- },
-/obj/structure/sign/departments/holy{
- pixel_x = -32
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bzA" = (
/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/dark,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bzB" = (
/obj/effect/turf_decal/stripes/line,
@@ -33207,7 +33248,7 @@
network = list("monastery");
pixel_x = 28
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white,
/area/hallway/secondary/entry)
"bzC" = (
/obj/structure/table,
@@ -33740,8 +33781,9 @@
/obj/structure/transit_tube/curved/flipped{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/hallway/secondary/entry)
"bAJ" = (
/obj/structure/transit_tube/horizontal,
/obj/structure/window/reinforced/fulltile,
@@ -37152,6 +37194,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -37276,19 +37319,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"bHp" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"bHq" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -37478,6 +37508,7 @@
dir = 8;
layer = 2.9
},
+/obj/structure/lattice,
/turf/open/space/basic,
/area/space/nearstation)
"bHP" = (
@@ -38059,14 +38090,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
-"bIY" = (
-/obj/structure/lattice,
-/obj/structure/window/reinforced{
- dir = 8;
- layer = 2.9
- },
-/turf/open/space/basic,
-/area/space/nearstation)
"bIZ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -38622,15 +38645,15 @@
/area/chapel/dock)
"bKe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark,
+/obj/structure/closet/emcloset,
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
/area/chapel/dock)
"bKf" = (
-/obj/structure/chair,
-/turf/open/floor/plasteel/dark,
-/area/chapel/dock)
-"bKg" = (
-/obj/structure/closet/emcloset,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
/area/chapel/dock)
"bKh" = (
/obj/machinery/door/window/eastright{
@@ -39144,19 +39167,11 @@
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
"bLr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
},
-/turf/open/floor/plasteel/dark,
/area/chapel/dock)
-"bLs" = (
-/obj/structure/lattice,
-/obj/structure/window/reinforced{
- dir = 8;
- layer = 2.9
- },
-/turf/open/space,
-/area/space/nearstation)
"bLt" = (
/obj/effect/decal/cleanable/oil{
icon_state = "floor6"
@@ -39647,7 +39662,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
/area/chapel/dock)
"bMx" = (
/obj/effect/turf_decal/stripes/line,
@@ -39657,16 +39674,13 @@
/obj/machinery/light/small{
dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/chapel/dock)
-"bMy" = (
-/obj/structure/window/reinforced{
- dir = 8;
- layer = 2.9
+/obj/structure/chair{
+ dir = 1
},
-/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/chapel/dock)
"bMA" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/engine,
@@ -40518,19 +40532,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
-"bOy" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/dock)
"bOz" = (
/obj/structure/chair/comfy/black{
dir = 1
@@ -42241,12 +42242,6 @@
/obj/structure/flora/ausbushes,
/turf/open/floor/plating/asteroid,
/area/chapel/asteroid/monastery)
-"bSn" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/space,
-/area/space/nearstation)
"bSo" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -44059,7 +44054,8 @@
/turf/open/floor/engine/co2,
/area/engine/atmos)
"bWh" = (
-/turf/open/floor/plating/asteroid,
+/obj/effect/turf_decal/sand,
+/turf/open/floor/plasteel,
/area/chapel/office)
"bWi" = (
/obj/structure/flora/ausbushes/leafybush,
@@ -44780,12 +44776,6 @@
},
/turf/closed/wall/r_wall,
/area/engine/atmos)
-"bXI" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main/monastery)
"bXJ" = (
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
@@ -45107,6 +45097,24 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"bYM" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"bYN" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -45179,15 +45187,15 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"bYR" = (
@@ -46450,13 +46458,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
-"ccL" = (
-/obj/item/flashlight/lantern{
- icon_state = "lantern-on"
- },
-/obj/effect/turf_decal/sand,
-/turf/open/floor/plasteel,
-/area/chapel/asteroid/monastery)
"ccM" = (
/obj/structure/chair,
/turf/open/floor/plating/asteroid,
@@ -46689,6 +46690,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cdK" = (
@@ -46857,6 +46859,15 @@
},
/turf/open/floor/plating/asteroid,
/area/chapel/asteroid/monastery)
+"cep" = (
+/obj/structure/sign/poster/official/random{
+ pixel_x = -32
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"ceq" = (
/obj/machinery/power/emitter,
/turf/open/floor/plating,
@@ -47117,22 +47128,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
-"cfp" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main/monastery)
"cfr" = (
/obj/structure/transit_tube_pod,
/obj/structure/transit_tube/station/reverse{
@@ -47240,7 +47235,6 @@
/turf/open/floor/plating,
/area/chapel/main/monastery)
"cfL" = (
-/obj/structure/flora/ausbushes/fernybush,
/obj/machinery/camera{
c_tag = "Monastery Asteroid Starboard Aft";
dir = 1;
@@ -47249,11 +47243,6 @@
/obj/effect/turf_decal/sand,
/turf/open/floor/plasteel,
/area/chapel/asteroid/monastery)
-"cfM" = (
-/obj/structure/flora/ausbushes,
-/obj/effect/turf_decal/sand,
-/turf/open/floor/plasteel,
-/area/chapel/asteroid/monastery)
"cfN" = (
/turf/closed/mineral,
/area/chapel/asteroid/monastery)
@@ -47426,6 +47415,13 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"cgt" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"cgu" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
@@ -50161,6 +50157,19 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/dock)
+"cqI" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/dock)
"cqS" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -50902,6 +50911,22 @@
/obj/machinery/vending/wardrobe/chap_wardrobe,
/turf/open/floor/carpet,
/area/chapel/office)
+"cua" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main/monastery)
"cuc" = (
/obj/machinery/light,
/obj/machinery/camera{
@@ -50922,13 +50947,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"cui" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
"cuk" = (
/obj/structure/closet{
name = "beekeeping wardrobe"
@@ -51264,11 +51282,11 @@
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
"cvf" = (
+/obj/machinery/recycler,
/obj/machinery/conveyor{
- dir = 8;
+ dir = 4;
id = "garbage"
},
-/obj/machinery/recycler,
/turf/open/floor/plating,
/area/maintenance/disposal)
"cvg" = (
@@ -51544,15 +51562,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
-"cvM" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-10"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/dark,
-/area/chapel/main/monastery)
"cvR" = (
/obj/machinery/light/small{
dir = 8
@@ -51850,6 +51859,22 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"cxj" = (
+/obj/structure/table,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/clothing/glasses/meson/engine,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/obj/item/pipe_dispenser,
+/obj/machinery/light,
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"cxk" = (
/obj/structure/window/reinforced{
dir = 1;
@@ -52395,6 +52420,12 @@
},
/turf/open/floor/plasteel/dark,
/area/library)
+"cAp" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"cAr" = (
/obj/machinery/light/small{
dir = 8
@@ -52546,15 +52577,6 @@
},
/turf/open/floor/plasteel/dark,
/area/library)
-"cAQ" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"cAS" = (
/obj/machinery/vending/wardrobe/curator_wardrobe,
/turf/open/floor/plasteel/dark,
@@ -52870,23 +52892,6 @@
},
/turf/open/floor/plasteel,
/area/science/explab)
-"cKV" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"cLw" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"cOp" = (
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
@@ -52896,6 +52901,13 @@
/obj/structure/table,
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"cOA" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"cPy" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 2
@@ -52930,6 +52942,14 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"cQZ" = (
+/obj/machinery/door/airlock/maintenance,
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
+"cRJ" = (
+/obj/machinery/status_display/supply,
+/turf/closed/wall,
+/area/quartermaster/warehouse)
"cSJ" = (
/obj/item/reagent_containers/glass/beaker/cryoxadone{
pixel_x = -2;
@@ -52985,6 +53005,15 @@
},
/turf/open/floor/plasteel/dark,
/area/science/lab)
+"cUT" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"cXW" = (
/obj/structure/grille,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -53037,13 +53066,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"dgj" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
- },
-/obj/machinery/meter,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"dgz" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -53065,6 +53087,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"dhu" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 6
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"dhz" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -53109,6 +53138,12 @@
},
/turf/open/floor/plasteel/dark,
/area/science/explab)
+"dlI" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"dmP" = (
/obj/structure/chair{
dir = 8
@@ -53180,10 +53215,6 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
-"dps" = (
-/obj/machinery/status_display/ai,
-/turf/closed/wall,
-/area/quartermaster/qm)
"dqw" = (
/obj/machinery/door/airlock/maintenance{
req_access_txt = "0";
@@ -53219,13 +53250,6 @@
/obj/machinery/reagentgrinder,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"dsz" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
"dtm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53291,6 +53315,24 @@
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"dzA" = (
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/rack,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
+"dAa" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"dAF" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -53305,54 +53347,30 @@
icon_state = "platingdmg1"
},
/area/maintenance/department/engine)
-"dEy" = (
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
-"dFJ" = (
-/turf/open/floor/engine,
+"dFF" = (
+/turf/closed/wall/r_wall,
/area/engine/supermatter)
-"dHr" = (
+"dGd" = (
/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/machinery/button/door{
- id = "engsm";
- name = "Radiation Shutters Control";
- pixel_y = 24;
- req_access_txt = "10"
- },
+/obj/machinery/meter,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/turf/open/floor/engine,
/area/engine/engineering)
-"dHZ" = (
-/obj/structure/chair/office/light{
- dir = 1
- },
-/obj/effect/landmark/start/chemist,
-/obj/machinery/button/door{
- id = "chemistry_shutters";
- name = "Shutters Control";
- pixel_x = 26;
- pixel_y = 4;
- req_access_txt = "5; 33"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
+"dGp" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
dir = 4
},
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
-"dJk" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
-/area/engine/atmos)
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
+"dHF" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"dJm" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -53412,12 +53430,18 @@
/obj/machinery/shieldwallgen/xenobiologyaccess,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"dSp" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{
- dir = 1
+"dPZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/turf/open/floor/plating/airless,
+/turf/open/floor/plasteel,
/area/engine/engineering)
+"dRs" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"dSr" = (
/obj/item/chair,
/turf/open/floor/wood,
@@ -53428,6 +53452,25 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"dUk" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
+"dVt" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/effect/landmark/start/chemist,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"dVI" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -53494,10 +53537,6 @@
/obj/structure/chair/office/light,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"eex" = (
-/obj/machinery/status_display/supply,
-/turf/closed/wall,
-/area/quartermaster/office)
"eeQ" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -53533,13 +53572,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"eiV" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"ekU" = (
/obj/effect/decal/cleanable/cobweb{
icon_state = "cobweb2"
@@ -53550,23 +53582,12 @@
/obj/structure/chair/office/dark,
/turf/open/floor/wood,
/area/lawoffice)
-"epj" = (
-/obj/machinery/cryopod{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/dorms)
"epJ" = (
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
},
/turf/open/floor/carpet,
/area/maintenance/department/crew_quarters/dorms)
-"epV" = (
-/obj/structure/chair,
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"eqD" = (
/obj/structure/sign/poster/contraband/random{
pixel_x = -32
@@ -53576,6 +53597,20 @@
icon_state = "wood-broken"
},
/area/maintenance/department/crew_quarters/dorms)
+"eqM" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 5
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
+"erV" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"eta" = (
/obj/machinery/door/airlock/engineering{
name = "Engineering Supplies";
@@ -53594,6 +53629,40 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"eue" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"eux" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
+"euN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/twohanded/required/kirbyplants{
+ icon_state = "plant-10"
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main/monastery)
"euQ" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
@@ -53603,10 +53672,20 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
-"eyj" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/engineering)
+"eyT" = (
+/obj/machinery/jukebox,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
+"ezo" = (
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
+/obj/structure/rack,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
"ezF" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -53638,23 +53717,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"eAH" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"eAZ" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
"eCw" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -53693,19 +53755,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
-"eFG" = (
-/obj/machinery/mineral/stacking_unit_console{
- dir = 2;
- machinedir = 8;
- pixel_x = -32;
- pixel_y = 32
- },
-/obj/machinery/conveyor{
- dir = 8;
- id = "EngLoad"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
"eHI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
@@ -53730,6 +53779,17 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"eMz" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 4
+ },
+/obj/machinery/door/airlock/engineering/glass{
+ name = "Supermatter Engine";
+ req_access_txt = "10"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"eMC" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -53749,6 +53809,15 @@
/obj/structure/lattice,
/turf/closed/wall,
/area/space/nearstation)
+"eOA" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"eOZ" = (
/obj/structure/closet,
/obj/item/clothing/suit/judgerobe,
@@ -53756,6 +53825,19 @@
/obj/item/gavelhammer,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"ePS" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -28
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"ePU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -53783,18 +53865,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
-"eRp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"eSB" = (
-/obj/machinery/computer/cryopod{
- dir = 1;
- pixel_y = -26
- },
-/turf/open/floor/plasteel/dark,
-/area/security/prison)
"eSL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/item/beacon,
@@ -53816,6 +53886,10 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"eVW" = (
+/obj/machinery/portable_atmospherics/canister/toxins,
+/turf/open/floor/plating,
+/area/engine/engineering)
"eWi" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -53845,6 +53919,12 @@
/obj/item/stack/cable_coil/cut/random,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"fbu" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
+ },
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
"fdQ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -53929,12 +54009,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/explab)
-"fjD" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"fkH" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -53947,16 +54021,20 @@
},
/turf/open/floor/plasteel,
/area/science/explab)
+"flP" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"fmh" = (
/turf/open/floor/wood,
/area/maintenance/department/engine)
-"fmL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
+"fml" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
},
-/turf/open/floor/plasteel/dark,
+/turf/closed/wall/r_wall,
/area/engine/engineering)
"fmU" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -53997,12 +54075,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"frj" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"ftp" = (
/turf/open/floor/plating{
icon_state = "platingdmg1"
@@ -54052,6 +54124,10 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
+"fwo" = (
+/obj/machinery/door/airlock/maintenance,
+/turf/open/floor/plating,
+/area/chapel/main/monastery)
"fwr" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -54065,21 +54141,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"fxC" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"fym" = (
-/obj/machinery/door/airlock/engineering/glass/critical{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"fyF" = (
/obj/structure/cable/yellow{
icon_state = "0-4"
@@ -54148,12 +54209,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
-"fBZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"fFv" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/firealarm{
@@ -54162,6 +54217,14 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"fGt" = (
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/landmark/start/station_engineer,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"fIu" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -54234,19 +54297,9 @@
/obj/structure/bookcase/random/religion,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
-"fZK" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+"fWE" = (
/turf/open/floor/engine,
-/area/engine/engineering)
+/area/engine/supermatter)
"gam" = (
/obj/machinery/door/airlock/medical/glass{
name = "Service Door";
@@ -54259,6 +54312,18 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
+"gaJ" = (
+/obj/machinery/status_display/ai,
+/turf/closed/wall,
+/area/quartermaster/qm)
+"gaQ" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"gcj" = (
/obj/machinery/vending/kink,
/obj/effect/turf_decal/tile/blue{
@@ -54306,6 +54371,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"gfh" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 6
+ },
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"gfi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -54315,11 +54387,18 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"ggg" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 6
+"gih" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#d1dfff"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
/area/engine/engineering)
"giI" = (
/obj/machinery/light/small{
@@ -54364,6 +54443,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"gkN" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"gkR" = (
/obj/item/twohanded/required/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
@@ -54493,6 +54578,14 @@
heat_capacity = 1e+006
},
/area/hallway/secondary/exit/departure_lounge)
+"gvO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/chapel/dock)
"gwn" = (
/obj/structure/sign/warning{
pixel_y = 32
@@ -54545,24 +54638,6 @@
/obj/item/flashlight/lamp/green,
/turf/open/floor/carpet,
/area/lawoffice)
-"gBb" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
-"gDR" = (
-/obj/machinery/camera{
- c_tag = "Central Primary Hallway Escape";
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"gDZ" = (
/obj/effect/turf_decal/box/corners{
dir = 1
@@ -54582,11 +54657,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/explab)
-"gEo" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"gFo" = (
/obj/structure/window/reinforced,
/obj/structure/table/glass,
@@ -54620,17 +54690,39 @@
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"gGA" = (
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "chemistry_shutters";
+ name = "chemistry shutters"
},
-/turf/open/floor/plasteel/white,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/medical/chemistry)
+"gHp" = (
+/obj/machinery/atmospherics/pipe/manifold/orange/visible{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
+"gHy" = (
+/obj/machinery/computer/cryopod{
+ dir = 1;
+ pixel_y = -26
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"gHZ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -54681,6 +54773,13 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"gLn" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"gLF" = (
/obj/machinery/vending/snack/random,
/obj/effect/turf_decal/tile/neutral{
@@ -54732,12 +54831,6 @@
},
/turf/open/floor/wood,
/area/lawoffice)
-"gQf" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"gSH" = (
/turf/closed/wall,
/area/lawoffice)
@@ -54755,6 +54848,21 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"gUS" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/camera{
+ c_tag = "Engineering Supermatter Fore";
+ dir = 1;
+ network = list("ss13","engine")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"gVc" = (
/turf/open/floor/wood{
icon_state = "wood-broken4"
@@ -54767,31 +54875,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
-"gXZ" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 4;
- network = list("ss13","engine")
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"gYo" = (
/obj/structure/grille,
/turf/open/space/basic,
/area/space/nearstation)
-"haA" = (
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/rods/fifty,
-/obj/item/clothing/glasses/welding,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"heC" = (
/obj/machinery/power/apc/highcap/five_k{
dir = 8;
@@ -54838,24 +54925,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
-"hjk" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"hjD" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"hkQ" = (
/obj/machinery/light{
dir = 4
@@ -54878,26 +54947,6 @@
},
/turf/open/floor/wood,
/area/lawoffice)
-"hon" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Gas to Filter"
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hoS" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/engine,
-/area/engine/engineering)
"hqo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -54913,6 +54962,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"hrx" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"hvW" = (
/obj/machinery/door/poddoor/preopen{
id = "xenobio4";
@@ -54948,18 +55004,18 @@
/obj/machinery/portable_atmospherics/canister/toxins,
/turf/open/floor/plating,
/area/security/execution/transfer)
+"hxh" = (
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"hxn" = (
/obj/structure/chair,
/obj/item/clothing/glasses/regular,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"hyh" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 9
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
"hzc" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -54989,6 +55045,21 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
+"hCg" = (
+/obj/machinery/conveyor{
+ dir = 8;
+ id = "garbage"
+ },
+/turf/open/floor/plating,
+/area/maintenance/disposal)
+"hDy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/holopad,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"hDG" = (
/obj/machinery/door/airlock/engineering{
name = "Auxillary Base Construction";
@@ -55021,43 +55092,20 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
-"hGB" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"hHr" = (
/obj/structure/chair/comfy/black{
dir = 4
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"hIZ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"hKp" = (
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
- },
-/obj/structure/window/plasma/reinforced{
+"hJO" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
},
-/obj/machinery/power/rad_collector/anchored,
-/turf/open/floor/engine,
-/area/engine/supermatter)
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"hOx" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -55095,17 +55143,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
-"hQy" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "engsm";
- name = "Radiation Chamber Shutters"
- },
-/obj/item/tank/internals/plasma,
-/turf/open/floor/plating,
-/area/engine/supermatter)
"hQz" = (
/obj/structure/closet/emcloset/anchored,
/obj/structure/cable/yellow{
@@ -55117,29 +55154,14 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/engine/engineering)
-"hSt" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "Gas to Cooling Loop"
+"hRQ" = (
+/obj/structure/window/reinforced{
+ dir = 8;
+ layer = 2.9
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"hSC" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/structure/lattice,
+/turf/open/space,
+/area/space/nearstation)
"hSM" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -55164,18 +55186,23 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"hUf" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 9
+ },
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
+"hUi" = (
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/meter,
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"hUt" = (
/obj/structure/closet/crate{
icon_state = "crateopen"
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"hUw" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"hUJ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55191,17 +55218,25 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"hWa" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
+"hXm" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"hXt" = (
/obj/structure/girder,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"hXK" = (
-/obj/structure/chair/office/dark{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"hYe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{
@@ -55243,20 +55278,15 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"iaZ" = (
+/turf/open/space/basic,
+/area/hallway/secondary/entry)
"ick" = (
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plasteel/dark,
/area/library)
-"iej" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/engine,
-/area/engine/engineering)
"igE" = (
/obj/structure/table/reinforced,
/obj/machinery/button/door{
@@ -55305,30 +55335,24 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
+"ikm" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "Mix to Gas"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"ikB" = (
/obj/structure/closet/secure_closet/medical2,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"ikO" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 9
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"ilD" = (
/obj/machinery/processor/slime,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"imE" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"ioj" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -55345,40 +55369,13 @@
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
-"iop" = (
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"ioF" = (
-/obj/structure/closet/secure_closet/engineering_electrical,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"iqc" = (
/turf/open/floor/plasteel/stairs/right,
/area/maintenance/department/crew_quarters/dorms)
-"irM" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+"irs" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"itl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55411,13 +55408,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"iwe" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"iyg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55434,11 +55424,6 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"izm" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/engine/engineering)
"izB" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod"
@@ -55521,6 +55506,20 @@
},
/turf/open/floor/plasteel/white,
/area/storage/emergency/port)
+"iHe" = (
+/obj/machinery/camera{
+ c_tag = "Central Primary Hallway Escape";
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"iHI" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"iJi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -55534,13 +55533,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/quartermaster/sorting)
-"iLh" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/engine/engineering)
"iLl" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -55602,6 +55594,22 @@
},
/turf/open/floor/plating,
/area/security/execution/transfer)
+"iSi" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Cooling Loop Bypass"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"iSz" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -55614,9 +55622,14 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"iTF" = (
-/obj/structure/sign/warning/electricshock,
-/turf/closed/wall/r_wall,
+"iSL" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/open/floor/plating,
+/area/engine/atmos)
+"iTE" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
/area/engine/supermatter)
"iVJ" = (
/obj/effect/spawner/lootdrop/organ_spawner,
@@ -55683,6 +55696,16 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/crew_quarters/dorms)
+"jjA" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Gas to Cooling Loop"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"jjC" = (
/obj/structure/rack,
/obj/item/storage/briefcase{
@@ -55695,6 +55718,18 @@
},
/turf/open/floor/wood,
/area/lawoffice)
+"jkm" = (
+/obj/structure/closet/emcloset,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
+"jrb" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"jrG" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -55750,6 +55785,17 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"jtv" = (
+/obj/machinery/camera{
+ c_tag = "Engineering Supermatter Starboard";
+ dir = 8;
+ network = list("ss13","engine")
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"jvi" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -55795,17 +55841,6 @@
/obj/structure/sign/warning/vacuum/external,
/turf/open/floor/plating,
/area/hallway/secondary/entry)
-"jzE" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 4
- },
-/obj/machinery/door/airlock/engineering/glass{
- name = "Supermatter Engine";
- req_access_txt = "10"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"jAy" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -55884,15 +55919,39 @@
/obj/machinery/atmospherics/pipe/simple/purple/visible,
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"jOw" = (
+/obj/structure/closet/secure_closet/engineering_electrical,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"jOB" = (
/turf/open/floor/plating,
/area/storage/emergency/starboard)
+"jOX" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Monastery Transit"
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/chapel/dock)
"jPf" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance,
/obj/item/kitchen/knife,
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
+"jPC" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/space,
+/area/space/nearstation)
"jQh" = (
/obj/item/stack/sheet/animalhide/xeno,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -55902,6 +55961,15 @@
icon_state = "platingdmg1"
},
/area/maintenance/department/science)
+"jQn" = (
+/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"jRG" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -55912,6 +55980,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"jTc" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Gas to Filter"
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"jTh" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -55933,16 +56008,6 @@
},
/turf/open/floor/carpet,
/area/lawoffice)
-"jTU" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"jUV" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -55963,12 +56028,6 @@
/obj/item/stack/ore/iron,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"jXF" = (
-/obj/machinery/cryopod{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/security/prison)
"jXV" = (
/obj/machinery/light/small{
dir = 1
@@ -55993,20 +56052,14 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/engine)
-"jZG" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "chemistry_shutters";
- name = "chemistry shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/chemistry)
-"kaR" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 8
+"kec" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
},
/obj/effect/turf_decal/stripes/line{
- dir = 1
+ dir = 8
},
/turf/open/floor/engine,
/area/engine/engineering)
@@ -56064,10 +56117,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
-"klb" = (
-/obj/machinery/status_display/supply,
-/turf/closed/wall,
-/area/quartermaster/sorting)
"klo" = (
/obj/structure/dresser,
/obj/structure/mirror{
@@ -56086,22 +56135,10 @@
/obj/item/clothing/under/rank/clown/sexy,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
-"kmd" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"kmn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/white,
/area/science/mixing)
-"koz" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"kpK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -56121,6 +56158,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"ksC" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"kvj" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -56134,6 +56177,20 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"kvu" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
+"kvx" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"kwm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -56194,12 +56251,22 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"kBe" = (
+/obj/structure/reflector/double/anchored{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"kDf" = (
/obj/machinery/light/small{
dir = 2
},
/turf/open/floor/carpet/black,
/area/chapel/office)
+"kDI" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/turf/open/floor/plating,
+/area/engine/supermatter)
"kDJ" = (
/obj/machinery/light{
dir = 8
@@ -56332,6 +56399,11 @@
},
/turf/open/floor/engine,
/area/science/xenobiology)
+"kNK" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/engine/engineering)
"kPi" = (
/obj/structure/table,
/obj/machinery/microwave,
@@ -56405,20 +56477,10 @@
},
/turf/open/floor/plating,
/area/storage/emergency/port)
-"kTj" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"kTR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+"kVA" = (
+/obj/machinery/status_display/supply,
+/turf/closed/wall,
+/area/quartermaster/sorting)
"kWQ" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable/yellow{
@@ -56432,16 +56494,15 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
-"kYM" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
+"kYR" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/obj/machinery/light,
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/area/hallway/secondary/entry)
"lcU" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -56469,29 +56530,14 @@
},
/turf/open/floor/plating,
/area/security/execution/transfer)
-"lfx" = (
-/obj/structure/table,
-/obj/item/clothing/suit/hooded/wintercoat/engineering,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/effect/turf_decal/delivery,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+"lfZ" = (
+/obj/machinery/status_display/supply,
+/turf/closed/wall,
+/area/quartermaster/office)
"lhA" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"lhP" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"liR" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
@@ -56506,18 +56552,30 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"ljG" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 6
+"llS" = (
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
+/area/hallway/secondary/entry)
"lms" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 9
},
/turf/closed/wall,
/area/maintenance/department/engine)
+"lmv" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#d1dfff"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"lnn" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral,
@@ -56526,32 +56584,17 @@
},
/turf/open/floor/plasteel,
/area/storage/primary)
-"lnr" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"loz" = (
-/obj/structure/closet/radiation,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"lqc" = (
/obj/item/toy/gun,
/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"lqo" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"lqy" = (
/obj/machinery/door/airlock/grunge{
name = "Library"
@@ -56561,13 +56604,13 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
-"lrM" = (
-/obj/structure/cable{
- icon_state = "2-8"
+"lxh" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+/turf/open/space,
+/area/space/nearstation)
"lzJ" = (
/obj/structure/closet/crate/bin,
/turf/open/floor/carpet,
@@ -56601,6 +56644,24 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"lCR" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"lCY" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"lDW" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"lEn" = (
/obj/structure/window/reinforced{
dir = 1
@@ -56671,12 +56732,6 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"lJI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"lKL" = (
/obj/machinery/door/airlock/abandoned{
name = "Starboard Emergency Storage";
@@ -56711,6 +56766,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
+"lQy" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/space,
+/area/space/nearstation)
"lQQ" = (
/obj/machinery/door/poddoor/preopen{
id = "bridgespace";
@@ -56736,13 +56798,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"lRX" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"lTC" = (
/obj/item/shard,
/obj/effect/turf_decal/stripes/line{
@@ -56753,10 +56808,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"lUO" = (
-/obj/structure/sign/warning/radiation,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"lWy" = (
/turf/open/floor/plating,
/area/maintenance/department/science)
@@ -56778,28 +56829,11 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"lXb" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Gas to Mix"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"lXc" = (
/obj/structure/table,
/obj/item/clothing/head/beret,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"lXJ" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"mal" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -56840,10 +56874,32 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"mci" = (
-/obj/machinery/portable_atmospherics/canister/toxins,
+"mbD" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plating,
/area/engine/engineering)
+"mcf" = (
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
+"mdi" = (
+/obj/machinery/rnd/production/circuit_imprinter,
+/obj/machinery/camera{
+ c_tag = "Engineering Starboard Aft";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"mdL" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -56860,19 +56916,19 @@
/obj/machinery/status_display/evac,
/turf/closed/wall/r_wall,
/area/engine/supermatter)
-"mfC" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+"mfg" = (
+/obj/structure/window/reinforced{
+ dir = 8
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"mgz" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/turf/open/space,
+/area/space/nearstation)
+"mfx" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 10
},
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"mhl" = (
/obj/machinery/power/emitter,
/obj/machinery/light{
@@ -56880,39 +56936,14 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
-"mhn" = (
-/obj/machinery/door/firedoor,
-/obj/structure/sign/poster/random{
- pixel_x = 32
+"mlb" = (
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"miw" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Fore";
- dir = 1;
- network = list("ss13","engine")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"mjn" = (
-/obj/machinery/jukebox,
-/turf/open/floor/plasteel/dark,
-/area/crew_quarters/bar)
-"mjK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/turf/closed/wall/r_wall,
+/turf/open/floor/plating,
/area/engine/engineering)
"mlr" = (
/obj/structure/lattice,
@@ -56921,6 +56952,26 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"mlx" = (
+/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
+"mlS" = (
+/obj/machinery/door/airlock/engineering/glass/critical{
+ heat_proof = 1;
+ name = "Supermatter Chamber";
+ req_access_txt = "10"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/supermatter)
"mmv" = (
/obj/machinery/door/airlock/engineering{
name = "Engineering Supplies";
@@ -56968,19 +57019,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"mqp" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = -28
- },
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"msX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -57019,6 +57057,21 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"mvA" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"mvY" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 2;
+ name = "Gas to Filter"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/engine,
+/area/engine/supermatter)
"mwg" = (
/obj/structure/closet/crate{
icon_state = "crateopen"
@@ -57086,6 +57139,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/department/engine)
+"mAi" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"mCe" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -57094,6 +57153,27 @@
},
/turf/open/floor/plating,
/area/security/checkpoint/engineering)
+"mCP" = (
+/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
+"mCU" = (
+/obj/structure/table,
+/obj/item/stack/sheet/metal/fifty,
+/obj/item/stack/rods/fifty,
+/obj/item/clothing/glasses/welding,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"mDW" = (
/obj/machinery/power/smes{
charge = 5e+006
@@ -57101,16 +57181,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/tcommsat/computer)
-"mEu" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
"mES" = (
/obj/machinery/door/airlock/maintenance/abandoned{
name = "Surgical Room"
@@ -57140,6 +57210,10 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"mLc" = (
+/obj/structure/sign/warning/electricshock,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
"mLB" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -57179,6 +57253,16 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"mVj" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"mVM" = (
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -57191,6 +57275,20 @@
"mZE" = (
/turf/open/space/basic,
/area/space/nearstation)
+"mZK" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
+"mZV" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
"naq" = (
/obj/structure/disposaloutlet{
dir = 4
@@ -57200,14 +57298,14 @@
},
/turf/open/floor/engine,
/area/science/xenobiology)
-"ncm" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+"ndf" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Gas to Mix"
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/engine/engineering)
"ndI" = (
@@ -57252,10 +57350,37 @@
/obj/structure/lattice,
/turf/open/space,
/area/space/nearstation)
+"ngg" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"ngp" = (
/obj/item/chair/stool,
/turf/open/floor/carpet,
/area/maintenance/department/crew_quarters/dorms)
+"nhW" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"nif" = (
+/obj/structure/table/glass,
+/obj/item/book/manual/wiki/engineering_hacking{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/book/manual/wiki/engineering_construction,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"nih" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/costume,
@@ -57279,6 +57404,30 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"nkk" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/chair{
+ dir = 8;
+ name = "Defense"
+ },
+/obj/machinery/camera{
+ c_tag = "Atmospherics Starboard";
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"nku" = (
/obj/machinery/door/airlock/centcom{
name = "Crematorium";
@@ -57288,6 +57437,21 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
+"nnf" = (
+/obj/structure/rack,
+/obj/item/stack/packageWrap,
+/obj/item/hand_labeler,
+/obj/item/clothing/glasses/science,
+/obj/item/clothing/glasses/science,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/medical/chemistry)
"nnh" = (
/obj/structure/chair{
dir = 8
@@ -57309,13 +57473,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"nqu" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"nqV" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -57326,6 +57483,19 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"nqW" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"nsy" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -57355,14 +57525,6 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
-"nsJ" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"ntj" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -57399,6 +57561,10 @@
},
/turf/open/floor/plasteel/white/corner,
/area/hallway/primary/central)
+"nyN" = (
+/obj/machinery/power/supermatter_crystal/engine,
+/turf/open/floor/engine,
+/area/engine/supermatter)
"nyO" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-22"
@@ -57425,12 +57591,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"nAY" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/landmark/start/station_engineer,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"nBw" = (
/obj/machinery/computer/crew{
dir = 1
@@ -57503,6 +57663,15 @@
/obj/structure/table/reinforced,
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"nIq" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/camera{
+ c_tag = "Engineering Supermatter Fore";
+ dir = 4;
+ network = list("ss13","engine")
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"nIU" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -57526,6 +57695,17 @@
},
/turf/open/floor/engine,
/area/science/explab)
+"nKF" = (
+/obj/machinery/door/firedoor,
+/obj/structure/sign/poster/random{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"nLl" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -57561,6 +57741,17 @@
},
/turf/open/floor/plasteel,
/area/tcommsat/computer)
+"nNn" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"nNJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -57595,6 +57786,13 @@
/obj/item/chair,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"nPW" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 6
+ },
+/obj/machinery/meter,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
"nQc" = (
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
@@ -57605,13 +57803,9 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"nRM" = (
-/obj/structure/chair/stool,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/landmark/start/station_engineer,
-/turf/open/floor/plasteel,
+"nQf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/turf/closed/wall/r_wall,
/area/engine/engineering)
"nSj" = (
/obj/structure/grille/broken,
@@ -57625,16 +57819,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/lawoffice)
-"nTr" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"nUQ" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/engine,
-/area/engine/supermatter)
"nVU" = (
/obj/item/twohanded/spear,
/turf/open/floor/plating,
@@ -57647,6 +57831,13 @@
/obj/structure/table_frame/wood,
/turf/open/floor/wood,
/area/maintenance/department/engine)
+"nYe" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Mix to Engine"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"nYn" = (
/obj/structure/sign/warning/docking,
/obj/effect/spawner/structure/window/reinforced,
@@ -57673,6 +57864,23 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"obl" = (
+/obj/structure/sign/warning/radiation,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
+"obG" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/machinery/button/door{
+ id = "engsm";
+ name = "Radiation Shutters Control";
+ pixel_y = 24;
+ req_access_txt = "10"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"obP" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -57682,6 +57890,11 @@
initial_gas_mix = "o2=0.01;n2=0.01"
},
/area/maintenance/department/science)
+"ocy" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plating,
+/area/engine/engineering)
"oep" = (
/obj/structure/table/glass,
/obj/item/paper_bin,
@@ -57714,6 +57927,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"oge" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/turf/open/floor/plating,
+/area/engine/engineering)
"ohR" = (
/obj/item/chair,
/turf/open/floor/plating,
@@ -57728,6 +57945,18 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"ona" = (
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"onX" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -57785,6 +58014,12 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"oto" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"ous" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/button/door{
@@ -57807,6 +58042,14 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"ovE" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
"ovM" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
@@ -57832,11 +58075,17 @@
},
/turf/open/floor/plasteel/dark,
/area/chapel/office)
-"oxw" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+"oxt" = (
+/obj/structure/table/glass,
+/obj/item/book/manual/wiki/research_and_development,
+/obj/item/disk/tech_disk,
+/obj/item/disk/design_disk,
+/turf/open/floor/plasteel/dark,
+/area/science/lab)
+"oyE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
},
-/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/engine/engineering)
"oyF" = (
@@ -57864,6 +58113,19 @@
},
/turf/closed/wall/r_wall,
/area/science/xenobiology)
+"oBY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/meter,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"oCn" = (
/obj/structure/chair/office/dark{
dir = 1
@@ -57934,6 +58196,15 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"oFi" = (
+/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"oFo" = (
/obj/structure/closet/emcloset/anchored,
/obj/structure/sign/warning/vacuum/external{
@@ -57950,23 +58221,6 @@
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
-"oHa" = (
-/obj/machinery/power/emitter/anchored{
- dir = 8;
- state = 2
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"oJr" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"oKa" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -57982,18 +58236,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
-"oKv" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"oKJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"oLR" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -58100,6 +58342,12 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
+"oTD" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/obj/machinery/portable_atmospherics/canister/nitrogen,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/engine,
+/area/engine/engineering)
"oUa" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -58115,14 +58363,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"oWu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/holopad,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"oWw" = (
/obj/item/flashlight,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -58143,22 +58383,6 @@
},
/turf/open/floor/plasteel/white,
/area/security/execution/transfer)
-"oXq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Cooling Loop Bypass"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"oYj" = (
/obj/effect/turf_decal/loading_area{
dir = 4
@@ -58171,12 +58395,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"paU" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/open/floor/plating/airless,
-/area/engine/engineering)
"pbm" = (
/obj/machinery/door/airlock/external{
name = "Pod Docking Bay"
@@ -58212,6 +58430,19 @@
},
/turf/open/floor/plating,
/area/science/explab)
+"peb" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 8
+ },
+/obj/structure/window/plasma/reinforced{
+ dir = 4
+ },
+/obj/machinery/power/rad_collector/anchored,
+/turf/open/floor/engine,
+/area/engine/supermatter)
"pfz" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -58232,13 +58463,12 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"pgH" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"pga" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
},
-/turf/open/floor/engine,
-/area/engine/engineering)
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"phJ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -58260,13 +58490,6 @@
/obj/structure/piano,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
-"pmB" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"pnU" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
dir = 4;
@@ -58275,14 +58498,16 @@
},
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
-"poP" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+"ppi" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 29
+ },
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/space,
-/area/space/nearstation)
+/turf/open/floor/engine,
+/area/engine/engineering)
"pps" = (
/turf/closed/wall,
/area/engine/break_room)
@@ -58301,18 +58526,20 @@
},
/turf/open/floor/engine,
/area/engine/supermatter)
-"psd" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "Gas to Filter"
+"ptk" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
-/area/engine/supermatter)
-"puw" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
+/area/engine/engineering)
+"puO" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 10
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"pvK" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
@@ -58347,17 +58574,13 @@
},
/turf/open/space/basic,
/area/space/nearstation)
-"pxD" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+"pBs" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "chemistry_shutters";
- name = "chemistry shutters"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/medical/chemistry)
+/turf/open/floor/engine,
+/area/engine/engineering)
"pBD" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -58368,22 +58591,6 @@
/obj/machinery/shieldwallgen/xenobiologyaccess,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"pBJ" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 10
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
-"pCo" = (
-/obj/structure/reflector/single/anchored{
- dir = 6
- },
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"pDP" = (
/obj/machinery/vending/assist,
/obj/effect/turf_decal/tile/neutral{
@@ -58440,6 +58647,29 @@
},
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
+"pIk" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/engine,
+/area/engine/engineering)
+"pJx" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 6
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/engine,
+/area/engine/engineering)
"pKd" = (
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 2;
@@ -58499,6 +58729,12 @@
dir = 1
},
/area/hallway/secondary/exit/departure_lounge)
+"pPu" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"pQw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -58579,19 +58815,6 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/lawoffice)
-"pYh" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
-"pYw" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-03"
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = -24
- },
-/turf/open/floor/plasteel/dark,
-/area/science/lab)
"pYC" = (
/obj/structure/sign/warning{
pixel_y = -32
@@ -58606,12 +58829,25 @@
},
/turf/open/floor/plasteel/white,
/area/medical/virology)
+"qbm" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"qbp" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"qbV" = (
+/obj/structure/lattice,
+/turf/open/space,
+/area/space)
"qbZ" = (
/obj/structure/rack,
/obj/item/clothing/mask/gas,
@@ -58666,18 +58902,6 @@
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"qeY" = (
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
-"qhE" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"qjx" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/stripes/line,
@@ -58687,38 +58911,10 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
-"qkM" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"qnT" = (
/obj/machinery/iv_drip,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"qpd" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"qpS" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"qtA" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
@@ -58859,21 +59055,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plating,
/area/maintenance/department/science)
-"qLI" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty{
- layer = 4
- },
-/obj/item/stack/cable_coil,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"qMi" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/general/visible,
@@ -58910,10 +59091,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"qOS" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
+"qPh" = (
+/obj/structure/chair,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"qPB" = (
/obj/structure/chair/stool,
@@ -58922,22 +59103,8 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
-"qRl" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = 29
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"qTV" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -27
- },
-/obj/effect/turf_decal/tile/blue{
+"qUe" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plasteel,
@@ -58967,6 +59134,12 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"qWB" = (
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"qWG" = (
/obj/structure/closet/emcloset/anchored,
/turf/open/floor/plating,
@@ -59045,9 +59218,8 @@
/area/medical/sleeper)
"rax" = (
/obj/machinery/conveyor{
- icon_state = "conveyor_map";
dir = 1;
- id = "EngLoad"
+ id = "garbage"
},
/turf/open/floor/plating,
/area/maintenance/disposal)
@@ -59206,6 +59378,23 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
+"rwf" = (
+/obj/machinery/power/emitter/anchored{
+ dir = 8;
+ state = 2
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"rwt" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/engine,
+/area/engine/engineering)
"rxa" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -59240,6 +59429,13 @@
icon_state = "panelscorched"
},
/area/maintenance/department/engine)
+"rAZ" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 9
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"rBh" = (
/obj/structure/mopbucket,
/obj/item/mop,
@@ -59254,6 +59450,19 @@
/obj/item/reagent_containers/blood/random,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"rEt" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"rFq" = (
/obj/structure/chair,
/obj/item/reagent_containers/food/snacks/donkpocket,
@@ -59261,6 +59470,24 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
+"rGz" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
+"rHv" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Monastery Transit"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/hallway/secondary/entry)
"rHA" = (
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
@@ -59319,6 +59546,16 @@
/obj/item/ammo_casing/shotgun/improvised,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"rMt" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"rMV" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -59330,6 +59567,16 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"rPd" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = -27
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"rPg" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
dir = 8
@@ -59344,13 +59591,12 @@
/obj/item/trash/can,
/turf/open/floor/wood,
/area/maintenance/department/engine)
-"rTd" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+"rTZ" = (
+/obj/machinery/cryopod{
+ dir = 8
},
/turf/open/floor/plasteel,
-/area/engine/engineering)
+/area/crew_quarters/dorms)
"rWE" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -59377,6 +59623,14 @@
},
/turf/open/floor/plating,
/area/storage/emergency/starboard)
+"saW" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Monastery Transit"
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/hallway/secondary/entry)
"sbk" = (
/obj/structure/girder,
/turf/open/floor/plating,
@@ -59419,6 +59673,17 @@
},
/turf/open/space,
/area/space/nearstation)
+"sdZ" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"sfr" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
"sgc" = (
/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/tile/neutral{
@@ -59433,51 +59698,23 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
-"shH" = (
-/turf/closed/wall/r_wall,
-/area/space/nearstation)
+"sho" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white{
+ heat_capacity = 1e+006
+ },
+/area/hallway/secondary/entry)
"sij" = (
/obj/structure/closet,
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"sjC" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/machinery/power/port_gen/pacman,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"skw" = (
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/closed/wall,
/area/maintenance/department/security/brig)
-"slJ" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#d1dfff"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"smv" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Cooling Loop to Gas"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"spz" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
@@ -59523,12 +59760,6 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
-"svA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"svN" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/sign/departments/restroom{
@@ -59536,11 +59767,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
-"swg" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
"sww" = (
/obj/effect/decal/cleanable/blood/old,
/obj/item/reagent_containers/food/snacks/meat/slab/monkey,
@@ -59575,6 +59801,12 @@
},
/turf/open/floor/plating,
/area/security/execution/transfer)
+"sAF" = (
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/landmark/start/station_engineer,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"sAK" = (
/obj/item/clothing/mask/gas/plaguedoctor,
/turf/open/floor/plating,
@@ -59612,6 +59844,17 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"sHX" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Cooling Loop to Gas"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"sJp" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/effect/turf_decal/stripes/line,
@@ -59633,6 +59876,21 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"sKw" = (
+/obj/structure/table,
+/obj/item/stack/sheet/glass/fifty{
+ layer = 4
+ },
+/obj/item/stack/cable_coil,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"sNz" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -59646,6 +59904,12 @@
},
/turf/open/floor/plating,
/area/security/execution/transfer)
+"sOQ" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/space/basic,
+/area/space)
"sQt" = (
/obj/machinery/door/airlock/external{
name = "Supply Dock Airlock";
@@ -59656,6 +59920,37 @@
},
/turf/open/floor/plating,
/area/quartermaster/storage)
+"sQG" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 4
+ },
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
+"sQV" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/engine,
+/area/engine/engineering)
+"sRH" = (
+/obj/structure/lattice,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/space/nearstation)
+"sTg" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"sUP" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -59682,19 +59977,6 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
-"sWW" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"sXi" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -59709,16 +59991,6 @@
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
/area/science/xenobiology)
-"sYQ" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/firedoor,
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"sZh" = (
/obj/structure/closet/crate,
/turf/open/floor/plating,
@@ -59756,13 +60028,16 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"tbw" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
+"tcC" = (
+/obj/machinery/door/firedoor,
+/obj/structure/sign/poster/official/random{
+ pixel_x = -32
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"tcY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -59810,10 +60085,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"tdL" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/turf/closed/wall/r_wall,
-/area/engine/supermatter)
"tfw" = (
/obj/structure/cable{
icon_state = "0-2";
@@ -59859,17 +60130,6 @@
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
-"tkL" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/light{
- dir = 8;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"tlc" = (
/obj/machinery/recharger,
/obj/structure/table,
@@ -59888,12 +60148,14 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
-"tlV" = (
-/obj/structure/reflector/double/anchored{
- dir = 9
+"tmi" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/turf/open/space,
+/area/space/nearstation)
"tnY" = (
/obj/machinery/button/door{
id = "aux_base_shutters";
@@ -59915,15 +60177,13 @@
icon_state = "panelscorched"
},
/area/maintenance/department/security/brig)
-"tqO" = (
-/obj/structure/sign/poster/official/random{
- pixel_x = -32
- },
-/obj/effect/turf_decal/tile/blue{
+"tpX" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/light{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"tqX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -59935,6 +60195,13 @@
},
/turf/open/floor/plating,
/area/science/xenobiology)
+"ttX" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"tue" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -59991,14 +60258,19 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"tzH" = (
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "research_shutters_2";
- name = "research shutters"
+"tzh" = (
+/obj/structure/chair/office/dark{
+ dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/lab)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"tAv" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
+ },
+/turf/open/floor/plating/airless,
+/area/engine/engineering)
"tAK" = (
/obj/structure/table,
/obj/structure/window/reinforced{
@@ -60016,13 +60288,6 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"tDE" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Mix to Engine"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"tHk" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -60038,33 +60303,13 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
-"tJr" = (
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "research_shutters_2";
- name = "research shutters"
+"tMA" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+ dir = 5
},
-/turf/open/floor/plasteel,
-/area/science/lab)
-"tLP" = (
-/obj/machinery/status_display/supply,
-/turf/closed/wall,
-/area/quartermaster/warehouse)
-"tOD" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"tQT" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"tRc" = (
/obj/structure/ore_box,
/turf/open/floor/plating{
@@ -60097,6 +60342,11 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"uaa" = (
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
"uaC" = (
/obj/structure/chair/comfy/black{
dir = 8
@@ -60109,13 +60359,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"uaO" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 6
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space/basic,
-/area/space/nearstation)
"uaP" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -60129,14 +60372,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
/area/science/mixing)
-"udl" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/space,
-/area/space/nearstation)
"uek" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance{
@@ -60165,21 +60400,27 @@
icon_state = "panelscorched"
},
/area/maintenance/department/science)
-"ueX" = (
-/obj/structure/table/glass,
-/obj/item/book/manual/wiki/engineering_hacking{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/book/manual/wiki/engineering_construction,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"ufa" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"ufr" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"ufx" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "research_shutters_2";
+ name = "research shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/lab)
"ugC" = (
/obj/structure/chair/office/light{
icon_state = "officechair_white";
@@ -60212,16 +60453,6 @@
},
/turf/closed/wall,
/area/maintenance/department/engine)
-"ukp" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Gas"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"ulu" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk{
@@ -60284,13 +60515,12 @@
"uoS" = (
/turf/open/floor/plating,
/area/construction/mining/aux_base)
-"upc" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
+"upg" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 6
},
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"uqJ" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -60359,44 +60589,17 @@
},
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
+"uwT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"uwX" = (
/obj/machinery/field/generator,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"uxP" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/obj/structure/chair{
- dir = 8;
- name = "Defense"
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics Starboard";
- dir = 8
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
-"uzh" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/engineering/glass/critical{
- heat_proof = 1;
- name = "Supermatter Chamber";
- req_access_txt = "10"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/engine,
-/area/engine/supermatter)
"uzn" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/structure/cable{
@@ -60410,6 +60613,10 @@
},
/turf/open/floor/plasteel,
/area/tcommsat/computer)
+"uAL" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"uAU" = (
/obj/structure/table/wood,
/obj/item/folder/blue,
@@ -60431,6 +60638,11 @@
},
/turf/open/floor/engine,
/area/science/explab)
+"uBu" = (
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/department/chapel/monastery)
"uCS" = (
/obj/machinery/door/poddoor/shutters{
id = "aux_base_shutters";
@@ -60439,6 +60651,16 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"uDr" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
+"uER" = (
+/turf/closed/wall/r_wall,
+/area/space/nearstation)
"uHG" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -60451,12 +60673,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"uIB" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/junction{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/engineering)
"uLF" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -60493,6 +60709,12 @@
/obj/effect/turf_decal/plaque,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"uQa" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/supermatter)
"uQR" = (
/obj/item/ammo_casing/shotgun/beanbag,
/turf/open/floor/plating,
@@ -60532,6 +60754,14 @@
/obj/item/stamp/law,
/turf/open/floor/carpet,
/area/lawoffice)
+"uWe" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 2;
+ name = "External Gas to Loop"
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/engine,
+/area/engine/engineering)
"uXG" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -60554,12 +60784,28 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
+"uZs" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"vay" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"vbQ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
+"vdb" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"veM" = (
/obj/machinery/suit_storage_unit/rd,
/obj/machinery/light{
@@ -60577,6 +60823,15 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
+"vfn" = (
+/obj/structure/plasticflaps/opaque,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "research_shutters_2";
+ name = "research shutters"
+ },
+/turf/open/floor/plasteel,
+/area/science/lab)
"vgp" = (
/obj/machinery/door/firedoor,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -60594,6 +60849,14 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"vgX" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/space,
+/area/space/nearstation)
"vhk" = (
/obj/structure/chair,
/turf/open/floor/carpet,
@@ -60607,31 +60870,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"vli" = (
-/obj/structure/table,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/clothing/glasses/meson/engine,
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/obj/item/pipe_dispenser,
-/obj/machinery/light,
-/obj/effect/turf_decal/delivery,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
-"vlC" = (
-/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"vlF" = (
/obj/item/coin/silver,
/obj/effect/decal/cleanable/oil{
@@ -60666,20 +60904,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"voh" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
- dir = 5
- },
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
-"vor" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
"vpz" = (
/obj/structure/girder,
/turf/open/floor/plating{
@@ -60697,31 +60921,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
-"vsw" = (
-/obj/machinery/camera{
- c_tag = "Engineering Supermatter Starboard";
- dir = 8;
- network = list("ss13","engine")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
-"vsG" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- name = "Research Lab Maintenance";
- req_access_txt = "0";
- req_one_access_txt = "7;29"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"vsJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -60755,6 +60954,13 @@
/obj/item/clothing/mask/gas,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"vvr" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"vxp" = (
/obj/machinery/door/window/eastright{
base_state = "left";
@@ -60768,17 +60974,12 @@
/obj/item/assembly/mousetrap,
/turf/open/floor/engine,
/area/science/explab)
-"vxr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/light{
- dir = 4;
- light_color = "#e8eaff"
- },
-/obj/effect/turf_decal/stripes/line{
+"vyN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+/turf/closed/wall/r_wall,
+/area/crew_quarters/heads/hor)
"vzz" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -60789,15 +60990,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"vzA" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
"vzP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
@@ -60828,19 +61020,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"vBE" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/obj/machinery/light{
- dir = 1;
- light_color = "#d1dfff"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"vCC" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60866,16 +61045,36 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"vKq" = (
-/obj/machinery/door/firedoor,
-/obj/structure/sign/poster/official/random{
+"vIn" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 6
+ },
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
+"vIU" = (
+/obj/structure/transit_tube/horizontal,
+/obj/structure/sign/departments/holy{
pixel_x = -32
},
-/obj/effect/turf_decal/tile/blue{
+/turf/open/floor/plating,
+/area/hallway/secondary/entry)
+"vJS" = (
+/obj/structure/closet/radiation,
+/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
/turf/open/floor/plasteel,
-/area/hallway/primary/aft)
+/area/engine/engineering)
+"vMv" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/chapel/main/monastery)
"vMx" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -60885,6 +61084,19 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"vMH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
+"vMQ" = (
+/obj/structure/sign/warning/fire,
+/turf/closed/wall/r_wall,
+/area/engine/supermatter)
"vOw" = (
/obj/machinery/door/airlock/grunge{
name = "Library"
@@ -60899,6 +61111,13 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library)
+"vPU" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
"vRi" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -60967,16 +61186,20 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
-"vVO" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+"vYi" = (
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/turf/open/floor/engine,
-/area/engine/engineering)
+/obj/machinery/door/airlock/maintenance{
+ name = "Research Lab Maintenance";
+ req_access_txt = "0";
+ req_one_access_txt = "7;29"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"vYN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8;
@@ -60986,22 +61209,16 @@
},
/turf/open/floor/circuit/telecomms,
/area/science/xenobiology)
-"wbB" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 2;
- name = "External Gas to Loop"
+"waN" = (
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 3;
+ name = "3maintenance loot spawner"
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/engine,
-/area/engine/engineering)
-"wbF" = (
-/obj/machinery/rnd/production/circuit_imprinter,
-/obj/machinery/camera{
- c_tag = "Engineering Starboard Aft";
- dir = 8
+/obj/structure/rack,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
},
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+/area/maintenance/department/chapel/monastery)
"wcs" = (
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
@@ -61038,24 +61255,10 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
-"wfG" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/crew_quarters/heads/hor)
"wfO" = (
/mob/living/simple_animal/hostile/retaliate/poison/snake,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"wfP" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/machinery/meter,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"wig" = (
/obj/machinery/vending/cigarette,
/turf/open/floor/plating{
@@ -61070,22 +61273,14 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"wjm" = (
-/obj/structure/cable{
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/engine,
/area/engine/engineering)
"wkZ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
@@ -61114,6 +61309,27 @@
},
/turf/open/floor/plasteel/white,
/area/science/explab)
+"wlZ" = (
+/obj/machinery/light/small,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/department/chapel/monastery)
+"wmA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
+"wnw" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"wnJ" = (
/obj/structure/sign/warning,
/turf/closed/wall,
@@ -61147,6 +61363,17 @@
},
/turf/open/floor/wood,
/area/lawoffice)
+"wsx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"wun" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61174,6 +61401,9 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"wwK" = (
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"wxb" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -61221,15 +61451,21 @@
},
/turf/open/floor/plating,
/area/maintenance/department/crew_quarters/bar)
-"wDl" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"wDm" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"wDH" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "engsm";
+ name = "Radiation Chamber Shutters"
+ },
+/obj/item/tank/internals/plasma,
+/turf/open/floor/plating,
+/area/engine/supermatter)
"wDZ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -61257,18 +61493,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
-"wHI" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/engine/engineering)
-"wIo" = (
-/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space/nearstation)
"wIv" = (
/obj/machinery/power/apc/highcap/five_k{
dir = 8;
@@ -61303,12 +61527,6 @@
},
/turf/open/floor/plating,
/area/crew_quarters/heads/cmo)
-"wLK" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"wMF" = (
/obj/effect/spawner/lootdrop/three_course_meal,
/obj/effect/spawner/lootdrop/three_course_meal,
@@ -61324,10 +61542,6 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"wMX" = (
-/obj/effect/spawner/structure/window/plasma/reinforced,
-/turf/open/floor/plating,
-/area/engine/supermatter)
"wNq" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -61398,6 +61612,12 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"wSU" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/hallway/secondary/entry)
"wTD" = (
/obj/structure/table/wood,
/obj/item/folder/red,
@@ -61440,6 +61660,16 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"wXe" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/door/airlock/engineering/glass/critical{
+ heat_proof = 1;
+ name = "Supermatter Chamber";
+ req_access_txt = "10"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/engine,
+/area/engine/supermatter)
"wXu" = (
/obj/machinery/disposal/bin,
/obj/structure/window/reinforced{
@@ -61457,10 +61687,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
-"wYK" = (
-/obj/machinery/power/supermatter_crystal/engine,
-/turf/open/floor/engine,
-/area/engine/supermatter)
"xah" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -61508,18 +61734,15 @@
/obj/structure/sign/warning/vacuum/external,
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
-"xer" = (
-/obj/machinery/conveyor{
- dir = 2;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/maintenance/disposal)
"xeB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/lawoffice)
+"xgB" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/closed/wall/r_wall,
+/area/engine/engineering)
"xgG" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -61544,12 +61767,11 @@
dir = 1
},
/area/hallway/secondary/exit/departure_lounge)
-"xhI" = (
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
-/area/engine/engineering)
+"xiY" = (
+/obj/structure/lattice,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"xja" = (
/obj/machinery/light/small{
dir = 4
@@ -61597,10 +61819,34 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"xkf" = (
+/obj/effect/landmark/carpspawn,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"xkL" = (
+/obj/structure/table,
+/obj/item/clothing/suit/hooded/wintercoat/engineering,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"xlA" = (
/obj/machinery/door/airlock/maintenance/abandoned,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"xlY" = (
+/obj/effect/landmark/xeno_spawn,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/maintenance/department/chapel/monastery)
"xmp" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -61655,6 +61901,20 @@
/obj/item/broken_bottle,
/turf/open/floor/plating,
/area/maintenance/solars/port)
+"xuW" = (
+/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
+"xvK" = (
+/obj/structure/reflector/single/anchored{
+ dir = 6
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"xvO" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -61712,6 +61972,10 @@
icon_state = "panelscorched"
},
/area/maintenance/department/security/brig)
+"xyT" = (
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"xzp" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -61719,13 +61983,6 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
-"xzR" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"xCV" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -61779,6 +62036,7 @@
dir = 1;
light_color = "#ffc1c1"
},
+/obj/effect/landmark/start/lawyer,
/turf/open/floor/wood,
/area/lawoffice)
"xKc" = (
@@ -61809,13 +62067,6 @@
/obj/structure/disposalpipe/junction/flip,
/turf/open/space/basic,
/area/space/nearstation)
-"xNy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/engine/engineering)
"xOC" = (
/obj/machinery/door/airlock/external{
name = "Construction Zone";
@@ -61858,6 +62109,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"xVT" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"xWl" = (
/obj/item/pen,
/obj/item/paper_bin{
@@ -61869,6 +62126,10 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"xXh" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/department/chapel/monastery)
"ybX" = (
/obj/structure/table,
/obj/effect/spawner/lootdrop/maintenance,
@@ -61906,6 +62167,21 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"yjy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/engineering)
+"ykV" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"ymb" = (
/obj/machinery/camera{
c_tag = "Engineering Telecomms Access";
@@ -75967,7 +76243,7 @@ cfN
bOw
bOw
bOw
-bOw
+bQg
bOw
ccu
cbG
@@ -76224,7 +76500,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bUC
bOw
cbG
@@ -76476,12 +76752,12 @@ bOv
bNs
bNs
bWh
-bOw
-bOw
-bOw
-bOw
-bOw
-bOw
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
bOw
bOw
cbG
@@ -76732,7 +77008,7 @@ bQQ
bNs
bNs
bQe
-bOw
+bQg
bOw
bOw
bOw
@@ -76989,7 +77265,7 @@ bNs
bNs
bOw
bOw
-bOw
+bQg
bOw
bOw
bOw
@@ -77246,7 +77522,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bOw
@@ -77503,7 +77779,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bUC
@@ -77520,7 +77796,7 @@ ctL
cgg
cfE
cfE
-cfp
+cua
cfE
cuW
cfE
@@ -77759,8 +78035,8 @@ bOw
bOw
bOw
bOw
-bOw
-bOw
+bQg
+bQg
bOw
bWV
bWV
@@ -78016,7 +78292,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bWV
@@ -78273,7 +78549,7 @@ bOw
bQd
bOw
bQd
-bOw
+bQg
bQd
bWV
bWV
@@ -78530,7 +78806,7 @@ bOw
bQe
bOw
bOw
-bOw
+bQg
bQe
bWV
bXJ
@@ -78790,7 +79066,7 @@ bQf
bQf
bQf
bWW
-bXI
+vMv
bZn
bZn
bZn
@@ -79032,10 +79308,10 @@ bGG
bHL
bIW
bKc
-bOy
+cqI
bMt
bLn
-bOy
+cqI
bPo
bQg
bQg
@@ -79301,7 +79577,7 @@ bOw
bQe
bOw
bOw
-bOw
+bQg
bQe
bWV
bXJ
@@ -79558,7 +79834,7 @@ bOw
bQd
bOw
bQd
-bOw
+bQg
bWi
bWV
bWV
@@ -79785,7 +80061,7 @@ aaa
aaa
aaa
aaa
-aaa
+btK
aaa
aaa
aaa
@@ -79815,7 +80091,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bWV
@@ -80040,9 +80316,9 @@ aaa
aaa
aaa
aaa
-aZx
-aZx
-aZx
+iaZ
+bsl
+btL
aZx
aaa
aaa
@@ -80056,11 +80332,11 @@ aaa
aaa
aaa
aaa
-aaa
-bGI
+irs
+aqG
bGE
bKf
-bLn
+gvO
bMw
bNy
bNw
@@ -80072,7 +80348,7 @@ bOw
bSm
bOw
bOw
-bOw
+bQg
bOw
bOw
bWV
@@ -80297,9 +80573,9 @@ aaa
aaa
aaa
aaa
+iaZ
aZx
-baJ
-bon
+bcX
aZx
aaa
aaa
@@ -80312,12 +80588,12 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-bGI
+irs
+irs
+aqG
bGE
-bKg
-bLn
+bKf
+gvO
bMx
bNz
bHM
@@ -80329,7 +80605,7 @@ bOw
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bOw
@@ -80344,7 +80620,7 @@ ccJ
cdw
cel
ceM
-cfp
+cua
cfE
cfE
chn
@@ -80555,8 +80831,8 @@ aaa
jzz
aZx
jzz
-baK
-bon
+bsl
+btM
aZx
aaa
aaa
@@ -80568,17 +80844,17 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-bGI
-bHM
-bGE
+irs
+irs
+irs
+aqG
bGE
+jOX
+beT
bHM
bNA
bHM
-abI
+bSZ
bQi
bQR
bNs
@@ -80586,7 +80862,7 @@ bNs
bOw
bOw
bOw
-bOw
+bQg
bOw
bOw
bOw
@@ -80611,8 +80887,8 @@ cvc
cho
cvk
cdx
-cvc
-cvM
+euN
+csS
cfm
cwe
fWv
@@ -80818,23 +81094,23 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-bIY
-bIY
-bLs
-bMy
+mZE
+bVp
+bVp
+bVp
+bVp
+bVp
+gLn
+sTg
+gLn
+gLn
+eOA
+aZx
+llS
+kYR
+aZx
bNB
-bMy
+hRQ
abI
aby
abI
@@ -80843,15 +81119,15 @@ bNs
bNs
bNs
bOw
-bOw
-bOw
-bOw
-bOw
-bOw
-bOw
-bOw
-bOw
-bOw
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
bQg
cbR
bXJ
@@ -80869,7 +81145,7 @@ ciF
cuQ
cfm
cfm
-cfm
+fwo
cfm
cwe
ckp
@@ -81075,29 +81351,29 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aby
-aby
-aaa
-aaa
+bGI
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+llS
+sho
+aZx
amC
aaa
aht
aby
aby
abI
-bSn
-bSZ
+mfg
+sRH
cqS
bNs
bQe
@@ -81108,8 +81384,8 @@ bQg
bQg
bQg
bOw
-bOw
-ccL
+bQe
+bQg
bWV
csT
cen
@@ -81126,7 +81402,7 @@ chq
ciX
cfm
cfN
-cfN
+cwA
cfN
cwe
cwe
@@ -81332,21 +81608,21 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bGI
+aZx
+jkm
+tpX
+iHI
+iHI
+iHI
+tpX
+iHI
+hWa
+wwK
+wSU
+llS
+wmA
+aZx
amB
aht
aht
@@ -81355,7 +81631,7 @@ aaa
abI
abI
abI
-abI
+sRH
bNs
bNs
bNs
@@ -81366,7 +81642,7 @@ bXL
bNs
bOw
bOw
-bOw
+bQg
bWV
csU
bWV
@@ -81383,7 +81659,7 @@ chr
chL
cfm
cfN
-cfN
+xyT
cfN
cfN
cfN
@@ -81589,21 +81865,21 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bGI
+aZx
+oto
+wwK
+wwK
+wwK
+uAL
+vbQ
+vbQ
+vbQ
+vbQ
+vbQ
+vbQ
+pga
+aZx
amC
aaa
aht
@@ -81613,7 +81889,7 @@ aaa
aaa
abI
aaa
-aaa
+sOQ
bQR
bNs
bNs
@@ -81623,7 +81899,7 @@ bXM
bNs
bOw
bOw
-bOw
+bQg
bOw
ccM
cdD
@@ -81640,7 +81916,7 @@ chs
ciY
cfm
cfN
-cfN
+cwA
cfN
cfN
cfN
@@ -81846,21 +82122,21 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+bGI
+aZx
+oto
+wwK
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
+aZx
amB
aht
aht
@@ -81880,12 +82156,12 @@ bXN
bNs
bOw
bOw
-bOw
-bOw
-bOw
-bQe
-bOw
-bOw
+bQg
+bQg
+bQg
+bQg
+bQg
+bQg
cfL
cfm
cfm
@@ -81897,7 +82173,7 @@ cht
cfm
cfm
cfN
-cfN
+cwA
cfN
cfN
cfN
@@ -82103,21 +82379,21 @@ aZx
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aqG
+aZx
+oto
+wwK
+aZx
+irs
+irs
+irs
+irs
+irs
+irs
+irs
+irs
+irs
+irs
amD
aaa
aht
@@ -82140,10 +82416,10 @@ bOw
bUC
bOw
bOw
-bOw
+bQe
bOw
bUC
-cfM
+bQg
cfm
cgO
chu
@@ -82154,7 +82430,7 @@ chu
ciZ
cfm
cfN
-cfN
+cwA
cfN
cfN
cfN
@@ -82359,12 +82635,12 @@ bon
aZx
aaa
aaa
-btK
-aaa
-aaa
-aaa
-aaa
-aaa
+irs
+aqG
+aZx
+oto
+wwK
+aZx
bBV
bDf
bDf
@@ -82411,8 +82687,8 @@ cfm
cfm
cfm
cfN
-cfN
-cfN
+cwA
+cjm
cfN
cfN
cfN
@@ -82615,16 +82891,16 @@ bnp
bon
aZx
aZx
-bsl
-btL
aZx
-aaa
-aaa
-aaa
+aZx
+aZx
+aZx
+oto
+kvx
bAI
-bBW
+qbV
abI
-aaa
+irs
abI
aaa
bva
@@ -82650,11 +82926,11 @@ abI
ahi
bSZ
crO
-crO
-crO
-crO
-crO
-crO
+arF
+arF
+arF
+arF
+arF
crO
crO
crO
@@ -82668,8 +82944,8 @@ cfN
cfN
cfN
cfN
-cfN
-cfN
+wlZ
+cjm
cfN
cfN
aaa
@@ -82802,7 +83078,7 @@ aeU
afo
afG
aeU
-eSB
+gHy
agy
agL
agZ
@@ -82872,12 +83148,12 @@ bnp
baK
bbR
bbR
+bbR
+bbR
+bbR
aZx
-bcX
-aZx
-aYG
-aZx
-aYG
+rHv
+saW
bAJ
bBX
bBX
@@ -82925,9 +83201,9 @@ cfN
cfN
cfN
cfN
-cfN
-cfN
-aaa
+uaa
+cjm
+irs
aaa
aaa
aaa
@@ -83129,13 +83405,13 @@ bnq
baM
baK
baK
-bsl
-btM
+baK
+baK
+baK
aZx
-aYG
bxY
bzz
-bAK
+vIU
bBX
bDg
bEj
@@ -83169,23 +83445,23 @@ caZ
cbS
ccN
bIZ
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
+cjm
cfN
cfN
cfN
cfN
-aaa
-aaa
-aaa
-aaa
+uBu
+cjm
+cjm
+irs
aaa
aaa
aaa
@@ -83316,7 +83592,7 @@ lGp
aeU
afI
aeU
-jXF
+dUk
agy
agN
agY
@@ -83425,24 +83701,24 @@ bIZ
cba
cbT
bDi
-bIZ
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cQZ
+cwA
+cwA
+cwA
+cwA
+lqo
+cwA
+cwA
+cwA
+cwA
+uaa
+ovE
+uaa
+uBu
+xlY
+ezo
+cjm
+aht
aaa
aaa
aaa
@@ -83683,23 +83959,23 @@ cbb
bDi
ccO
bIZ
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cjm
+cjm
+xXh
+xXh
+cjm
+cjm
+cjm
+xXh
+xXh
+cjm
+cjm
+cjm
+cjm
+waN
+dzA
+cjm
+aht
aaa
aaa
aaa
@@ -83940,23 +84216,23 @@ bva
bNK
bva
bva
-aaa
-cFB
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+irs
+xkf
+dRs
+dRs
+aht
+aht
+mau
+fon
+fon
+aht
+aht
+aht
+cjm
+cjm
+cjm
+cjm
+aht
aaa
aaa
aaa
@@ -84209,11 +84485,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+dRs
+dRs
+irs
+irs
+xiY
aaa
aaa
aaa
@@ -88820,9 +89096,9 @@ eQN
tcY
cam
cam
-sjC
+cdI
bXk
-mci
+eVW
cbX
ceq
mhl
@@ -89077,7 +89353,7 @@ bpL
fQf
cbW
cbd
-cdI
+gaQ
cri
cbX
cbX
@@ -90615,9 +90891,9 @@ bXh
bXZ
bYK
bZz
-nAY
+sAF
cbd
-nRM
+fGt
cam
cdM
bXq
@@ -90627,8 +90903,8 @@ cfQ
bXk
qWG
bXk
-paU
-dSp
+tAv
+pPu
cdm
aaa
aht
@@ -90880,22 +91156,22 @@ qtO
bXk
bXk
bXk
-svA
-mjK
-mjK
-mjK
-wHI
-eyj
-eyj
+fbu
+nQf
+nQf
+nQf
+cgt
+oge
+oge
bXk
-shH
-shH
-shH
-shH
-shH
-shH
-shH
-shH
+uER
+uER
+uER
+uER
+uER
+uER
+uER
+uER
fon
fon
mau
@@ -91127,23 +91403,23 @@ bVH
bWr
bXj
qGZ
-bYQ
+bYM
bZD
caj
cbf
ccb
cah
cdO
-ioF
+jOw
ceX
-qOS
+ocy
cfS
fFv
-fmL
-gXZ
-kmd
-lXJ
-lXJ
+yjy
+nIq
+mAi
+abD
+abD
bXk
aaa
aht
@@ -91396,10 +91672,10 @@ mwG
nAs
cfT
wcs
-ggg
+upg
qbp
qbp
-gEo
+hUi
dMG
bXk
aaa
@@ -91643,14 +91919,14 @@ bXk
bYc
bYO
bZA
-xhI
+dlI
cbh
cbh
cbh
cbh
cbh
-hjD
-vor
+nNn
+mvA
cfU
tIS
iCs
@@ -91900,21 +92176,21 @@ bXk
bYd
bYP
bZF
-rTd
-wDl
-vxr
-irM
-irM
+uZs
+lDW
+wsx
+uwT
+uwT
qFu
cet
ulY
cfV
cgu
cgU
-izm
+kNK
chw
-eyj
-jzE
+oge
+eMz
bXk
bXk
bXk
@@ -92155,31 +92431,31 @@ bVK
bWu
bXk
bYe
-bYQ
+bYM
bZA
can
cbi
ccc
-eyj
+oge
cdR
-tQT
+vvr
bXk
bXk
-sWW
+oBY
cgv
-lXb
+ndf
cgv
uaP
cgv
-ukp
+ikm
cgV
cgv
cgv
-gQf
+gkN
bXk
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -92416,27 +92692,27 @@ bYR
bZA
can
cbj
-eyj
+oge
cbX
wcs
iyJ
cfa
-eyj
+oge
twv
-hoS
+pJx
sWj
dnS
-hSC
-jTU
-fZK
-pgH
-pgH
+rEt
+mZK
+nqW
+pBs
+pBs
uRk
ciG
bXk
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -92672,7 +92948,7 @@ bYf
bYS
bZA
can
-qpS
+eue
ccd
ccX
ccX
@@ -92680,20 +92956,20 @@ ceu
cbX
cfu
tlN
-ncm
+pIk
cCI
uoq
-hQy
+wDH
chA
meF
-oKv
-wbB
-xzR
+oTD
+uWe
+dHF
hQC
bXk
aht
fon
-shH
+uER
fon
aht
aaa
@@ -92894,7 +93170,7 @@ bmz
bnG
boN
bpW
-dHZ
+brk
bsK
buk
bvs
@@ -92930,27 +93206,27 @@ bYT
bZB
caq
cbk
-eyj
+oge
ccY
cdT
ccY
cbX
-eyj
-vlC
-iej
-qeY
+oge
+jQn
+sQV
+dFF
fyO
fyO
fyO
-qeY
-oKv
-wbB
-wfP
+dFF
+oTD
+uWe
+dGd
hQC
bXk
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -93186,28 +93462,28 @@ bYh
bYU
bZE
car
-mgz
-eyj
+sdZ
+oge
cbX
wcs
wcs
cfd
bXk
tlN
-ncm
-lUO
+pIk
+obl
mpd
-hKp
-hKp
+peb
+peb
cit
-qeY
-puw
-vBE
+dFF
+vMQ
+gih
hQC
bXk
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -93408,7 +93684,7 @@ bkh
bkh
boN
bpW
-brk
+dVt
bsM
bum
bvt
@@ -93449,22 +93725,22 @@ cda
wcs
wcs
wcs
-eyj
-eAH
-lnr
-qeY
-fBZ
-fBZ
-fBZ
+oge
+oFi
+wjm
+dFF
+uQa
+uQa
+uQa
cgY
ciI
-tdL
-dHr
+mZV
+obG
hQC
bXk
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -93645,7 +93921,7 @@ aSS
aUg
aVf
aWi
-mjn
+eyT
aYe
aZb
bag
@@ -93668,8 +93944,8 @@ bpV
brm
bsN
bun
-gGA
-bwW
+mcf
+nnf
byA
bAi
bpY
@@ -93698,30 +93974,30 @@ bWz
bVN
bYf
bYW
-oWu
+hDy
cam
-vli
+cxj
ckJ
cey
cdW
wcs
cdW
-eyj
-kTR
-mEu
-wMX
-dFJ
-wYK
-dFJ
-uzh
-nUQ
-fym
-hon
+oge
+vPU
+eux
+kDI
+fWE
+nyN
+fWE
+wXe
+iTE
+mlS
+jTc
hQC
bXk
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -93925,12 +94201,12 @@ bpY
bpY
bpY
bpY
-pxD
-jZG
+gGA
+bwW
bpY
bpY
bpY
-vsG
+vYi
bva
bva
bva
@@ -93957,28 +94233,28 @@ bUT
bYX
bZA
cam
-lfx
+xkL
bXk
-pCo
+xvK
wcs
wcs
-tlV
-eyj
-qkM
-miw
-qeY
+kBe
+oge
+mlx
+gUS
+dFF
prQ
prQ
prQ
-dgj
-psd
-fxC
+nPW
+mvY
+sfr
dZj
hQC
bXk
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -94178,17 +94454,17 @@ bls
aBI
aBI
bmB
-vKq
-nTr
-gDR
-vzA
+tcC
+qWB
+iHe
+qbm
bvu
-hIZ
-tqO
-mqp
-cKV
-iwe
-qTV
+wnw
+cep
+ePS
+nhW
+rGz
+rPd
xDj
blt
jCv
@@ -94211,31 +94487,31 @@ bVO
bWA
mCe
bYj
-bYQ
+bYM
bZA
cam
-mgz
-eyj
+sdZ
+oge
cbX
wcs
wcs
-dEy
+hxh
bXk
tlN
-ncm
-puw
+pIk
+vMQ
fyF
cZt
cZt
-fjD
-qeY
-iTF
-slJ
+hUf
+dFF
+mLc
+lmv
hQC
bXk
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -94443,11 +94719,11 @@ gkS
tTl
tTl
tTl
-koz
+qUe
dgg
phJ
phJ
-lJI
+lCY
bAk
bIt
bJB
@@ -94468,31 +94744,31 @@ bVP
bWB
mCe
bYk
-wjm
+bYQ
bZF
cbm
-mgz
-eyj
-oHa
-oHa
+sdZ
+oge
+rwf
+rwf
eWi
cbX
-eyj
-vlC
+oge
+jQn
cgx
-qeY
+dFF
fyO
fyO
fyO
-qeY
+dFF
cBS
cjt
-kaR
+mCP
hQC
bXk
aaa
fon
-shH
+uER
fon
aht
aaa
@@ -94692,19 +94968,19 @@ blu
aDZ
aDZ
bjm
-mhn
+nKF
cqi
cqi
cqi
cqi
cqi
-imE
-kYM
-mfC
+erV
+rMt
+ksC
fdQ
bmD
bmD
-eRp
+jrb
bAl
bIu
bJC
@@ -94728,28 +95004,28 @@ bYl
bYO
bZA
cam
-lrM
+lCR
ccd
-cAQ
-cAQ
-cLw
+mlb
+mlb
+mbD
cbX
cfu
jBn
-oxw
+ptk
meF
chA
chA
woh
cCI
cBS
-iLh
+rwt
liR
hQC
bXk
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -94952,18 +95228,18 @@ bKM
cCl
cCl
cCl
-tJr
-tzH
-tzH
+vfn
+ufx
+ufx
byD
bAm
dhz
-uxP
+nkk
bDA
bEQ
bGa
-bHp
-sYQ
+bHg
+mVj
bJD
bBo
bBo
@@ -94986,27 +95262,27 @@ bYY
bZA
cam
cbn
-eyj
+oge
cbX
wcs
cfP
cff
-eyj
+oge
cfX
-vVO
-iop
+kvu
+gHp
kWQ
-oXq
-qpd
-tkL
-tOD
-tOD
-ikO
+iSi
+ona
+kec
+ngg
+ngg
+cUT
hQC
bXk
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -95207,14 +95483,14 @@ bmC
cqi
boP
bqb
-pYw
+brp
gFo
cSK
duF
-bxa
+oxt
byE
bBp
-wfG
+vyN
bBp
bBp
bBp
@@ -95244,22 +95520,22 @@ bZG
cax
cbo
ccc
-eyj
+oge
cdR
-oJr
+uDr
bXq
bXq
cfY
-xNy
-smv
-xNy
-hGB
-hSt
+hrx
+sHX
+hrx
+hXm
+jjA
civ
civ
-vsw
-qRl
-oKJ
+jtv
+ppi
+oyE
bXk
aht
fon
@@ -95501,19 +95777,19 @@ bZF
cal
cbp
cci
-kTj
-kTj
-qhE
-loz
-frj
-lRX
-eyj
-uIB
-eyj
-eyj
-uIB
-eyj
-eyj
+dPZ
+dPZ
+vMH
+vJS
+vIn
+ttX
+oge
+dGp
+oge
+oge
+dGp
+oge
+oge
bXk
bXk
bXk
@@ -95753,24 +96029,24 @@ bVU
bWG
bXq
bYo
-hXK
+tzh
bZI
-hXK
+tzh
cbq
cbd
cam
cam
cam
-haA
-aKm
-upc
-wIo
-hyh
-upc
-voh
-pBJ
-wIo
-voh
+mCU
+cOA
+gfh
+vdb
+rAZ
+gfh
+tMA
+puO
+vdb
+tMA
cdm
aaa
aaa
@@ -96011,23 +96287,23 @@ bWH
bXk
bTE
bZc
-ueX
+nif
cCU
bZJ
-wbF
+mdi
cCV
ceb
-epV
-qLI
-aKm
-eiV
-upc
-dsz
-eiV
-eiV
-uaO
-voh
-eiV
+qPh
+sKw
+cOA
+sQG
+gfh
+eqM
+sQG
+sQG
+dhu
+tMA
+sQG
cdm
aaa
aaa
@@ -96267,29 +96543,29 @@ bJN
bJN
bJN
bJN
-frj
-pYh
-pYh
-pYh
-pYh
-pYh
-pYh
-pYh
-pYh
-hUw
-nqu
-nsJ
-gBb
-nsJ
-nsJ
-gBb
-nsJ
-nsJ
-dsz
+vIn
+xgB
+xgB
+xgB
+xgB
+xgB
+xgB
+xgB
+xgB
+fml
+mfx
+hJO
+dAa
+hJO
+hJO
+dAa
+hJO
+hJO
+eqM
aht
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -96524,7 +96800,7 @@ bVV
bWI
bXr
bKQ
-udl
+vgX
bZK
abI
abI
@@ -96533,20 +96809,20 @@ abI
aaa
aaa
aaa
-uaO
-wIo
-nsJ
-gBb
-nsJ
-nsJ
-gBb
-nsJ
-nsJ
-hyh
+dhu
+vdb
+hJO
+dAa
+hJO
+hJO
+dAa
+hJO
+hJO
+rAZ
aaa
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -96781,7 +97057,7 @@ bQI
bWJ
bXs
bJN
-cui
+lxh
bJP
bJP
bJP
@@ -96790,20 +97066,20 @@ bJP
abI
abI
aht
-pBJ
-wIo
-nsJ
-gBb
-nsJ
-nsJ
-gBb
-nsJ
-nsJ
-dsz
+puO
+vdb
+hJO
+dAa
+hJO
+hJO
+dAa
+hJO
+hJO
+eqM
aht
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -97018,7 +97294,7 @@ bCK
bDG
bEW
bAt
-bHg
+aIA
cqw
cqD
bKO
@@ -97038,7 +97314,7 @@ bMf
fuR
bXt
bYp
-eAZ
+jPC
bZL
caz
cbs
@@ -97047,20 +97323,20 @@ bJP
aaa
aaa
aaa
-uaO
-wIo
-nsJ
-gBb
-nsJ
-nsJ
-gBb
-nsJ
-nsJ
-hyh
+dhu
+vdb
+hJO
+dAa
+hJO
+hJO
+dAa
+hJO
+hJO
+rAZ
aaa
aaa
fon
-shH
+uER
fon
aaa
aaa
@@ -97295,7 +97571,7 @@ bVW
bWL
bXu
bLW
-cui
+lxh
bMi
caA
cbt
@@ -97304,20 +97580,20 @@ bJP
aaa
aaa
aaa
-pBJ
-swg
-hyh
-pBJ
-hyh
-pBJ
-hyh
-pBJ
-hyh
+puO
+xuW
+rAZ
+puO
+rAZ
+puO
+rAZ
+puO
+rAZ
cdm
aht
aht
fon
-shH
+uER
fon
aaa
aaa
@@ -97552,7 +97828,7 @@ bVX
bWM
bXv
bWc
-poP
+tmi
bZL
caB
cbs
@@ -97789,7 +98065,7 @@ bAt
bAt
bAu
bAu
-bHp
+bHg
cqx
bJJ
bKQ
@@ -97804,12 +98080,12 @@ bQI
bQI
bTM
bUs
-ljG
-hjk
-pmB
+cAp
+ykV
+ufr
bXw
-dJk
-tbw
+iSL
+lQy
bJP
bJP
bJP
@@ -98061,7 +98337,7 @@ bMf
bMf
bTN
bUt
-wLK
+flP
bOk
bWK
bXt
@@ -98317,8 +98593,8 @@ bRx
bQJ
bPQ
bTO
-ljG
-lhP
+cAp
+xVT
bOk
bWL
bXx
@@ -98332,21 +98608,21 @@ bJP
aaa
aaa
fon
-shH
-shH
-shH
-shH
-shH
-shH
-shH
-shH
-shH
-shH
+uER
+uER
+uER
+uER
+uER
+uER
+uER
+uER
+uER
+uER
fon
aaa
aht
-shH
-shH
+uER
+uER
fon
aaa
aaa
@@ -98574,7 +98850,7 @@ bPQ
bPQ
bPQ
bTP
-wLK
+flP
bVh
bVY
bWM
@@ -98602,7 +98878,7 @@ fon
fon
aaa
aht
-shH
+uER
fon
fon
aaa
@@ -98831,7 +99107,7 @@ bQK
bQK
bPQ
bTQ
-wLK
+flP
bKX
bOk
bWN
@@ -99088,7 +99364,7 @@ bRy
bSf
bSR
bTM
-wLK
+flP
bKX
bVZ
bWO
@@ -99272,13 +99548,13 @@ ale
asb
coe
apX
-aab
+ave
awn
apX
-aac
+ayj
azr
apX
-aae
+aBM
aDb
apX
oFo
@@ -99345,7 +99621,7 @@ bRz
bMf
bSS
bTR
-tDE
+nYe
bKX
bWa
bMf
@@ -99802,7 +100078,7 @@ aHn
aIi
aJi
aKe
-klb
+kVA
aMi
aNJ
fwl
@@ -100840,7 +101116,7 @@ lAs
eeQ
aUs
aLf
-eex
+lfZ
aLf
aLf
aUl
@@ -101105,7 +101381,7 @@ aTm
bbE
bbE
bbE
-dps
+bbE
bbE
bbE
aEj
@@ -101364,7 +101640,7 @@ bcA
bdF
beJ
bfB
-bbE
+gaJ
aZv
aUC
biz
@@ -102101,7 +102377,7 @@ apX
apX
avl
fIu
-epj
+rTZ
aIh
azA
dbi
@@ -102635,7 +102911,7 @@ aNP
aPb
aNO
aNP
-tLP
+cRJ
aTq
aSk
aTm
@@ -107513,7 +107789,7 @@ aaa
aaa
aLn
aNT
-xer
+rax
aQo
aPg
aRu
@@ -107771,7 +108047,7 @@ aaa
aLm
aLm
aNU
-aNV
+hCg
dqY
aRv
sZh
@@ -108027,8 +108303,8 @@ aaa
aaa
aLm
aME
-eFG
aNV
+hCg
dqY
aRw
sqQ
@@ -108284,8 +108560,8 @@ aaa
aaa
aLo
aMF
-aNV
-aNV
+aNW
+hCg
cvf
aQn
sqQ
@@ -108542,7 +108818,7 @@ aaa
aLo
aMG
aNX
-aNV
+hCg
rax
aRy
aSn
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index 7a591a48fa..3bdf64ac27 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -41,7 +41,7 @@
/area/engine/gravity_generator)
"am" = (
/obj/machinery/atmospherics/components/unary/tank/air,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"an" = (
/obj/structure/lattice/catwalk,
@@ -124,6 +124,8 @@
dir = 5
},
/obj/structure/cable,
+/obj/machinery/power/port_gen/pacman/super,
+/obj/item/stack/sheet/mineral/uranium,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"au" = (
@@ -351,7 +353,7 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"aY" = (
/obj/machinery/light{
@@ -431,7 +433,7 @@
icon_state = "1-2"
},
/obj/machinery/door/airlock,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -447,9 +449,9 @@
/turf/open/floor/plating,
/area/engine/atmos)
"bo" = (
-/obj/structure/table,
-/obj/item/screwdriver/power,
-/obj/item/wirecutters/power,
+/obj/structure/closet/secure_closet/atmospherics{
+ locked = 0
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"bp" = (
@@ -508,7 +510,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"by" = (
/turf/closed/wall/r_wall,
@@ -658,13 +660,13 @@
/obj/structure/cable{
icon_state = "0-2"
},
-/mob/living/carbon/human,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/mob/living/carbon/human,
/turf/open/floor/plasteel/white/corner{
dir = 1
},
@@ -673,20 +675,20 @@
/obj/machinery/light{
dir = 1
},
-/mob/living/carbon/human,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/mob/living/carbon/human,
/turf/open/floor/plasteel/white/corner{
dir = 1
},
/area/medical/medbay)
"bW" = (
/obj/machinery/camera/autoname,
-/mob/living/carbon/human,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
+/mob/living/carbon/human,
/turf/open/floor/plasteel/white/corner{
dir = 1
},
@@ -730,7 +732,7 @@
icon_state = "4-8"
},
/obj/machinery/door/airlock,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/bridge)
"ce" = (
/obj/structure/cable{
@@ -895,7 +897,7 @@
/area/medical/medbay)
"cz" = (
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/medical/medbay)
"cA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -1280,7 +1282,7 @@
/area/storage/primary)
"dH" = (
/obj/machinery/door/airlock,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/maintenance/department/bridge)
"dI" = (
/obj/effect/landmark/start,
@@ -1309,6 +1311,8 @@
/area/construction)
"dN" = (
/obj/structure/table,
+/obj/item/warpwhistle,
+/obj/item/voodoo,
/turf/open/floor/plasteel,
/area/storage/primary)
"dO" = (
@@ -1337,7 +1341,7 @@
"dS" = (
/obj/machinery/atmospherics/components/unary/tank/air,
/obj/machinery/camera/autoname,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"dT" = (
/obj/machinery/camera/autoname,
@@ -1429,7 +1433,7 @@
name = "Mining Dock Airlock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
"ef" = (
/obj/machinery/door/airlock,
@@ -1484,7 +1488,7 @@
name = "Arrival Airlock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ep" = (
/obj/structure/cable{
@@ -1543,7 +1547,7 @@
name = "Escape Pod One"
},
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ey" = (
/obj/machinery/status_display/supply,
@@ -1576,6 +1580,9 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"eC" = (
@@ -1659,6 +1666,9 @@
/area/storage/primary)
"eL" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"eM" = (
@@ -1800,6 +1810,9 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"fe" = (
@@ -1822,6 +1835,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
+/obj/item/export_scanner,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"ff" = (
@@ -1911,6 +1925,7 @@
/obj/machinery/computer/cargo/express{
dir = 4
},
+/obj/item/disk/cargo/bluespace_pod,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"fs" = (
@@ -1918,7 +1933,7 @@
name = "Transport Airlock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ft" = (
/obj/machinery/door/airlock,
@@ -1928,7 +1943,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/hallway/primary/central)
"fu" = (
/obj/structure/cable{
@@ -2135,7 +2150,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/storage/primary)
"fO" = (
/turf/open/floor/plasteel,
@@ -2236,12 +2251,6 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
-"fZ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/hallway/secondary/entry)
"ga" = (
/turf/closed/wall/r_wall,
/area/hallway/secondary/exit/departure_lounge)
@@ -2256,7 +2265,7 @@
name = "Auxiliary Airlock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"gd" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -2513,6 +2522,26 @@
/obj/item/paper/guides/jobs/security/labor_camp,
/turf/open/floor/plasteel,
/area/security/brig)
+"gM" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
+"gR" = (
+/obj/machinery/power/apc{
+ dir = 1;
+ pixel_y = 25
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
"gY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -2539,6 +2568,15 @@
},
/turf/open/floor/plasteel,
/area/science)
+"jt" = (
+/obj/machinery/smartfridge,
+/turf/open/floor/grass,
+/area/hydroponics)
+"jw" = (
+/obj/machinery/power/rtg/abductor,
+/obj/structure/cable,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"jE" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -2550,6 +2588,26 @@
/obj/item/melee/transforming/energy/axe,
/turf/open/floor/plasteel,
/area/storage/primary)
+"kf" = (
+/obj/machinery/vending/hydroseeds,
+/turf/open/floor/grass,
+/area/hydroponics)
+"kk" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space,
+/area/space/nearstation)
"kn" = (
/obj/machinery/light{
dir = 1
@@ -2559,6 +2617,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"kG" = (
+/obj/machinery/vending/hydronutrients,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/grass,
+/area/hydroponics)
"kQ" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
@@ -2575,6 +2641,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"kT" = (
+/obj/machinery/light,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"lg" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -2590,6 +2660,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"mI" = (
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/grass,
+/area/hydroponics)
+"nb" = (
+/obj/structure/filingcabinet/chestdrawer/wheeled,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
"ny" = (
/obj/structure/table,
/obj/item/storage/toolbox/syndicate,
@@ -2597,7 +2675,7 @@
/area/storage/primary)
"ou" = (
/obj/machinery/airalarm/directional/west,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"oV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -2610,12 +2688,20 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall/r_wall,
/area/science)
+"pF" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/reagentgrinder/constructed,
+/obj/structure/table/reinforced,
+/turf/open/floor/grass,
+/area/hydroponics)
"pI" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external/glass,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/medical/medbay)
"pQ" = (
/obj/structure/cable{
@@ -2625,7 +2711,7 @@
/area/medical/chemistry)
"qb" = (
/obj/machinery/door/airlock,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"qn" = (
/obj/structure/cable{
@@ -2633,11 +2719,55 @@
},
/turf/open/floor/plating,
/area/maintenance/department/bridge)
+"qZ" = (
+/obj/structure/lattice,
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/space,
+/area/space/nearstation)
+"rN" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
+"sD" = (
+/obj/effect/turf_decal/tile/blue,
+/obj/effect/turf_decal/tile/blue{
+ dir = 8
+ },
+/obj/structure/closet/secure_closet/warden{
+ locked = 0
+ },
+/turf/open/floor/plasteel,
+/area/bridge)
"sE" = (
/obj/machinery/power/rtg/advanced,
/obj/structure/cable,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"sN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"sP" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/drinks/beer/fullupgrade,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"up" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"ut" = (
/obj/structure/closet/secure_closet/atmospherics{
locked = 0
@@ -2645,15 +2775,40 @@
/obj/machinery/light{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"vm" = (
/turf/closed/wall/r_wall,
/area/maintenance/aft)
+"vs" = (
+/obj/machinery/door/airlock,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"vv" = (
/obj/machinery/door/airlock,
/turf/open/floor/plating,
/area/storage/primary)
+"vG" = (
+/obj/machinery/biogenerator,
+/turf/open/floor/grass,
+/area/hydroponics)
+"vH" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"vN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
"vP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -2676,6 +2831,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"wf" = (
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
"wS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -2685,6 +2844,48 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"wT" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"wX" = (
+/obj/structure/chair/stool/bar,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
+"xh" = (
+/obj/structure/closet/secure_closet/hydroponics,
+/turf/open/floor/grass,
+/area/hydroponics)
+"xj" = (
+/turf/open/floor/plasteel,
+/area/hydroponics)
+"yl" = (
+/obj/structure/chair/stool/bar,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
+"yt" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/bar)
+"yM" = (
+/obj/machinery/vending/wallmed,
+/turf/closed/wall/r_wall,
+/area/hallway/secondary/entry)
+"yO" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"zo" = (
/obj/machinery/power/apc/auto_name/south,
/obj/structure/cable{
@@ -2732,6 +2933,10 @@
"Ce" = (
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"Cr" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/cafeteria)
"Ct" = (
/obj/structure/closet/syndicate/resources/everything,
/turf/open/floor/plasteel,
@@ -2743,6 +2948,30 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"Dh" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/drinks/fullupgrade,
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"DH" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/hydroponics)
+"DJ" = (
+/obj/structure/kitchenspike,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
+"Em" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"EI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -2751,6 +2980,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/structure/closet/secure_closet/quartermaster{
+ locked = 0
+ },
/turf/open/floor/plasteel,
/area/bridge)
"ES" = (
@@ -2762,6 +2994,37 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"Fg" = (
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"Fy" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/grass,
+/area/hydroponics)
+"Ga" = (
+/obj/machinery/vending/boozeomat/all_access,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"Gc" = (
+/obj/structure/closet/secure_closet/miner/unlocked,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"Go" = (
+/obj/structure/closet/wardrobe/cargotech,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
+"Hn" = (
+/obj/structure/beebox,
+/obj/item/honey_frame,
+/obj/item/honey_frame,
+/obj/item/honey_frame,
+/obj/item/queen_bee/bought,
+/turf/open/floor/grass,
+/area/hydroponics)
"If" = (
/obj/machinery/rnd/production/techfab/department,
/turf/open/floor/plasteel,
@@ -2776,12 +3039,35 @@
},
/turf/open/floor/plasteel,
/area/bridge)
+"IB" = (
+/obj/structure/chair/stool/bar,
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
"JF" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
/turf/open/floor/plasteel,
/area/medical/chemistry)
+"JJ" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
+"JV" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"Kx" = (
/obj/structure/table,
/obj/item/analyzer,
@@ -2789,10 +3075,55 @@
/obj/machinery/light,
/turf/open/floor/plating,
/area/engine/atmos)
+"Lg" = (
+/obj/machinery/door/airlock/external{
+ name = "Labor Camp Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/security/brig)
+"Lo" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
"Ly" = (
/obj/machinery/chem_dispenser/chem_synthesizer,
/turf/open/floor/plasteel/dark,
/area/medical/chemistry)
+"Mk" = (
+/obj/structure/table,
+/obj/item/book_of_babel,
+/obj/item/book/granter/action/origami,
+/obj/item/book/granter/action/drink_fling,
+/turf/open/floor/plasteel,
+/area/storage/primary)
+"MH" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 1;
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
+"MQ" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
+"MS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/hydroponics)
"MY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
@@ -2800,6 +3131,27 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
+"Nw" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1
+ },
+/obj/machinery/power/apc{
+ dir = 1;
+ pixel_y = 25
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
+"NC" = (
+/turf/closed/wall/r_wall,
+/area/crew_quarters/cafeteria)
+"NL" = (
+/obj/structure/closet/secure_closet/freezer/kitchen/mining,
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"NZ" = (
/obj/machinery/rnd/production/protolathe/department,
/turf/open/floor/plasteel,
@@ -2808,16 +3160,26 @@
/obj/item/disk/tech_disk/debug,
/turf/open/floor/plasteel,
/area/science)
+"PD" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"PI" = (
/obj/structure/fans/tiny/invisible,
/turf/open/space/basic,
/area/space)
+"PV" = (
+/obj/machinery/vending/dinnerware,
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"Qt" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/obj/machinery/door/airlock/external/glass,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/medical/medbay)
"Rb" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -2830,6 +3192,9 @@
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"Si" = (
+/turf/open/floor/plasteel,
+/area/crew_quarters/bar)
"Sj" = (
/obj/structure/table/optable,
/obj/effect/turf_decal/tile/blue{
@@ -2837,9 +3202,37 @@
},
/turf/open/floor/plasteel/white/corner,
/area/medical/medbay)
+"Sv" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/plantgenes/seedvault,
+/turf/open/floor/grass,
+/area/hydroponics)
+"SC" = (
+/obj/structure/closet/secure_closet/freezer/meat,
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
+"SF" = (
+/obj/machinery/chem_dispenser/mutagensaltpeter,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/obj/item/reagent_containers/glass/beaker/bluespace,
+/turf/open/floor/grass,
+/area/hydroponics)
+"Tp" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/rtg/abductor,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"Tt" = (
/turf/open/floor/plating,
/area/maintenance/aft)
+"TZ" = (
+/turf/closed/wall/r_wall,
+/area/crew_quarters/bar)
"Ut" = (
/obj/structure/closet/secure_closet/medical3{
locked = 0
@@ -2911,7 +3304,7 @@
/obj/machinery/light{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"Yy" = (
/obj/machinery/light{
@@ -2924,10 +3317,26 @@
},
/turf/open/floor/plasteel,
/area/science)
+"YB" = (
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/cafeteria)
"ZD" = (
/obj/machinery/suit_storage_unit/ce,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"ZO" = (
+/turf/closed/wall/r_wall,
+/area/hydroponics)
+"ZR" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/turf/open/space/basic,
+/turf/open/floor/carpet/blackred,
+/area/crew_quarters/bar)
(1,1,1) = {"
aa
@@ -5368,13 +5777,13 @@ en
ek
eh
dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+DH
+DH
+DH
+DH
+DH
+DH
+ZO
aa
aa
aa
@@ -5460,13 +5869,13 @@ en
ek
eh
en
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+Hn
+mI
+mI
+mI
+mI
+xh
+DH
aa
aa
aa
@@ -5552,13 +5961,13 @@ en
ek
eh
dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+gR
+JJ
+xj
+xj
+xj
+xj
+DH
aa
aa
aa
@@ -5644,13 +6053,13 @@ dY
gC
eh
dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+pF
+MS
+vG
+SF
+xj
+kf
+DH
aa
aa
aa
@@ -5736,13 +6145,13 @@ en
ek
eh
dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+Sv
+MS
+Fy
+jt
+xj
+kG
+ZO
aa
aa
aa
@@ -5801,7 +6210,7 @@ di
bw
ag
bw
-di
+Lg
bw
ag
ag
@@ -5827,14 +6236,14 @@ dY
dY
ek
eh
-dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+yM
+vH
+sN
+Si
+Si
+Si
+kT
+TZ
aa
aa
aa
@@ -5920,13 +6329,13 @@ eh
ek
eh
dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+vH
+vN
+wf
+wf
+wf
+Si
+yt
aa
aa
aa
@@ -6009,16 +6418,16 @@ eL
eL
eL
eL
-fZ
-eh
-dY
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+fd
+eL
+vs
+JV
+ZR
+MQ
+Lo
+gM
+Si
+yt
aa
aa
aa
@@ -6104,13 +6513,13 @@ eh
eh
eh
ge
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+MH
+IB
+yl
+wX
+IB
+Si
+yt
aa
aa
aa
@@ -6196,13 +6605,13 @@ fI
dY
dY
ge
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+Ga
+Dh
+sP
+Em
+wT
+kT
+TZ
aa
aa
aa
@@ -6256,10 +6665,10 @@ aa
aa
ah
ut
-aw
+Fg
ou
-aw
-aw
+Fg
+Fg
Kx
ah
bs
@@ -6287,14 +6696,14 @@ cN
Tt
vm
fg
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+NC
+NC
+YB
+PD
+up
+YB
+YB
+NC
aa
aa
aa
@@ -6380,13 +6789,13 @@ Tt
vm
fg
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+NC
+Nw
+rN
+yO
+YB
+YB
+NC
aa
aa
aa
@@ -6472,13 +6881,13 @@ Tt
vm
fg
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+NC
+PV
+NL
+SC
+SC
+DJ
+NC
aa
aa
aa
@@ -6564,13 +6973,13 @@ Tt
vm
fg
aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
+NC
+NC
+Cr
+NC
+Cr
+NC
+NC
aa
aa
aa
@@ -7084,11 +7493,11 @@ aa
aa
ae
ab
-ab
-ab
-aB
-ab
-ab
+Tp
+qZ
+kk
+qZ
+jw
ab
bv
bJ
@@ -7175,13 +7584,13 @@ aa
aa
aa
ae
-ac
-ac
+ab
+ab
ab
aB
ab
-ac
-ac
+ab
+ab
bv
bK
cf
@@ -7277,7 +7686,7 @@ ac
bv
bL
cf
-cq
+sD
bv
cD
bE
@@ -8306,7 +8715,7 @@ dJ
dJ
dJ
dJ
-dN
+Mk
cS
gH
fO
@@ -8669,7 +9078,7 @@ cS
cS
cS
fN
-vv
+dG
cS
cS
cS
@@ -8764,9 +9173,9 @@ eZ
eu
fq
fr
-eu
-eu
-eu
+nb
+Go
+Gc
et
aa
aa
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index d796330cc8..f2e0599ae6 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -2248,11 +2248,6 @@
},
/turf/open/floor/plasteel,
/area/tdome/arena_source)
-"fR" = (
-/obj/item/paicard,
-/obj/structure/table/wood,
-/turf/open/floor/engine/cult,
-/area/wizard_station)
"fS" = (
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -2940,22 +2935,6 @@
/obj/machinery/capture_the_flag/red,
/turf/open/floor/circuit/green/anim,
/area/ctf)
-"hH" = (
-/obj/structure/table/reinforced,
-/obj/item/flashlight/seclite,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/paicard,
-/turf/open/floor/plasteel/dark,
-/area/centcom/ferry)
"hI" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -8415,6 +8394,9 @@
/turf/open/floor/plating,
/area/syndicate_mothership)
"tg" = (
+/obj/machinery/shower{
+ dir = 4
+ },
/obj/item/soap/syndie,
/turf/open/floor/plasteel/freezer,
/area/syndicate_mothership)
@@ -9858,7 +9840,7 @@
id = "XCCFerry";
name = "Hanger Bay Shutters";
pixel_y = 24;
- req_access_txt = "2"
+ req_access_txt = "101"
},
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -11391,6 +11373,22 @@
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/grimy,
/area/centcom/ferry)
+"AL" = (
+/obj/structure/table/reinforced,
+/obj/item/flashlight/seclite,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/paicard,
+/turf/open/floor/plasteel/dark,
+/area/centcom/ferry)
"AM" = (
/obj/machinery/shuttle_manipulator,
/turf/open/floor/circuit/green,
@@ -11587,6 +11585,11 @@
},
/turf/open/floor/plasteel/white,
/area/centcom/holding)
+"Bp" = (
+/obj/item/paicard,
+/obj/structure/table/wood,
+/turf/open/floor/engine/cult,
+/area/wizard_station)
"Bs" = (
/obj/structure/table/wood,
/obj/machinery/computer/libraryconsole/bookmanagement,
@@ -15122,7 +15125,7 @@
/obj/structure/table/wood,
/obj/item/book/manual/wiki/barman_recipes,
/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/reagent_containers/glass/rag,
+/obj/item/reagent_containers/rag,
/obj/machinery/newscaster{
pixel_y = -32
},
@@ -17434,6 +17437,8 @@
/obj/structure/mirror{
pixel_x = -28
},
+/obj/structure/table,
+/obj/item/reagent_containers/rag/towel/syndicate,
/turf/open/floor/plasteel/freezer,
/area/syndicate_mothership)
"Rm" = (
@@ -25742,7 +25747,7 @@ lI
lI
lI
Ax
-fR
+Bp
qZ
qZ
Ax
@@ -56338,7 +56343,7 @@ yr
sw
sw
Ad
-hH
+AL
Bx
sw
Cv
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index e35defd485..b2f05fd5f8 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -38,5 +38,5 @@
//Gangshit
#define NOT_DOMINATING -1
-#define MAX_LEADERS_GANG 3
+#define MAX_LEADERS_GANG 4
#define INITIAL_DOM_ATTEMPTS 3
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 2abe0db04e..da5981ff8a 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -12,7 +12,7 @@
#define ui_boxcraft "EAST-4:22,SOUTH+1:6"
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
-#define ui_boxvore "EAST-4:22,SOUTH+1:6"
+#define ui_boxvore "EAST-5:22,SOUTH+1:6"
//Filters
#define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, border=0, color="#04080F")
@@ -40,7 +40,7 @@
#define BALLS_SACK_SIZE_DEF 8
#define BALLS_SACK_SIZE_MAX 40
-#define CUM_RATE 5
+#define CUM_RATE 0.035
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1//amount of nutrition required per life()
@@ -115,22 +115,21 @@
//xenobio console upgrade stuff
#define XENOBIO_UPGRADE_MONKEYS 1
-#define XENOBIO_UPGRADE_SLIMEBASIC 2
+#define XENOBIO_UPGRADE_SLIMEBASIC 2
#define XENOBIO_UPGRADE_SLIMEADV 4
//stamina stuff
-#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
-#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
-#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
+#define STAMINA_SOFTCRIT 100 //softcrit for stamina damage. prevents standing up, prevents performing actions that cost stamina, etc, but doesn't force a rest or stop movement
+#define STAMINA_CRIT 140 //crit for stamina damage. forces a rest, and stops movement until stamina goes back to stamina softcrit
+#define STAMINA_SOFTCRIT_TRADITIONAL 0 //same as STAMINA_SOFTCRIT except for the more traditional health calculations
#define STAMINA_CRIT_TRADITIONAL -40 //ditto, but for STAMINA_CRIT
-#define MIN_MELEE_STAMCOST 1.25 //Minimum cost for swinging items around. Will be extra useful when stats and skills are introduced.
#define CRAWLUNDER_DELAY 30 //Delay for crawling under a standing mob
//Citadel toggles because bitflag memes
-#define MEDIHOUND_SLEEPER 1
-#define EATING_NOISES 2
-#define DIGESTION_NOISES 4
+#define MEDIHOUND_SLEEPER (1<<0)
+#define EATING_NOISES (1<<1)
+#define DIGESTION_NOISES (1<<2)
#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES)
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index de9c7af221..06c3c352ca 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -3,26 +3,35 @@
#define COLOR_INPUT_DISABLED "#F0F0F0"
#define COLOR_INPUT_ENABLED "#D3B5B5"
-//#define COLOR_WHITE "#EEEEEE"
-//#define COLOR_SILVER "#C0C0C0"
-//#define COLOR_GRAY "#808080"
+#define COLOR_DARKMODE_INFO_BUTTONS_BG "#40628A"
+#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#ce4242"
+#define COLOR_DARKMODE_BACKGROUND "#202020"
+#define COLOR_DARKMODE_DARKBACKGROUND "#171717"
+#define COLOR_DARKMODE_TEXT "#f0f0f0"
+
+#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90b3dd"
+#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#ef7f7f"
+#define COLOR_WHITEMODE_BACKGROUND "#ffffff"
+#define COLOR_WHITEMODE_DARKBACKGROUND "#eeeeee"
+#define COLOR_WHITEMODE_TEXT "#000000"
+
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
#define COLOR_ALMOST_BLACK "#333333"
-//#define COLOR_BLACK "#000000"
+#define COLOR_BLACK "#000000"
#define COLOR_RED "#FF0000"
-//#define COLOR_RED_LIGHT "#FF3333"
-//#define COLOR_MAROON "#800000"
+#define COLOR_RED_LIGHT "#FF3333"
+#define COLOR_MAROON "#800000"
#define COLOR_YELLOW "#FFFF00"
-//#define COLOR_OLIVE "#808000"
-//#define COLOR_LIME "#32CD32"
+#define COLOR_OLIVE "#808000"
+#define COLOR_LIME "#32CD32"
#define COLOR_GREEN "#008000"
#define COLOR_CYAN "#00FFFF"
-//#define COLOR_TEAL "#008080"
+#define COLOR_TEAL "#008080"
#define COLOR_BLUE "#0000FF"
-//#define COLOR_BLUE_LIGHT "#33CCFF"
-//#define COLOR_NAVY "#000080"
+#define COLOR_BLUE_LIGHT "#33CCFF"
+#define COLOR_NAVY "#000080"
#define COLOR_PINK "#FFC0CB"
-//#define COLOR_MAGENTA "#FF00FF"
+#define COLOR_MAGENTA "#FF00FF"
#define COLOR_PURPLE "#800080"
#define COLOR_ORANGE "#FF9900"
#define COLOR_BEIGE "#CEB689"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 7cab82149d..e31d2a278e 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -183,4 +183,16 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BODY_ZONE_PRECISE_R_FOOT "r_foot"
//We will round to this value in damage calculations.
-#define DAMAGE_PRECISION 0.1
\ No newline at end of file
+#define DAMAGE_PRECISION 0.1
+
+//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25)
+#define TOTAL_MASS_TINY_ITEM 1.25
+#define TOTAL_MASS_SMALL_ITEM 2.5
+#define TOTAL_MASS_NORMAL_ITEM 3.75
+#define TOTAL_MASS_BULKY_ITEM 5
+#define TOTAL_MASS_HUGE_ITEM 6.25
+#define TOTAL_MASS_GIGANTIC_ITEM 7.5
+
+#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway.
+#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds.
+#define TOTAL_MASS_TOY_SWORD 1.5
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index b04853e576..40aea24105 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -73,6 +73,8 @@
#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMPONENT_BLOCK_REACH 1
#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
+#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin)
+ #define COMPONENT_BLOCK_TELEPORT 1
/////////////////
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user)
diff --git a/code/__DEFINES/donator_groupings.dm b/code/__DEFINES/donator_groupings.dm
new file mode 100644
index 0000000000..4b210609f2
--- /dev/null
+++ b/code/__DEFINES/donator_groupings.dm
@@ -0,0 +1,18 @@
+#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators
+
+#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators
+#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators
+#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators
+
+#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH)
+#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH)
+#define TIER_3_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_3_CONFIG_SUBPATH)
+
+//flags
+#define DONATOR_GROUP_TIER_1 "T1"
+#define DONATOR_GROUP_TIER_2 "T2"
+#define DONATOR_GROUP_TIER_3 "T3"
+
+#define IS_CKEY_DONATOR_GROUP(ckey, groupid) is_donator_group(ckey, groupid)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 2fe70961f8..d64fa30047 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -7,7 +7,7 @@
//for convenience
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
-#define CHECK_BITFIELD(variable, flag) (variable & flag)
+#define CHECK_BITFIELD(variable, flag) (variable & (flag))
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 03cfde802f..24d381d1a8 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -28,6 +28,7 @@
#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets.
#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets.
#define ITEM_SLOT_NECK (1<<13)
+#define ITEM_SLOT_SUITSTORE (1<<14)
//SLOTS
#define SLOT_BACK 1
@@ -52,6 +53,7 @@
#define SLOT_LEGCUFFED 19
#define SLOT_GENERC_DEXTROUS_STORAGE 20
+
#define SLOTS_AMT 20 // Keep this up to date!
//I hate that this has to exist
@@ -84,6 +86,8 @@
. = ITEM_SLOT_ICLOTHING
if(SLOT_L_STORE, SLOT_R_STORE)
. = ITEM_SLOT_POCKET
+ if(SLOT_S_STORE)
+ . = ITEM_SLOT_SUITSTORE
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
@@ -230,3 +234,6 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list(
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman,
/obj/item/toy)))
+
+//Internals checker
+#define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask)
diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm
new file mode 100644
index 0000000000..cb4a433211
--- /dev/null
+++ b/code/__DEFINES/melee.dm
@@ -0,0 +1,10 @@
+//Martial arts defines
+
+#define MARTIALART_BOXING "boxing"
+#define MARTIALART_WRESTLING "wrestling"
+#define MARTIALART_SLEEPINGCARP "sleeping carp"
+#define MARTIALART_PSYCHOBRAWL "psychotic brawling"
+#define MARTIALART_MUSHPUNCH "mushroom punch"
+#define MARTIALART_KRAVMAGA "krav maga"
+#define MARTIALART_CQC "CQC"
+#define MARTIALART_PLASMAFIST "plasma fist"
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 30a7694e5f..c71780e7e9 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -57,7 +57,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define MARKING_LAYER 27 //Matrixed body markings because clashing with snouts?
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
-#define GENITALS_ADJ_LAYER 25
+#define GENITALS_FRONT_LAYER 25 //Draws some genitalia above clothes and the TAUR body if need be.
#define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup)
#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
#define DAMAGE_LAYER 22 //damage indicators (cuts and burns)
@@ -69,7 +69,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define EARS_LAYER 17
#define BODY_TAUR_LAYER 16
#define SUIT_LAYER 15
-#define GENITALS_FRONT_LAYER 14 //Draws some genitalia above clothes and the TAUR body if need be.
#define GLASSES_LAYER 13
#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 11
@@ -83,7 +82,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire
-#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
+#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
//Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above"
@@ -275,10 +274,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi',
PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi'))
-//Color Defines
-#define OOC_COLOR "#002eb8"
-#define AOOC_COLOR "#b8002e"
-
/////////////////////////////////////
// atom.appearence_flags shortcuts //
/////////////////////////////////////
@@ -459,6 +454,13 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define SUMMON_GUNS "guns"
#define SUMMON_MAGIC "magic"
+#define TELEPORT_CHANNEL_BLUESPACE "bluespace" //Classic bluespace teleportation, requires a sender but no receiver
+#define TELEPORT_CHANNEL_QUANTUM "quantum" //Quantum-based teleportation, requires both sender and receiver, but is free from normal disruption
+#define TELEPORT_CHANNEL_WORMHOLE "wormhole" //Wormhole teleportation, is not disrupted by bluespace fluctuations but tends to be very random or unsafe
+#define TELEPORT_CHANNEL_MAGIC "magic" //Magic teleportation, does whatever it wants (unless there's antimagic)
+#define TELEPORT_CHANNEL_CULT "cult" //Cult teleportation, does whatever it wants (unless there's holiness)
+#define TELEPORT_CHANNEL_FREE "free" //Anything else
+
//Run the world with this parameter to enable a single run though of the game setup and tear down process with unit tests in between
#define TEST_RUN_PARAMETER "test-run"
//Force the log directory to be something specific in the data/logs folder
@@ -493,4 +495,4 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define PREF_SAVELOAD_COOLDOWN 5
#define VOMIT_TOXIC 1
-#define VOMIT_PURPLE 2
\ No newline at end of file
+#define VOMIT_PURPLE 2
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 1c3832001f..01d95d7ff9 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -26,14 +26,15 @@
#define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff
#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
+#define NO_UNIFORM_REQUIRED (1<<11) // Can be worn on certain slots (currently belt and id) that would otherwise require an uniform.
// Flags for the clothing_flags var on /obj/item/clothing
#define LAVAPROTECT (1<<0)
#define STOPSPRESSUREDAMAGE (1<<1) //SUIT and HEAD items which stop pressure damage. To stop you taking all pressure damage you must have both a suit and head item with this flag.
#define BLOCK_GAS_SMOKE_EFFECT (1<<2) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
-#define MASKINTERNALS (1<<3) // mask allows internals
+#define ALLOWINTERNALS (1<<3) // mask allows internals
#define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc
#define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled.
-#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off.
\ No newline at end of file
+#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off.
diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm
index 897d107939..928f364a81 100644
--- a/code/__DEFINES/radio.dm
+++ b/code/__DEFINES/radio.dm
@@ -1,5 +1,55 @@
// Radios use a large variety of predefined frequencies.
+//say based modes like binary are in living/say.dm
+
+#define RADIO_CHANNEL_COMMON "Common"
+#define RADIO_KEY_COMMON ";"
+
+#define RADIO_CHANNEL_SECURITY "Security"
+#define RADIO_KEY_SECURITY "s"
+#define RADIO_TOKEN_SECURITY ":s"
+
+#define RADIO_CHANNEL_ENGINEERING "Engineering"
+#define RADIO_KEY_ENGINEERING "e"
+#define RADIO_TOKEN_ENGINEERING ":e"
+
+#define RADIO_CHANNEL_COMMAND "Command"
+#define RADIO_KEY_COMMAND "c"
+#define RADIO_TOKEN_COMMAND ":c"
+
+#define RADIO_CHANNEL_SCIENCE "Science"
+#define RADIO_KEY_SCIENCE "n"
+#define RADIO_TOKEN_SCIENCE ":n"
+
+#define RADIO_CHANNEL_MEDICAL "Medical"
+#define RADIO_KEY_MEDICAL "m"
+#define RADIO_TOKEN_MEDICAL ":m"
+
+#define RADIO_CHANNEL_SUPPLY "Supply"
+#define RADIO_KEY_SUPPLY "u"
+#define RADIO_TOKEN_SUPPLY ":u"
+
+#define RADIO_CHANNEL_SERVICE "Service"
+#define RADIO_KEY_SERVICE "v"
+#define RADIO_TOKEN_SERVICE ":v"
+
+#define RADIO_CHANNEL_AI_PRIVATE "AI Private"
+#define RADIO_KEY_AI_PRIVATE "o"
+#define RADIO_TOKEN_AI_PRIVATE ":o"
+
+
+#define RADIO_CHANNEL_SYNDICATE "Syndicate"
+#define RADIO_KEY_SYNDICATE "t"
+#define RADIO_TOKEN_SYNDICATE ":t"
+
+#define RADIO_CHANNEL_CENTCOM "CentCom"
+#define RADIO_KEY_CENTCOM "y"
+#define RADIO_TOKEN_CENTCOM ":y"
+
+#define RADIO_CHANNEL_CTF_RED "Red Team"
+#define RADIO_CHANNEL_CTF_BLUE "Blue Team"
+
+
#define MIN_FREE_FREQ 1201 // -------------------------------------------------
// Frequencies are always odd numbers and range from 1201 to 1599.
diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm
index 1c36120a0c..7cebc37d94 100644
--- a/code/__DEFINES/reactions.dm
+++ b/code/__DEFINES/reactions.dm
@@ -25,7 +25,8 @@
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
//Research point amounts
#define NOBLIUM_RESEARCH_AMOUNT 1000
-#define BZ_RESEARCH_AMOUNT 150
+#define BZ_RESEARCH_SCALE 4
+#define BZ_RESEARCH_MAX_AMOUNT 400
#define MIASMA_RESEARCH_AMOUNT 160
#define STIMULUM_RESEARCH_AMOUNT 50
//Plasma fusion properties
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 82fbfdb848..e655408db1 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -6,17 +6,43 @@
//Message modes. Each one defines a radio channel, more or less.
#define MODE_HEADSET "headset"
#define MODE_ROBOT "robot"
+
#define MODE_R_HAND "right hand"
+#define MODE_KEY_R_HAND "r"
+
#define MODE_L_HAND "left hand"
+#define MODE_KEY_L_HAND "l"
+
#define MODE_INTERCOM "intercom"
+#define MODE_KEY_INTERCOM "i"
+
#define MODE_BINARY "binary"
+#define MODE_KEY_BINARY "b"
+#define MODE_TOKEN_BINARY ":b"
+
#define MODE_WHISPER "whisper"
#define MODE_WHISPER_CRIT "whispercrit"
+
#define MODE_DEPARTMENT "department"
+#define MODE_KEY_DEPARTMENT "h"
+#define MODE_TOKEN_DEPARTMENT ":h"
+
+#define MODE_ADMIN "admin"
+#define MODE_KEY_ADMIN "p"
+
+#define MODE_DEADMIN "deadmin"
+#define MODE_KEY_DEADMIN "d"
+
#define MODE_ALIEN "alientalk"
#define MODE_HOLOPAD "holopad"
+
#define MODE_CHANGELING "changeling"
+#define MODE_KEY_CHANGELING "g"
+#define MODE_TOKEN_CHANGELING ":g"
+
#define MODE_VOCALCORDS "cords"
+#define MODE_KEY_VOCALCORDS "x"
+
#define MODE_MONKEY "monkeyhive"
//Spans. Robot speech, italics, etc. Applied in compose_message().
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 19d0540e0e..3394fba90c 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -93,6 +93,7 @@
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
#define FIRE_PRIORITY_VIS 10
+#define FIRE_PRIORITY_VORE 10
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index dc2ff8832f..ed0007135d 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -130,6 +130,7 @@
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
#define TRAIT_NIGHT_VISION "night_vision"
#define TRAIT_LIGHT_STEP "light_step"
+#define TRAIT_SILENT_STEP "silent_step"
#define TRAIT_SPEEDY_STEP "speedy_step"
#define TRAIT_SPIRITUAL "spiritual"
#define TRAIT_VORACIOUS "voracious"
diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm
new file mode 100644
index 0000000000..bdff20553a
--- /dev/null
+++ b/code/__HELPERS/donator_groupings.dm
@@ -0,0 +1,25 @@
+/*
+Current specifications:
+
+Donator groups in __DEFINES/donator_groupings.dm, config entries in controllers/configuration/entries/donator.dm
+
+3 groups, Tier 1/2/3
+Each tier includes the one before it (ascending)
+For fast lookups, this is generated using regenerate_donator_grouping_list()
+
+*/
+
+/proc/is_donator_group(ckey, group)
+ ckey = ckey(ckey) //make sure it's ckey'd.
+ var/list/L = GLOB.donators_by_group[group]
+ return L && L.Find(ckey)
+
+/proc/regenerate_donator_grouping_list()
+ GLOB.donators_by_group = list() //reinit everything
+ var/list/donator_list = GLOB.donators_by_group //cache
+ var/list/tier_1 = TIER_1_DONATORS
+ donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
+ var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
+ donator_list[DONATOR_GROUP_TIER_2] = tier_2
+ var/list/tier_3 = tier_2 + TIER_3_DONATORS
+ donator_list[DONATOR_GROUP_TIER_3] = tier_3
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 5ec839130a..7ec99fa885 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -189,6 +189,7 @@
"breasts_size" = pick(GLOB.breasts_size_list),
"breasts_shape" = "Pair",
"breasts_fluid" = "milk",
+ "breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
"vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index cdd2e99dd8..55d9e7a6cd 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -281,6 +281,17 @@
var/statspage = CONFIG_GET(string/roundstatsurl)
var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id
parts += "[GLOB.TAB]Round ID: [info]"
+
+ var/list/voting_results = SSvote.stored_gamemode_votes
+
+ if(length(voting_results))
+ parts += "[GLOB.TAB]Voting: "
+ var/total_score = 0
+ for(var/choice in voting_results)
+ var/score = voting_results[choice]
+ total_score += score
+ parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]"
+
parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]"
parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]"
var/total_players = GLOB.joined_player_list.len
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 7e078184b7..3c8d62ce3a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1487,6 +1487,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/grown/nettle, // base type
/obj/item/reagent_containers/food/snacks/deepfryholder,
/obj/item/reagent_containers/food/snacks/grown/shell,
+ /obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/store/bread
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index bb9fc98b8e..3b32745b5c 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(bitfields, list(
"LAVAPROTECT" = LAVAPROTECT,
"STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE,
"BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT,
- "MASKINTERNALS" = MASKINTERNALS,
+ "ALLOWINTERNALS" = ALLOWINTERNALS,
"NOSLIP" = NOSLIP,
"THICKMATERIAL" = THICKMATERIAL,
"VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE,
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 82ccd439ee..d09368d7b7 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -100,6 +100,11 @@ GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_
#define DDUFFELBAG "Department Duffel Bag"
GLOBAL_LIST_INIT(backbaglist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK, GSATCHEL, GDUFFELBAG, LSATCHEL))
+//Suit/Skirt
+#define PREF_SUIT "Jumpsuit"
+#define PREF_SKIRT "Jumpskirt"
+GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT))
+
//Uplink spawn loc
#define UPLINK_PDA "PDA"
#define UPLINK_RADIO "Radio"
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 4c9815af1c..c25ebf5b0a 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/paper/crumpled = 1,
/obj/item/pen = 1,
/obj/item/reagent_containers/spray/pestspray = 1,
- /obj/item/reagent_containers/glass/rag = 3,
+ /obj/item/reagent_containers/rag = 3,
/obj/item/stock_parts/cell = 3,
/obj/item/storage/belt/utility = 2,
/obj/item/storage/box = 2,
@@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/storage/toolbox/artistic = 2,
/obj/item/toy/eightball = 1,
/obj/item/reagent_containers/pill/floorpill = 1,
- /obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 1,
+ /obj/item/reagent_containers/food/snacks/cannedpeaches/maint = 2,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
/obj/item/storage/pill_bottle/penis_enlargement = 2,
/obj/item/storage/pill_bottle/breast_enlargement = 2,
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
new file mode 100644
index 0000000000..1dcde53a72
--- /dev/null
+++ b/code/_globalvars/lists/misc.dm
@@ -0,0 +1 @@
+GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 22210bfd08..5f0e7c9b22 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -67,7 +67,7 @@
/mob/proc/ClickOn( atom/A, params )
if(world.time <= next_click)
return
- next_click = world.time + 1
+ next_click = world.time + world.tick_lag
if(check_click_intercept(params,A))
return
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index a987f70d7b..ae36b4abb4 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -79,6 +79,7 @@
#define ui_drop_throw "EAST-1:28,SOUTH+1:7"
#define ui_pull_resist "EAST-2:26,SOUTH+1:7"
#define ui_movi "EAST-2:26,SOUTH:5"
+#define ui_sprintbufferloc "EAST-2:26,SOUTH:18"
#define ui_acti "EAST-3:24,SOUTH:5"
#define ui_zonesel "EAST-1:28,SOUTH:5"
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 01e118aaed..7f2fca9d98 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -134,6 +134,13 @@
static_inventory += using
//END OF CITADEL CHANGES
+ //same as above but buffer.
+ using = new /obj/screen/sprint_buffer
+ using.screen_loc = ui_sprintbufferloc
+ sprint_buffer = using
+ static_inventory += using
+
+
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 5ee4ae0f8a..4c666d708c 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -290,16 +290,19 @@
icon_state = "internal0"
else
if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(!istype(C.wear_mask, /obj/item/clothing/mask))
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(C))
+ if(istype(check, /obj/item/clothing/mask))
+ var/obj/item/clothing/mask/M = check
+ if(M.mask_adjusted)
+ M.adjustmask(C)
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
+ if(!internals)
to_chat(C, "You are not wearing an internals mask!")
- return 1
- else
- var/obj/item/clothing/mask/M = C.wear_mask
- if(M.mask_adjusted) // if mask on face but pushed down
- M.adjustmask(C) // adjust it back
- if( !(M.clothing_flags & MASKINTERNALS) )
- to_chat(C, "You are not wearing an internals mask!")
- return
+ return
var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
if(I)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 3896c3eac3..6455b4ccb6 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -171,3 +171,7 @@
if(prob(2))
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
return 1
+
+/obj/item/proc/getweight()
+ return total_mass || w_class * 1.25
+
diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm
index 49ff1c8d49..3ac103affc 100644
--- a/code/controllers/configuration/config_entry.dm
+++ b/code/controllers/configuration/config_entry.dm
@@ -19,6 +19,7 @@
var/abstract_type = /datum/config_entry //do not instantiate if type matches this
var/vv_VAS = TRUE //Force validate and set on VV. VAS proccall guard will run regardless.
+ var/postload_required = FALSE //requires running OnPostload()
var/dupes_allowed = FALSE
@@ -72,6 +73,9 @@
/datum/config_entry/proc/DeprecationUpdate(value)
return
+/datum/config_entry/proc/OnPostload()
+ return
+
/datum/config_entry/string
config_entry_value = ""
abstract_type = /datum/config_entry/string
@@ -80,7 +84,7 @@
/datum/config_entry/string/vv_edit_var(var_name, var_value)
return var_name != "auto_trim" && ..()
-/datum/config_entry/string/ValidateAndSet(str_val)
+/datum/config_entry/string/ValidateAndSet(str_val, during_load)
if(!VASProcCallGuard(str_val))
return FALSE
config_entry_value = auto_trim ? trim(str_val) : str_val
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 0232081c1a..ea2919f342 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -101,6 +101,7 @@
log_config("Loading config file [filename]...")
var/list/lines = world.file2list("[directory]/[filename]")
var/list/_entries = entries
+ var/list/postload_required = list()
for(var/L in lines)
L = trim(L)
if(!L)
@@ -157,18 +158,24 @@
else
warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
- var/validated = E.ValidateAndSet(value)
+ var/validated = E.ValidateAndSet(value, TRUE)
if(!validated)
log_config("Failed to validate setting \"[value]\" for [entry]")
else
if(E.modified && !E.dupes_allowed)
log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
+ if(E.postload_required)
+ postload_required[E] = TRUE
E.resident_file = filename
if(validated)
E.modified = TRUE
+ for(var/i in postload_required)
+ var/datum/config_entry/E = i
+ E.OnPostload()
+
++.
/datum/controller/configuration/can_vv_get(var_name)
diff --git a/code/controllers/configuration/entries/donator.dm b/code/controllers/configuration/entries/donator.dm
new file mode 100644
index 0000000000..b74d5f5839
--- /dev/null
+++ b/code/controllers/configuration/entries/donator.dm
@@ -0,0 +1,22 @@
+/datum/config_entry/keyed_list/donator_group
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_FLAG
+ abstract_type = /datum/config_entry/keyed_list/donator_group
+
+//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations.
+/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load)
+ . = ..()
+ if(. && during_load)
+ regenerate_donator_grouping_list()
+
+/datum/config_entry/keyed_list/donator_group/OnPostload()
+ . = ..()
+ regenerate_donator_grouping_list()
+
+//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm
+
+/datum/config_entry/keyed_list/donator_group/tier_1_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_2_donators
+
+/datum/config_entry/keyed_list/donator_group/tier_3_donators
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 221d04dad5..cc09ca816e 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(input)
// This is for when macro sets are eventualy datumized
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
var/list/static/default_macro_sets
-
+
if(default_macro_sets)
macro_sets = default_macro_sets
return
@@ -49,6 +49,7 @@ SUBSYSTEM_DEF(input)
"old_hotkeys" = list(
"Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
"O" = "ooc",
+ "L" = "looc",
"T" = "say",
"M" = "me",
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 5e960e0f96..4001c666ee 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -437,7 +437,7 @@ SUBSYSTEM_DEF(job)
if(job.custom_spawn_text)
to_chat(M, "[job.custom_spawn_text]")
if(CONFIG_GET(number/minimal_access_threshold))
- to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.")
+ to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.")
if(job && H)
if(job.dresscodecompliant)// CIT CHANGE - dress code compliance
diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index a6c86a3576..4af54b8c70 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -9,6 +9,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
runlevels = RUNLEVEL_GAME
var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/
+ var/list/quirk_names_by_path = list()
var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad
var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process
@@ -22,11 +23,68 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
var/datum/quirk/T = V
quirks[initial(T.name)] = T
quirk_points[initial(T.name)] = initial(T.value)
+ quirk_names_by_path[T] = initial(T.name)
-/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects)
+/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects, roundstart = FALSE, datum/job/job, silent = FALSE, mob/to_chat_target)
GenerateQuirks(cli)
- for(var/V in cli.prefs.character_quirks)
+ var/list/quirks = cli.prefs.character_quirks.Copy()
+ var/list/cut
+ if(job && job.blacklisted_quirks)
+ cut = filter_quirks(quirks, job)
+ for(var/V in quirks)
user.add_quirk(V, spawn_effects)
+ if(!silent && LAZYLEN(cut))
+ to_chat(to_chat_target || user, "All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].")
+
+/datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name)
+ return quirks[name]
+
+/datum/controller/subsystem/processing/quirks/proc/quirk_points_by_name(name)
+ return quirk_points[name]
+
+/datum/controller/subsystem/processing/quirks/proc/quirk_name_by_path(path)
+ return quirk_names_by_path[path]
+
+/datum/controller/subsystem/processing/quirks/proc/total_points(list/quirk_names)
+ . = 0
+ for(var/i in quirk_names)
+ . += quirk_points_by_name(i)
+
+/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/quirks, datum/job/job)
+ var/list/cut = list()
+ var/list/banned_names = list()
+ for(var/i in job.blacklisted_quirks)
+ var/name = quirk_name_by_path(i)
+ if(name)
+ banned_names += name
+ var/list/blacklisted = quirks & banned_names
+ if(length(blacklisted))
+ for(var/i in blacklisted)
+ quirks -= i
+ cut += i
+
+ /* //Code to automatically reduce positive quirks until balance is even.
+ var/points_used = total_points(quirks)
+ if(points_used > 0)
+ //they owe us points, let's collect.
+ for(var/i in quirks)
+ var/points = quirk_points_by_name(i)
+ if(points > 0)
+ cut += i
+ quirks -= i
+ points_used -= points
+ if(points_used <= 0)
+ break
+ */
+
+ //Nah, let's null all non-neutrals out.
+ if(cut.len)
+ for(var/i in quirks)
+ if(quirk_points_by_name(i) != 0)
+ //cut += i -- Commented out: Only show the ones that triggered the quirk purge.
+ quirks -= i
+
+ return cut
/datum/controller/subsystem/processing/quirks/proc/GenerateQuirks(client/user)
if(user.prefs.character_quirks.len)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index df96c44df7..f2469e8f7d 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -229,7 +229,7 @@ SUBSYSTEM_DEF(ticker)
if(GLOB.secret_force_mode != "secret")
var/datum/game_mode/smode = config.pick_mode(GLOB.secret_force_mode)
if(!smode.can_start())
- message_admins("\blue Unable to force secret [GLOB.secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.")
+ message_admins("Unable to force secret [GLOB.secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.")
else
mode = smode
@@ -302,14 +302,14 @@ SUBSYSTEM_DEF(ticker)
round_start_time = world.time
SSdbcore.SetRoundStart()
- to_chat(world, "Welcome to [station_name()], enjoy your stay!")
+ to_chat(world, "Welcome to [station_name()], enjoy your stay!")
SEND_SOUND(world, sound('sound/ai/welcome.ogg'))
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
if(SSevents.holidays)
- to_chat(world, "and...")
+ to_chat(world, "and...")
for(var/holidayname in SSevents.holidays)
var/datum/holiday/holiday = SSevents.holidays[holidayname]
to_chat(world, "
[holiday.greet()]
")
@@ -385,7 +385,7 @@ SUBSYSTEM_DEF(ticker)
if(player.mind.assigned_role != player.mind.special_role)
SSjob.EquipRank(N, player.mind.assigned_role, 0)
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
- SSquirks.AssignQuirks(N.new_character, N.client, TRUE)
+ SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
CHECK_TICK
if(captainless)
for(var/mob/dead/new_player/N in GLOB.player_list)
@@ -425,7 +425,7 @@ SUBSYSTEM_DEF(ticker)
m = pick(memetips)
if(m)
- to_chat(world, "Tip of the round: [html_encode(m)]")
+ to_chat(world, "Tip of the round: [html_encode(m)]")
/datum/controller/subsystem/ticker/proc/check_queue()
var/hpc = CONFIG_GET(number/hard_popcap)
diff --git a/code/controllers/subsystem/vore.dm b/code/controllers/subsystem/vore.dm
index faaa297ca3..ca34f9ab61 100644
--- a/code/controllers/subsystem/vore.dm
+++ b/code/controllers/subsystem/vore.dm
@@ -7,7 +7,7 @@
SUBSYSTEM_DEF(bellies)
name = "Bellies"
- priority = 5
+ priority = FIRE_PRIORITY_VORE
wait = 1 SECONDS
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 422b1eda26..2f56c69384 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -18,6 +18,8 @@ SUBSYSTEM_DEF(vote)
var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes
+ var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use.
+
/datum/controller/subsystem/vote/fire() //called by master_controller
if(mode)
time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10)
@@ -85,15 +87,20 @@ SUBSYSTEM_DEF(vote)
/datum/controller/subsystem/vote/proc/announce_result()
var/list/winners = get_result()
var/text
+ var/was_roundtype_vote = mode == "roundtype"
if(winners.len > 0)
if(question)
text += "[question]"
else
text += "[capitalize(mode)] Vote"
+ if(was_roundtype_vote)
+ stored_gamemode_votes = list()
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
if(!votes)
votes = 0
+ if(was_roundtype_vote)
+ stored_gamemode_votes[choices[i]] = votes
text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes
if(mode != "custom")
if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f64a549b29..fd33ef79b5 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -494,6 +494,7 @@
else
to_chat(owner, "Your hands are full!")
+//MGS Box
/datum/action/item_action/agent_box
name = "Deploy Box"
desc = "Find inner peace, here, in the box."
@@ -502,21 +503,27 @@
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "deploy_box"
var/cooldown = 0
- var/obj/structure/closet/cardboard/agent/box
+ var/boxtype = /obj/structure/closet/cardboard/agent
+//Handles open and closing the box
/datum/action/item_action/agent_box/Trigger()
- if(!..())
+ . = ..()
+ if(!.)
return FALSE
- if(QDELETED(box))
- if(cooldown < world.time - 100)
- box = new(owner.drop_location())
- owner.forceMove(box)
- cooldown = world.time
- owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
- else
- owner.forceMove(box.drop_location())
+ if(istype(owner.loc, /obj/structure/closet/cardboard/agent))
+ var/obj/structure/closet/cardboard/agent/box = owner.loc
+ owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
+ box.open()
+ return
+ //Box closing from here on out.
+ if(!isturf(owner.loc)) //Don't let the player use this to escape mechs/welded closets.
+ to_chat(owner, "You need more space to activate this implant.")
+ return
+ if(cooldown < world.time - 100)
+ var/box = new boxtype(owner.drop_location())
+ owner.forceMove(box)
+ cooldown = world.time
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
- QDEL_NULL(box)
//Preset for spells
/datum/action/spell_action
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index bfcc49f453..e6c9f20de6 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -14,15 +14,18 @@
var/turf/open/T = get_turf(parent)
if(!istype(T))
return
-
+
var/mob/living/LM = parent
var/v = volume
var/e = e_range
if(!T.footstep || LM.buckled || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING))
- if (LM.lying && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
+ if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
-
+
+ if(HAS_TRAIT(LM, TRAIT_SILENT_STEP))
+ return
+
if(iscarbon(LM))
var/mob/living/carbon/C = LM
if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG))
@@ -31,18 +34,18 @@
v /= 2
e -= 5
steps++
-
+
if(steps >= 3)
steps = 0
-
+
else
return
-
+
if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around
return
-
+
//begin playsound shenanigans//
-
+
//for barefooted non-clawed mobs like monkeys
if(isbarefoot(LM))
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
@@ -50,19 +53,19 @@
TRUE,
GLOB.barefootstep[T.barefootstep][3] + e)
return
-
+
//for xenomorphs, dogs, and other clawed mobs
if(isclawfoot(LM))
if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
v /= 3
e -= 5
-
+
playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
GLOB.clawfootstep[T.clawfootstep][2] * v,
TRUE,
GLOB.clawfootstep[T.clawfootstep][3] + e)
return
-
+
//for megafauna and other large and imtimidating mobs such as the bloodminer
if(isheavyfoot(LM))
playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]),
@@ -70,12 +73,12 @@
TRUE,
GLOB.heavyfootstep[T.heavyfootstep][3] + e)
return
-
+
//for slimes
- if(isslime(LM))
+ if(isslime(LM))
playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v)
return
-
+
//for (simple) humanoid mobs (clowns, russians, pirates, etc.)
if(isshoefoot(LM))
if(!ishuman(LM))
@@ -87,17 +90,17 @@
if(ishuman(LM)) //for proper humans, they're special
var/mob/living/carbon/human/H = LM
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
-
+
if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
-
+
if(H.shoes || feetCover) //are we wearing shoes
playsound(T, pick(GLOB.footstep[T.footstep][1]),
GLOB.footstep[T.footstep][2] * v,
TRUE,
GLOB.footstep[T.footstep][3] + e)
-
+
if((!H.shoes && !feetCover)) //are we NOT wearing shoes
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
GLOB.barefootstep[T.barefootstep][2] * v,
diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm
index c7dd7123d2..3f7f794435 100644
--- a/code/datums/components/nanites.dm
+++ b/code/datums/components/nanites.dm
@@ -46,9 +46,9 @@
RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program)
RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan)
RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync)
+ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
if(isliving(parent))
- RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death)
RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access)
RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock)
@@ -169,23 +169,19 @@
holder.icon_state = "nanites[nanite_percent]"
/datum/component/nanites/proc/on_emp(datum/source, severity)
- nanite_volume *= (rand(0.60, 0.90)) //Lose 10-40% of nanites
- adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume
- if(prob(40/severity))
- cloud_id = 0
+ adjust_nanites(null, -(nanite_volume * 0.3 + 50)) //Lose 30% variable and 50 flat nanite volume.
for(var/X in programs)
var/datum/nanite_program/NP = X
NP.on_emp(severity)
/datum/component/nanites/proc/on_shock(datum/source, shock_damage)
- nanite_volume *= (rand(0.45, 0.80)) //Lose 20-55% of nanites
- adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume
+ adjust_nanites(null, -(nanite_volume * (shock_damage * 0.005) + shock_damage)) //0.5% of shock damage (@ 50 damage it'd drain 25%) + shock damage flat volume
for(var/X in programs)
var/datum/nanite_program/NP = X
NP.on_shock(shock_damage)
/datum/component/nanites/proc/on_minor_shock(datum/source)
- adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume
+ adjust_nanites(null, -25)
for(var/X in programs)
var/datum/nanite_program/NP = X
NP.on_minor_shock()
diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm
index 8989cb499d..1d5549d0fe 100644
--- a/code/datums/components/spooky.dm
+++ b/code/datums/components/spooky.dm
@@ -27,7 +27,7 @@
C.stuttering = 20
if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly)))
C.adjustStaminaLoss(25) //boneless humanoids don't lose the will to live
- to_chat(C, "DOOT")
+ to_chat(C, "DOOT")
spectral_change(H)
else //the sound will spook monkeys.
diff --git a/code/datums/components/storage/concrete/emergency.dm b/code/datums/components/storage/concrete/emergency.dm
index 48880ff605..348821a913 100644
--- a/code/datums/components/storage/concrete/emergency.dm
+++ b/code/datums/components/storage/concrete/emergency.dm
@@ -36,3 +36,4 @@
/datum/component/storage/concrete/emergency/proc/unlock_me(datum/source)
if(locked)
set_locked(source, FALSE)
+ return TRUE
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index d5c983bc39..f0fb7f6095 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1351,8 +1351,8 @@
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
- var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] "
- message_admins(msg)
+ var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] "
+ message_admins("[msg]")
admin_ticket_log(L, msg)
vv_update_display(L, Text, "[newamt]")
else if(href_list["copyoutfit"])
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index f506f44ad5..a4a4936f0e 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -31,13 +31,43 @@
var/id = ""
var/processing = FALSE
var/mutable = TRUE //set to FALSE to prevent most in-game methods of altering the disease via virology
+ var/oldres
// The order goes from easy to cure to hard to cure.
var/static/list/advance_cures = list(
- "sodiumchloride", "sugar", "orangejuice",
- "spaceacillin", "salglu_solution", "ethanol",
- "leporazine", "synaptizine", "lipolicide",
- "silver", "gold"
+ list( // level 1
+ "copper", "silver", "iodine", "iron", "carbon"
+ ),
+ list( // level 2
+ "potassium", "ethanol", "lithium", "silicon", "bromine"
+ ),
+ list( // level 3
+ "sodiumchloride", "sugar", "orangejuice", "tomatojuice", "milk"
+ ),
+ list( //level 4
+ "spaceacillin", "salglu_solution", "epinephrine", "charcoal"
+ ),
+ list( //level 5
+ "oil", "synaptizine", "mannitol", "space_drugs", "cryptobiolin"
+ ),
+ list( // level 6
+ "phenol", "inacusiate", "oculine", "antihol"
+ ),
+ list( // level 7
+ "leporazine", "mindbreaker", "corazone"
+ ),
+ list( // level 8
+ "pax", "happiness", "ephedrine"
+ ),
+ list( // level 9
+ "lipolicide", "sal_acid"
+ ),
+ list( // level 10
+ "haloperidol", "aranesp", "diphenhydramine"
+ ),
+ list( //level 11
+ "modafinil", "anacea"
+ )
)
/*
@@ -250,7 +280,10 @@
/datum/disease/advance/proc/GenerateCure()
if(properties && properties.len)
var/res = CLAMP(properties["resistance"] - (symptoms.len / 2), 1, advance_cures.len)
- cures = list(advance_cures[res])
+ if(res == oldres)
+ return
+ cures = list(pick(advance_cures[res]))
+ oldres = res
// Get the cure name from the cure_id
var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]]
diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm
index 99665aafc0..b18e089a41 100644
--- a/code/datums/diseases/advance/symptoms/nanites.dm
+++ b/code/datums/diseases/advance/symptoms/nanites.dm
@@ -25,7 +25,7 @@
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
- SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, 0.5 * power)
+ SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, power)
if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES))
if(prob(A.stage_prob))
A.stage = min(A.stage + 1,A.max_stages)
@@ -60,4 +60,4 @@
SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, -0.4 * power)
if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES))
if(prob(A.stage_prob))
- A.stage = min(A.stage + 1,A.max_stages)
\ No newline at end of file
+ A.stage = min(A.stage + 1,A.max_stages)
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index d61c95c8f2..4976891543 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -21,8 +21,8 @@
/datum/ert/amber
code = "Amber"
- leader_role = /datum/antagonist/ert/commander/red
- roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red)
+ leader_role = /datum/antagonist/ert/commander/amber
+ roles = list(/datum/antagonist/ert/security/amber, /datum/antagonist/ert/medic/amber, /datum/antagonist/ert/engineer/amber)
/datum/ert/red
leader_role = /datum/antagonist/ert/commander/red
@@ -55,3 +55,13 @@
rename_team = "Inquisition"
mission = "Destroy any traces of paranormal activity aboard the station."
polldesc = "a Nanotrasen paranormal response team"
+
+/datum/ert/greybois
+ code = "Green"
+ teamsize = 1
+ opendoors = FALSE
+ enforce_human = FALSE
+ roles = /datum/antagonist/greybois
+ leader_role = /datum/antagonist/greybois/greygod
+ rename_team = "Emergency Assistants"
+ polldesc = "an Emergency Assistant"
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 0623e2f5f9..4d1986cccf 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -5,11 +5,19 @@
// effectout: effect to show right after teleportation
// asoundin: soundfile to play before teleportation
// asoundout: soundfile to play after teleportation
-// force_teleport: if false, teleport will use Move() proc (dense objects will prevent teleportation)
// no_effects: disable the default effectin/effectout of sparks
-/proc/do_teleport(atom/movable/teleatom, atom/destination, precision=null, force_teleport=TRUE, datum/effect_system/effectin=null, datum/effect_system/effectout=null, asoundin=null, asoundout=null, no_effects=FALSE)
+// forceMove: if false, teleport will use Move() proc (dense objects will prevent teleportation)
+// forced: whether or not to ignore no_teleport
+/proc/do_teleport(atom/movable/teleatom, atom/destination, precision=null, forceMove = TRUE, datum/effect_system/effectin=null, datum/effect_system/effectout=null, asoundin=null, asoundout=null, no_effects=FALSE, channel=TELEPORT_CHANNEL_BLUESPACE, forced = FALSE)
// teleporting most effects just deletes them
- if(iseffect(teleatom) && !istype(teleatom, /obj/effect/dummy/chameleon))
+ var/static/list/delete_atoms = typecacheof(list(
+ /obj/effect,
+ )) - typecacheof(list(
+ /obj/effect/dummy/chameleon,
+ /obj/effect/wisp,
+ /obj/effect/mob_spawn
+ ))
+ if(delete_atoms[teleatom.type])
qdel(teleatom)
return FALSE
@@ -17,25 +25,37 @@
// if the precision is not specified, default to 0, but apply BoH penalties
if (isnull(precision))
precision = 0
- if(istype(teleatom, /obj/item/storage/backpack/holding))
- precision = rand(1,100)
- var/static/list/bag_cache = typecacheof(/obj/item/storage/backpack/holding)
- var/list/bagholding = typecache_filter_list(teleatom.GetAllContents(), bag_cache)
- if(bagholding.len)
- precision = max(rand(1,100)*bagholding.len,100)
- if(isliving(teleatom))
- var/mob/living/MM = teleatom
- to_chat(MM, "The bluespace interface on your bag of holding interferes with the teleport!")
+ switch(channel)
+ if(TELEPORT_CHANNEL_BLUESPACE)
+ if(istype(teleatom, /obj/item/storage/backpack/holding))
+ precision = rand(1,100)
- // if effects are not specified and not explicitly disabled, sparks
- if ((!effectin || !effectout) && !no_effects)
- var/datum/effect_system/spark_spread/sparks = new
- sparks.set_up(5, 1, teleatom)
- if (!effectin)
- effectin = sparks
- if (!effectout)
- effectout = sparks
+ var/static/list/bag_cache = typecacheof(/obj/item/storage/backpack/holding)
+ var/list/bagholding = typecache_filter_list(teleatom.GetAllContents(), bag_cache)
+ if(bagholding.len)
+ precision = max(rand(1,100)*bagholding.len,100)
+ if(isliving(teleatom))
+ var/mob/living/MM = teleatom
+ to_chat(MM, "The bluespace interface on your bag of holding interferes with the teleport!")
+
+ // if effects are not specified and not explicitly disabled, sparks
+ if ((!effectin || !effectout) && !no_effects)
+ var/datum/effect_system/spark_spread/sparks = new
+ sparks.set_up(5, 1, teleatom)
+ if (!effectin)
+ effectin = sparks
+ if (!effectout)
+ effectout = sparks
+ if(TELEPORT_CHANNEL_QUANTUM)
+ // if effects are not specified and not explicitly disabled, rainbow sparks
+ if ((!effectin || !effectout) && !no_effects)
+ var/datum/effect_system/spark_spread/quantum/sparks = new
+ sparks.set_up(5, 1, teleatom)
+ if (!effectin)
+ effectin = sparks
+ if (!effectout)
+ effectout = sparks
// perform the teleport
var/turf/curturf = get_turf(teleatom)
@@ -45,11 +65,15 @@
return FALSE
var/area/A = get_area(curturf)
- if(A.noteleport)
+ var/area/B = get_area(destturf)
+ if(!forced && (A.noteleport || B.noteleport))
+ return FALSE
+
+ if(SEND_SIGNAL(destturf, COMSIG_ATOM_INTERCEPT_TELEPORT, channel, curturf, destturf))
return FALSE
tele_play_specials(teleatom, curturf, effectin, asoundin)
- var/success = force_teleport ? teleatom.forceMove(destturf) : teleatom.Move(destturf)
+ var/success = forceMove ? teleatom.forceMove(destturf) : teleatom.Move(destturf)
if (success)
log_game("[key_name(teleatom)] has teleported from [loc_name(curturf)] to [loc_name(destturf)]")
tele_play_specials(teleatom, destturf, effectout, asoundout)
diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm
index 99b84a1b35..dcc16f1ba5 100644
--- a/code/datums/map_config.dm
+++ b/code/datums/map_config.dm
@@ -18,7 +18,7 @@
var/map_file = "BoxStation.dmm"
var/traits = null
- var/space_ruin_levels = 1 //Citadel edit - reduces the default space ruin z-level count to 1
+ var/space_ruin_levels = 2
var/space_empty_levels = 1
var/minetype = "lavaland"
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index ae8f92a342..d119759efc 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -2,6 +2,7 @@
var/name = "Martial Art"
var/streak = ""
var/max_streak_length = 6
+ var/id = "" //ID, used by mind/has_martialartcode\game\objects\items\granters.dm:345:error: user.mind.has_martialart: undefined proccode\game\objects\items\granters.dm:345:error: user.mind.has_martialart: undefined proccode\game\objects\items\granters.dm:345:error: user.mind.has_martialart: undefined proccode\game\objects\items\granters.dm:345:error: user.mind.has_martialart: undefined proccode\game\objects\items\granters.dm:345:error: user.mind.has_martialart: undefined proc
var/current_target
var/datum/martial_art/base // The permanent style. This will be null unless the martial art is temporary
var/deflection_chance = 0 //Chance to deflect projectiles
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index c93fc47f2b..7399528e1c 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -1,5 +1,6 @@
/datum/martial_art/boxing
name = "Boxing"
+ id = MARTIALART_BOXING
/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
to_chat(A, "Can't disarm while boxing!")
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 55cd4a3f7a..71545476ff 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -6,6 +6,7 @@
/datum/martial_art/cqc
name = "CQC"
+ id = MARTIALART_CQC
help_verb = /mob/living/carbon/human/proc/CQC_help
block_chance = 75
var/just_a_cook = FALSE
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 4283d7f78f..6379d481ca 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -1,5 +1,6 @@
/datum/martial_art/krav_maga
name = "Krav Maga"
+ id = MARTIALART_KRAVMAGA
var/datum/action/neck_chop/neckchop = new/datum/action/neck_chop()
var/datum/action/leg_sweep/legsweep = new/datum/action/leg_sweep()
var/datum/action/lung_punch/lungpunch = new/datum/action/lung_punch()
@@ -85,14 +86,14 @@
return 1
return 0
-/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+/datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(D.lying || D.IsKnockdown())
return 0
D.visible_message("[A] leg sweeps [D]!", \
"[A] leg sweeps you!")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
D.apply_damage(5, BRUTE)
- D.Knockdown(40, override_hardstun = 0.01, 25)
+ D.Knockdown(40, override_hardstun = 0.01, override_stamdmg = 25)
log_combat(A, D, "leg sweeped")
return 1
@@ -196,7 +197,7 @@
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
icon_state = "combat"
- item_state = "blackglovesplus"
+ item_state = "blackgloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm
index 33d5bb51bf..1ef7734771 100644
--- a/code/datums/martial/mushpunch.dm
+++ b/code/datums/martial/mushpunch.dm
@@ -1,5 +1,6 @@
/datum/martial_art/mushpunch
name = "Mushroom Punch"
+ id = MARTIALART_MUSHPUNCH
/datum/martial_art/mushpunch/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
var/atk_verb
diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm
index f540dc0783..e38a011db0 100644
--- a/code/datums/martial/plasma_fist.dm
+++ b/code/datums/martial/plasma_fist.dm
@@ -4,6 +4,7 @@
/datum/martial_art/plasma_fist
name = "Plasma Fist"
+ id = MARTIALART_PLASMAFIST
help_verb = /mob/living/carbon/human/proc/plasma_fist_help
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 1cb18f903f..8f1a33a8b3 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -1,5 +1,6 @@
/datum/martial_art/psychotic_brawling
name = "Psychotic Brawling"
+ id = MARTIALART_PSYCHOBRAWL
/datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return psycho_attack(A,D)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 5f19c37b99..e205d7a435 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -6,6 +6,7 @@
/datum/martial_art/the_sleeping_carp
name = "The Sleeping Carp"
+ id = MARTIALART_SLEEPINGCARP
deflection_chance = 100
reroute_deflection = TRUE
no_guns = TRUE
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index e57edf9fb2..e07fa27ef5 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -10,6 +10,7 @@
/datum/martial_art/wrestling
name = "Wrestling"
+ id = MARTIALART_WRESTLING
var/datum/action/slam/slam = new/datum/action/slam()
var/datum/action/throw_wrassle/throw_wrassle = new/datum/action/throw_wrassle()
var/datum/action/kick/kick = new/datum/action/kick()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 7d150d890d..8e61801e15 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -64,6 +64,8 @@
var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator
+ var/list/learned_recipes //List of learned recipe TYPES.
+
/datum/mind/New(var/key)
src.key = key
soulOwner = src
@@ -130,7 +132,8 @@
L.update_arousal_hud() //Removes the old icon
/datum/mind/proc/store_memory(new_text)
- memory += "[new_text]
"
+ if((length(memory) + length(new_text)) <= MAX_MESSAGE_LEN)
+ memory += "[new_text]
"
/datum/mind/proc/wipe_memory()
memory = null
@@ -778,6 +781,11 @@
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
mind.active = 1 //indicates that the mind is currently synced with a client
+/datum/mind/proc/has_martialart(var/string)
+ if(martial_art && martial_art.id == string)
+ return martial_art
+ return FALSE
+
/mob/dead/new_player/sync_mind()
return
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index 461c221ff8..a32220aa43 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -63,16 +63,14 @@
/datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
- owner.resize = 0.8
- owner.update_transform()
+ owner.transform = owner.transform.Scale(1, 0.8)
owner.pass_flags |= PASSTABLE
owner.visible_message("[owner] suddenly shrinks!", "Everything around you seems to grow..")
/datum/mutation/human/dwarfism/on_losing(mob/living/carbon/human/owner)
if(..())
return
- owner.resize = 1.25
- owner.update_transform()
+ owner.transform = owner.transform.Scale(1, 1.25)
owner.pass_flags &= ~PASSTABLE
owner.visible_message("[owner] suddenly grows!", "Everything around you seems to shrink..")
diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm
index 21adc944f6..f02b7f185f 100644
--- a/code/datums/mutations/speech.dm
+++ b/code/datums/mutations/speech.dm
@@ -91,32 +91,29 @@
message = replacetext(message," oh god "," cheese and crackers ")
message = replacetext(message," jesus "," gee wiz ")
message = replacetext(message," weak "," strong ")
- message = replacetext(message," kill "," hug ")
- message = replacetext(message," murder "," tease ")
+ message = replacetext(message," kill yourself "," hug ")
message = replacetext(message," ugly "," beautiful ")
message = replacetext(message," douchbag "," nice guy ")
message = replacetext(message," whore "," lady ")
- message = replacetext(message," nerd "," smart guy ")
+ message = replacetext(message," nerd "," smarty pants ")
message = replacetext(message," moron "," fun person ")
message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
message = replacetext(message," sex "," hug fight ")
message = replacetext(message," idiot "," genius ")
message = replacetext(message," fat "," thin ")
- message = replacetext(message," beer "," water with ice ")
- message = replacetext(message," drink "," water ")
+ message = replacetext(message," beer "," liquid bread ")
+ message = replacetext(message," drink "," liquid ")
message = replacetext(message," feminist "," empowered woman ")
- message = replacetext(message," i hate you "," you're mean ")
- message = replacetext(message," nigger "," african american ")
+ message = replacetext(message," i hate you "," you're a mean ")
message = replacetext(message," jew "," jewish ")
message = replacetext(message," shit "," shiz ")
message = replacetext(message," crap "," poo ")
message = replacetext(message," slut "," tease ")
message = replacetext(message," ass "," butt ")
message = replacetext(message," damn "," dang ")
- message = replacetext(message," fuck "," ")
message = replacetext(message," penis "," privates ")
message = replacetext(message," cunt "," privates ")
- message = replacetext(message," dick "," jerk ")
+ message = replacetext(message," dick "," privates ")
message = replacetext(message," vagina "," privates ")
speech_args[SPEECH_MESSAGE] = trim(message)
@@ -281,4 +278,4 @@
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
owner.grant_language(/datum/language/common)
- owner.remove_language(/datum/language/beachbum)
\ No newline at end of file
+ owner.remove_language(/datum/language/beachbum)
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 22fca23902..9762426608 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -305,3 +305,9 @@
suffix = "spacehermit.dmm"
name = "Space Hermit"
description = "A late awakening cryo pod in a crashed escape pod wakes up to find what befell of his fellow survivors. Contains all the necessary resources to actually make it out alive. Good luck."
+
+/datum/map_template/ruin/space/advancedlab
+ id = "advancedlab"
+ suffix = "advancedlab.dmm"
+ name = "Abductor Replication Lab"
+ description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm
index c4f485653e..3b6fae5aee 100644
--- a/code/datums/saymode.dm
+++ b/code/datums/saymode.dm
@@ -11,7 +11,7 @@
/datum/saymode/changeling
- key = "g"
+ key = MODE_KEY_CHANGELING
mode = MODE_CHANGELING
/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language)
@@ -73,7 +73,7 @@
/datum/saymode/vocalcords
- key = "x"
+ key = MODE_KEY_VOCALCORDS
mode = MODE_VOCALCORDS
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
@@ -87,7 +87,7 @@
/datum/saymode/binary //everything that uses .b (silicons, drones, blobbernauts/spores, swarmers)
- key = "b"
+ key = MODE_KEY_BINARY
mode = MODE_BINARY
/datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 0512977d1a..336945f622 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -170,7 +170,7 @@
tick_interval = 4
alert_type = /obj/screen/alert/status_effect/his_grace
var/bloodlust = 0
-
+
/obj/screen/alert/status_effect/his_grace
name = "His Grace"
desc = "His Grace hungers, and you must feed Him."
@@ -208,6 +208,7 @@
owner.adjustToxLoss(-grace_heal, TRUE, TRUE)
owner.adjustOxyLoss(-(grace_heal * 2))
owner.adjustCloneLoss(-grace_heal)
+ owner.adjustStaminaLoss(-(grace_heal * 25))
/datum/status_effect/his_grace/on_remove()
owner.log_message("lost His Grace's stun immunity", LOG_ATTACK)
diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm
index cc6dd8db3f..12e34b0c90 100644
--- a/code/datums/traits/_quirk.dm
+++ b/code/datums/traits/_quirk.dm
@@ -13,7 +13,6 @@
var/mob/living/quirk_holder
/datum/quirk/New(mob/living/quirk_mob, spawn_effects)
- ..()
if(!quirk_mob || (human_only && !ishuman(quirk_mob)) || quirk_mob.has_quirk(type))
qdel(src)
quirk_holder = quirk_mob
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index bd62d546b9..f77fe37333 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -363,23 +363,3 @@
gain_text = "There's a lot on your mind right now."
lose_text = "Your mind finally feels calm."
medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events."
-
-//For reviewers: Removal requested, commented out until the end of review (will remove when fixing merge conflicts). I'll probably rewrited
-/*Fixed quirk so that it's less impactful at the moment and doesn't override player autonomy (For the people in the discord who really want it.) See if that helps
-/datum/quirk/hypno
- name = "Hypnotherapy user"
- desc = "You had hypnotherapy right before your shift, you're not sure it had any effects, though."
- mob_trait = "hypnotherapy"
- value = -1 //I mean, it can be a really bad trait to have, but on the other hand, some people want it?
- gain_text = "You really think the hypnotherapy helped you out."
- //lose_text = "You forget about the hypnotherapy you had, or did you even have it?"
-
-/datum/quirk/hypno/add()
- //You caught me, it's not actually based off a trigger, stop spoiling the effect! Code diving ruins the magic!
- addtimer(CALLBACK(src, /datum/quirk/hypno.proc/triggered, quirk_holder), rand(120, 360))//increase by 100, it's lower so I can test it.
-
-//DOES NOT give any indication when someone is triggered - this is intentional so people don't abuse it, you're supposed to get a random thing said to you as a mini objective.
-/datum/quirk/hypno/proc/triggered(quirk_holder)//I figured I might as well make a trait of code I added.
- var/mob/living/carbon/human/H = quirk_holder
- H.apply_status_effect(/datum/status_effect/trance, 1000, TRUE, TRUE)
-*/
diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm
index f1b08ee18b..fab5a1313c 100644
--- a/code/datums/wires/_wires.dm
+++ b/code/datums/wires/_wires.dm
@@ -231,6 +231,9 @@
// Same for anyone with an abductor multitool.
else if(user.is_holding_item_of_type(/obj/item/multitool/abductor))
reveal_wires = TRUE
+ // and advanced multitool
+ else if(user.is_holding_item_of_type(/obj/item/multitool/advanced))
+ reveal_wires = TRUE
// Station blueprints do that too, but only if the wires are not randomized.
else if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize)
diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm
index ebad7d1469..f83bab5910 100644
--- a/code/datums/wires/autolathe.dm
+++ b/code/datums/wires/autolathe.dm
@@ -30,6 +30,7 @@
addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60)
if(WIRE_SHOCK)
A.shocked = !A.shocked
+ A.shock(usr, 50)
addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60)
if(WIRE_DISABLE)
A.disabled = !A.disabled
@@ -40,9 +41,11 @@
switch(wire)
if(WIRE_HACK)
A.adjust_hacked(!mend)
- if(WIRE_HACK)
+ if(WIRE_SHOCK)
A.shocked = !mend
+ A.shock(usr, 50)
if(WIRE_DISABLE)
A.disabled = !mend
if(WIRE_ZAP)
- A.shock(usr, 50)
\ No newline at end of file
+ A.shock(usr, 50)
+
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index 00a7fed012..d5ceb833b7 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -467,3 +467,8 @@
/area/ruin/space/has_grav/powered/ancient_shuttle
name = "Ancient Shuttle"
icon_state = "yellow"
+
+// Abductor Replication Lab
+/area/ruin/space/has_grav/powered/advancedlab
+ name = "Abductor Replication Lab"
+ icon_state = "yellow"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 88fe2c8d13..6665e4d59b 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -379,7 +379,7 @@
SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
/atom/proc/emag_act()
- SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/atom/proc/rad_act(strength)
SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 212a99f966..ed470473d9 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -91,35 +91,35 @@ GLOBAL_LIST_EMPTY(all_radios)
// use in maps, such as in intercoms.
GLOBAL_LIST_INIT(radiochannels, list(
- "Common" = FREQ_COMMON,
- "Science" = FREQ_SCIENCE,
- "Command" = FREQ_COMMAND,
- "Medical" = FREQ_MEDICAL,
- "Engineering" = FREQ_ENGINEERING,
- "Security" = FREQ_SECURITY,
- "CentCom" = FREQ_CENTCOM,
- "Syndicate" = FREQ_SYNDICATE,
- "Supply" = FREQ_SUPPLY,
- "Service" = FREQ_SERVICE,
- "AI Private" = FREQ_AI_PRIVATE,
- "Red Team" = FREQ_CTF_RED,
- "Blue Team" = FREQ_CTF_BLUE
+ RADIO_CHANNEL_COMMON = FREQ_COMMON,
+ RADIO_CHANNEL_SCIENCE = FREQ_SCIENCE,
+ RADIO_CHANNEL_COMMAND = FREQ_COMMAND,
+ RADIO_CHANNEL_MEDICAL = FREQ_MEDICAL,
+ RADIO_CHANNEL_ENGINEERING = FREQ_ENGINEERING,
+ RADIO_CHANNEL_SECURITY = FREQ_SECURITY,
+ RADIO_CHANNEL_CENTCOM = FREQ_CENTCOM,
+ RADIO_CHANNEL_SYNDICATE = FREQ_SYNDICATE,
+ RADIO_CHANNEL_SUPPLY = FREQ_SUPPLY,
+ RADIO_CHANNEL_SERVICE = FREQ_SERVICE,
+ RADIO_CHANNEL_AI_PRIVATE = FREQ_AI_PRIVATE,
+ RADIO_CHANNEL_CTF_RED = FREQ_CTF_RED,
+ RADIO_CHANNEL_CTF_BLUE = FREQ_CTF_BLUE
))
GLOBAL_LIST_INIT(reverseradiochannels, list(
- "[FREQ_COMMON]" = "Common",
- "[FREQ_SCIENCE]" = "Science",
- "[FREQ_COMMAND]" = "Command",
- "[FREQ_MEDICAL]" = "Medical",
- "[FREQ_ENGINEERING]" = "Engineering",
- "[FREQ_SECURITY]" = "Security",
- "[FREQ_CENTCOM]" = "CentCom",
- "[FREQ_SYNDICATE]" = "Syndicate",
- "[FREQ_SUPPLY]" = "Supply",
- "[FREQ_SERVICE]" = "Service",
- "[FREQ_AI_PRIVATE]" = "AI Private",
- "[FREQ_CTF_RED]" = "Red Team",
- "[FREQ_CTF_BLUE]" = "Blue Team"
+ "[FREQ_COMMON]" = RADIO_CHANNEL_COMMON,
+ "[FREQ_SCIENCE]" = RADIO_CHANNEL_SCIENCE,
+ "[FREQ_COMMAND]" = RADIO_CHANNEL_COMMAND,
+ "[FREQ_MEDICAL]" = RADIO_CHANNEL_MEDICAL,
+ "[FREQ_ENGINEERING]" = RADIO_CHANNEL_ENGINEERING,
+ "[FREQ_SECURITY]" = RADIO_CHANNEL_SECURITY,
+ "[FREQ_CENTCOM]" = RADIO_CHANNEL_CENTCOM,
+ "[FREQ_SYNDICATE]" = RADIO_CHANNEL_SYNDICATE,
+ "[FREQ_SUPPLY]" = RADIO_CHANNEL_SUPPLY,
+ "[FREQ_SERVICE]" = RADIO_CHANNEL_SERVICE,
+ "[FREQ_AI_PRIVATE]" = RADIO_CHANNEL_AI_PRIVATE,
+ "[FREQ_CTF_RED]" = RADIO_CHANNEL_CTF_RED,
+ "[FREQ_CTF_BLUE]" = RADIO_CHANNEL_CTF_BLUE
))
/datum/radio_frequency
diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm
index e25c4f7716..18611ebfcb 100644
--- a/code/game/gamemodes/brother/traitor_bro.dm
+++ b/code/game/gamemodes/brother/traitor_bro.dm
@@ -6,6 +6,7 @@
name = "traitor+brothers"
config_tag = "traitorbro"
restricted_jobs = list("AI", "Cyborg")
+ protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Research Director")
announce_span = "danger"
announce_text = "There are Syndicate agents and Blood Brothers on the station!\n\
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 94ca86e0dd..808022d25f 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -52,7 +52,7 @@ Credit where due:
if(!istype(M))
return FALSE
if(M.mind)
- if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain")))
+ if(M.mind.assigned_role in list("Captain", "Chaplain"))
return FALSE
if(M.mind.enslaved_to && !is_servant_of_ratvar(M.mind.enslaved_to))
return FALSE
@@ -275,7 +275,7 @@ Credit where due:
gloves = /obj/item/clothing/gloves/color/yellow
belt = /obj/item/storage/belt/utility/servant
backpack_contents = list(/obj/item/storage/box/engineer = 1, \
- /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1, /obj/item/reagent_containers/food/drinks/holyoil = 1)
+ /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1, /obj/item/reagent_containers/food/drinks/bottle/holyoil = 1)
id = /obj/item/pda
var/plasmaman //We use this to determine if we should activate internals in post_equip()
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 8f091b6372..e7cc3c53ae 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -16,7 +16,7 @@
if(!istype(M))
return FALSE
if(M.mind)
- if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain")))
+ if(M.mind.assigned_role in list("Captain", "Chaplain"))
return FALSE
if(specific_cult && specific_cult.is_sacrifice_target(M.mind))
return FALSE
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index e56495d808..176f62ef2d 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -53,7 +53,7 @@
name = "the chief engineer's advanced magnetic boots."
targetitem = /obj/item/clothing/shoes/magboots/advance
difficulty = 5
- excludefromjob = list("Chief Engineer")
+ excludefromjob = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
/datum/objective_item/steal/capmedal
name = "the medal of captaincy."
@@ -62,10 +62,10 @@
excludefromjob = list("Captain")
/datum/objective_item/steal/hypo
- name = "the hypospray."
+ name = "the Chief Medical Officer's MKII hypospray."
targetitem = /obj/item/hypospray/mkii/CMO //CITADEL EDIT, changing theft objective for the Hypo MK II
difficulty = 5
- excludefromjob = list("Chief Medical Officer")
+ excludefromjob = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Geneticist")
/datum/objective_item/steal/nukedisc
name = "the nuclear authentication disk."
@@ -83,10 +83,10 @@
excludefromjob = list("Head of Security", "Warden")
/datum/objective_item/steal/reactive
- name = "the reactive teleport armor."
+ name = "a reactive teleport armor."
targetitem = /obj/item/clothing/suit/armor/reactive
difficulty = 5
- excludefromjob = list("Research Director")
+ excludefromjob = list("Research Director","Scientist", "Roboticist")
/datum/objective_item/steal/documents
name = "any set of secret documents of any organization."
@@ -143,7 +143,7 @@
name = "the station blueprints."
targetitem = /obj/item/areaeditor/blueprints
difficulty = 10
- excludefromjob = list("Chief Engineer")
+ excludefromjob = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
altitems = list(/obj/item/photo)
/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
@@ -159,7 +159,7 @@
name = "an unused sample of slime extract."
targetitem = /obj/item/slime_extract
difficulty = 3
- excludefromjob = list("Research Director","Scientist")
+ excludefromjob = list("Research Director","Scientist", "Roboticist")
/datum/objective_item/steal/slime/check_special_completion(obj/item/slime_extract/E)
if(E.Uses > 0)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index aa363428fb..76ea855c77 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -193,8 +193,10 @@
to_chat(usr, "Chem System Re-route detected, results may not be as expected!")
/obj/machinery/sleeper/emag_act(mob/user)
+ . = ..()
scramble_chem_buttons()
to_chat(user, "You scramble the sleeper's user interface!")
+ return TRUE
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user)
if((chem in available_chems) && chem_allowed(chem))
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 884b818f32..56227cdd53 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -177,7 +177,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
act_up()
/obj/machinery/announcement_system/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
act_up()
+ return TRUE
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 71dcb89ce7..0b9ed6bb3f 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -6,7 +6,7 @@
var/siphoning = FALSE
var/next_warning = 0
var/obj/item/radio/radio
- var/radio_channel = "Common"
+ var/radio_channel = RADIO_CHANNEL_COMMON
var/minimum_time_between_warnings = 400
/obj/machinery/computer/bank_machine/Initialize()
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 879be046c9..968cbe7254 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -101,12 +101,14 @@
return ..()
/obj/machinery/button/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
req_access = list()
req_one_access = list()
playsound(src, "sparks", 100, 1)
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/button/attack_ai(mob/user)
if(!panel_open)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index ba9b6fc225..a175558f74 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -31,7 +31,7 @@
var/internal_radio = TRUE
var/obj/item/radio/radio
var/radio_key = /obj/item/encryptionkey/headset_med
- var/radio_channel = "Medical"
+ var/radio_channel = RADIO_CHANNEL_MEDICAL
var/obj/effect/countdown/clonepod/countdown
@@ -163,15 +163,8 @@
H.hardset_dna(ui, se, H.real_name, null, mrace, features)
- if(efficiency > 2)
- var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
- H.dna.remove_mutation_group(unclean_mutations)
- if(efficiency > 5 && prob(20))
- H.randmutvg()
- if(efficiency < 3 && prob(50))
- var/mob/M = H.randmutb()
- if(ismob(M))
- H = M
+ if(prob(50 - efficiency*10)) //Chance to give a bad mutation.
+ H.randmutb() //100% bad mutation. Can be cured with mutadone.
H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
occupant = H
@@ -327,10 +320,12 @@
return ..()
/obj/machinery/clonepod/emag_act(mob/user)
+ . = ..()
if(!occupant)
return
to_chat(user, "You corrupt the genetic compiler.")
malfunction()
+ return TRUE
//Put messages in the connected computer's temp var for display.
/obj/machinery/clonepod/proc/connected_message(message)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 73fdcd5e8b..c317cbba0d 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -44,7 +44,7 @@
table.computer = src
break
-/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "operating_computer", name, 350, 470, master_ui, state)
@@ -125,4 +125,4 @@
. = TRUE
#undef MENU_OPERATION
-#undef MENU_SURGERIES
\ No newline at end of file
+#undef MENU_SURGERIES
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index e51d623c2f..1c517d6e8f 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -185,15 +185,19 @@
ui_interact(usr) //Refresh the UI after a filter changes
/obj/machinery/computer/apc_control/emag_act(mob/user)
+ . = ..()
if(!authenticated)
to_chat(user, "You bypass [src]'s access requirements using your emag.")
authenticated = TRUE
log_activity("logged in")
- else if(!(obj_flags & EMAGGED))
+ else
+ if(obj_flags & EMAGGED)
+ return
user.visible_message("You emag [src], disabling precise logging and allowing you to clear logs.")
log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], disabling operator tracking.")
obj_flags |= EMAGGED
- playsound(src, "sparks", 50, 1)
+ playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/computer/apc_control/proc/log_activity(log_text)
var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]"
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 8d0cfb95e8..4bce450359 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -45,8 +45,8 @@
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK,
/obj/item/hot_potato/harmless/toy = ARCADE_WEIGHT_RARE,
/obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/hypereutactic/toy = ARCADE_WEIGHT_RARE,
- /obj/item/twohanded/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
+ /obj/item/twohanded/dualsaber/hypereutactic/toy = ARCADE_WEIGHT_RARE,
+ /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
/obj/item/storage/box/snappops = ARCADE_WEIGHT_TRICK,
/obj/item/clothing/under/syndicate/tacticool = ARCADE_WEIGHT_TRICK,
@@ -57,6 +57,7 @@
/obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK,
+ /obj/item/clothing/gloves/rapid/hug = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK,
diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm
index ded9cf95f6..b906b1afb5 100644
--- a/code/game/machinery/computer/arcade/battle.dm
+++ b/code/game/machinery/computer/arcade/battle.dm
@@ -186,6 +186,7 @@
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!")
@@ -202,5 +203,5 @@
enemy_name = "Cuban Pete"
name = "Outbomb Cuban Pete"
-
updateUsrDialog()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade/minesweeper.dm b/code/game/machinery/computer/arcade/minesweeper.dm
index fe69860f76..641ef1c9cd 100644
--- a/code/game/machinery/computer/arcade/minesweeper.dm
+++ b/code/game/machinery/computer/arcade/minesweeper.dm
@@ -250,11 +250,11 @@
itemname = "a syndicate bomb beacon"
new /obj/item/sbeacondrop/bomb(loc)
if(2)
- itemname = "a grenade launcher"
- new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(loc)
- new /obj/item/ammo_casing/a40mm(loc)
- new /obj/item/ammo_casing/a40mm(loc)
- new /obj/item/ammo_casing/a40mm(loc)
+ itemname = "a rocket launcher"
+ new /obj/item/gun/ballistic/rocketlauncher/unrestricted(loc)
+ new /obj/item/ammo_casing/caseless/rocket(loc)
+ new /obj/item/ammo_casing/caseless/rocket(loc)
+ new /obj/item/ammo_casing/caseless/rocket(loc)
if(3)
itemname = "two bags of c4"
new /obj/item/storage/backpack/duffelbag/syndie/c4(loc)
@@ -284,6 +284,7 @@
return
/obj/machinery/computer/arcade/minesweeper/emag_act(mob/user)
+ . = ..()
if(CHECK_BITFIELD(obj_flags, EMAGGED))
return
desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!"
@@ -298,6 +299,7 @@
to_chat(user, "The machine buzzes and sparks... the game has been reset!")
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz
game_status = MINESWEEPER_GAME_MAIN_MENU
+ return TRUE
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
diff --git a/code/game/machinery/computer/arcade/orion_trail.dm b/code/game/machinery/computer/arcade/orion_trail.dm
index 12941dea35..023b1048ce 100644
--- a/code/game/machinery/computer/arcade/orion_trail.dm
+++ b/code/game/machinery/computer/arcade/orion_trail.dm
@@ -736,6 +736,7 @@
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.")
@@ -743,6 +744,7 @@
desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
newgame()
obj_flags |= EMAGGED
+ return TRUE
/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
name = "spaceport security"
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 86fcefb340..43582e39bf 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -361,14 +361,16 @@
return
button_icon_state = "warp_down"
owner.update_action_buttons()
+ QDEL_NULL(warping)
+ if(!do_teleport(user, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
+ to_chat(user, "Warp Failed. Something deflected our attempt to warp to [AR].")
+ return
T.visible_message("[user] warps in!")
playsound(user, 'sound/magic/magic_missile.ogg', 50, TRUE)
playsound(T, 'sound/magic/magic_missile.ogg', 50, TRUE)
- user.forceMove(get_turf(T))
user.setDir(SOUTH)
flash_color(user, flash_color = "#AF0AAF", flash_time = 5)
R.remove_eye_control(user)
- QDEL_NULL(warping)
/datum/action/innate/servant_warp/proc/is_canceled()
return !cancel
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 39d5c3d56f..1654768de0 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -1,4 +1,4 @@
-#define AUTOCLONING_MINIMAL_LEVEL 3
+#define AUTOCLONING_MINIMAL_LEVEL 4
/obj/machinery/computer/cloning
name = "cloning console"
@@ -13,17 +13,20 @@
var/scantemp_ckey
var/scantemp = "Ready to Scan"
var/menu = 1 //Which menu screen to display
- var/list/records = list()
var/datum/data/record/active_record = null
var/obj/item/disk/data/diskette = null //Mostly so the geneticist can steal everything.
var/loading = 0 // Nice loading text
var/autoprocess = 0
+ var/list/records = list()
light_color = LIGHT_COLOR_BLUE
/obj/machinery/computer/cloning/Initialize()
. = ..()
updatemodules(TRUE)
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ records = board.records
+
/obj/machinery/computer/cloning/Destroy()
if(pods)
@@ -346,6 +349,8 @@
active_record = null
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
src.menu = 2
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ board.records = records
else
src.temp = "Access Denied."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
@@ -368,6 +373,8 @@
for(var/key in diskette.fields)
src.active_record.fields[key] = diskette.fields[key]
src.temp = "Load successful."
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ board.records = records
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if("eject")
@@ -502,5 +509,7 @@
R.fields["imp"] = "[REF(imp)]"
src.records += R
+ var/obj/item/circuitboard/computer/cloning/board = circuit
+ board.records = records
scantemp = "Subject successfully scanned."
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 752765baa1..eceaefd2b2 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -432,6 +432,7 @@
return ..()
/obj/machinery/computer/communications/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -440,6 +441,7 @@
authenticated = 2
to_chat(user, "You scramble the communication routing circuits!")
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
+ return TRUE
/obj/machinery/computer/communications/ui_interact(mob/user)
. = ..()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 1081cb5fa7..365d19b826 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1280,20 +1280,23 @@
return !density || (check_access(ID) && !locked && hasPower())
/obj/machinery/door/airlock/emag_act(mob/user)
- if(!operating && density && hasPower() && !(obj_flags & EMAGGED))
- operating = TRUE
- update_icon(AIRLOCK_EMAG, 1)
- sleep(6)
- if(QDELETED(src))
- return
- operating = FALSE
- if(!open())
- update_icon(AIRLOCK_CLOSED, 1)
- obj_flags |= EMAGGED
- lights = FALSE
- locked = TRUE
- loseMainPower()
- loseBackupPower()
+ . = ..()
+ if(operating || !density || !hasPower() || obj_flags & EMAGGED)
+ return
+ operating = TRUE
+ update_icon(AIRLOCK_EMAG, 1)
+ addtimer(CALLBACK(src, .proc/open_sesame), 6)
+ return TRUE
+
+/obj/machinery/door/airlock/proc/open_sesame()
+ operating = FALSE
+ if(!open())
+ update_icon(AIRLOCK_CLOSED, 1)
+ obj_flags |= EMAGGED
+ lights = FALSE
+ locked = TRUE
+ loseMainPower()
+ loseBackupPower()
/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user)
add_fingerprint(user)
diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm
index 2e7e7d5cba..702f700617 100644
--- a/code/game/machinery/doors/unpowered.dm
+++ b/code/game/machinery/doors/unpowered.dm
@@ -13,9 +13,6 @@
else
return ..()
-/obj/machinery/door/unpowered/emag_act()
- return
-
/obj/machinery/door/unpowered/shuttle
icon = 'icons/turf/shuttle.dmi'
name = "door"
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 97ab664b85..933bb4f42a 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -206,15 +206,20 @@
..()
/obj/machinery/door/window/emag_act(mob/user)
- if(!operating && density && !(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
- operating = TRUE
- flick("[src.base_state]spark", src)
- playsound(src, "sparks", 75, 1)
- sleep(6)
- operating = FALSE
- desc += "
Its access panel is smoking slightly."
- open(2)
+ . = ..()
+ if(operating || !density || obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ operating = TRUE
+ flick("[src.base_state]spark", src)
+ playsound(src, "sparks", 75, 1)
+ addtimer(CALLBACK(src, .proc/open_windows_me), 6)
+ return TRUE
+
+/obj/machinery/door/window/proc/open_windows_me()
+ operating = FALSE
+ desc += "
Its access panel is smoking slightly."
+ open(2)
/obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params)
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index 70ce3d36ae..3b9322d207 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -26,6 +26,7 @@
findObjsByTag()
/obj/machinery/doorButtons/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -33,6 +34,7 @@
req_one_access = list()
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
/obj/machinery/doorButtons/proc/removeMe()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 8f0d56a49e..5c2676c2b9 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -97,6 +97,7 @@
alarm()
/obj/machinery/firealarm/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -104,6 +105,7 @@
user.visible_message("Sparks fly out of [src]!",
"You emag [src], disabling its thermal sensors.")
playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !stat)
diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm
index c955edbcd0..320430be39 100644
--- a/code/game/machinery/gulag_item_reclaimer.dm
+++ b/code/game/machinery/gulag_item_reclaimer.dm
@@ -24,13 +24,15 @@
return ..()
/obj/machinery/gulag_item_reclaimer/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED) // emagging lets anyone reclaim all the items
return
req_access = list()
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/card/id/prisoner))
+ if(istype(I, /obj/item/card/id))
if(!inserted_id)
if(!user.transferItemToLoc(I, src))
return
@@ -83,7 +85,7 @@
usr.put_in_hands(inserted_id)
inserted_id = null
else
- var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner)
+ var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id)
if(I)
if(!usr.transferItemToLoc(I, src))
return
diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm
index 8be7becfdd..1fccadda21 100644
--- a/code/game/machinery/harvester.dm
+++ b/code/game/machinery/harvester.dm
@@ -158,11 +158,13 @@
open_machine()
/obj/machinery/harvester/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
allow_living = TRUE
to_chat(user, "You overload [src]'s lifesign scanners.")
+ return TRUE
/obj/machinery/harvester/container_resist(mob/living/user)
if(!harvesting)
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index f57e210da8..b217c14e53 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -63,7 +63,7 @@
if(91 to INFINITY)
filling_overlay.icon_state = "reagent100"
- filling_overlay.color = list("#0000", "#0000", "#0000", "#000f", mix_color_from_reagents(beaker.reagents.reagent_list))
+ filling_overlay.color = mix_color_from_reagents(beaker.reagents.reagent_list)
add_overlay(filling_overlay)
/obj/machinery/iv_drip/MouseDrop(mob/living/target)
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 4016c32162..db59f3f413 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -127,7 +127,7 @@
if(first_inner)
log_msg += "empty"
log_msg += ")"
- do_teleport(ROI, dest, no_effects = !first)
+ do_teleport(ROI, dest, no_effects = !first, channel = TELEPORT_CHANNEL_BLUESPACE)
first = FALSE
if (first)
@@ -206,7 +206,7 @@
/obj/item/storage/briefcase/launchpad/PopulateContents()
new /obj/item/pen(src)
- new /obj/item/launchpad_remote(src, pad)
+ new /obj/item/launchpad_remote(src, pad)
/obj/item/storage/briefcase/launchpad/attack_self(mob/user)
if(!isturf(user.loc)) //no setting up in a locker
@@ -227,7 +227,7 @@
L.pad = src.pad
to_chat(user, "You link [pad] to [L].")
else
- return ..()
+ return ..()
/obj/item/launchpad_remote
name = "folder"
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index a3250fe1b0..59806e97a4 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -215,6 +215,7 @@
return dat
/obj/machinery/limbgrower/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
for(var/id in SSresearch.techweb_designs)
@@ -223,3 +224,4 @@
stored_research.add_design(D)
to_chat(user, "A warning flashes onto the screen, stating that safety overrides have been deactivated!")
obj_flags |= EMAGGED
+ return TRUE
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index b0204ddeb8..b0a75c99dc 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -290,6 +290,7 @@
return ..()
/obj/machinery/porta_turret/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You short out [src]'s threat assessment circuits.")
@@ -300,6 +301,7 @@
update_icon()
sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
on = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
+ return TRUE
/obj/machinery/porta_turret/emp_act(severity)
@@ -837,6 +839,7 @@
to_chat(user, "Access denied.")
/obj/machinery/turretid/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You short out the turret controls' access analysis module.")
@@ -844,6 +847,7 @@
locked = FALSE
if(user && user.machine == src)
attack_hand(user)
+ return TRUE
/obj/machinery/turretid/attack_ai(mob/user)
if(!ailock || IsAdminGhost(user))
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index 6ff795c1cc..afb00d4ee2 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -86,10 +86,13 @@
. = 0
/obj/machinery/porta_turret_cover/emag_act(mob/user)
- if(!(parent_turret.obj_flags & EMAGGED))
- to_chat(user, "You short out [parent_turret]'s threat assessment circuits.")
- visible_message("[parent_turret] hums oddly...")
- parent_turret.obj_flags |= EMAGGED
- parent_turret.on = 0
- spawn(40)
- parent_turret.on = 1
+ . = ..()
+ if(parent_turret.obj_flags & EMAGGED)
+ return
+ to_chat(user, "You short out [parent_turret]'s threat assessment circuits.")
+ visible_message("[parent_turret] hums oddly...")
+ parent_turret.obj_flags |= EMAGGED
+ parent_turret.on = 0
+ spawn(40)
+ parent_turret.on = 1
+ return TRUE
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index 7a8552607b..b5ef38b42c 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -36,7 +36,7 @@
to_chat(user, "The panel is screwed in, obstructing the linking device.")
else
to_chat(user, "The linking device is now able to be scanned with a multitool.")
-
+
/obj/machinery/quantumpad/RefreshParts()
var/E = 0
for(var/obj/item/stock_parts/capacitor/C in component_parts)
@@ -74,15 +74,26 @@
to_chat(user, "There is no quantum pad data saved in [I]'s buffer!")
return TRUE
+ else if(istype(I, /obj/item/quantum_keycard))
+ var/obj/item/quantum_keycard/K = I
+ if(K.qpad)
+ to_chat(user, "You insert [K] into [src]'s card slot, activating it.")
+ interact(user, K.qpad)
+ else
+ to_chat(user, "You insert [K] into [src]'s card slot, initiating the link procedure.")
+ if(do_after(user, 40, target = src))
+ to_chat(user, "You complete the link between [K] and [src].")
+ K.qpad = src
+
if(default_deconstruction_crowbar(I))
return
return ..()
-/obj/machinery/quantumpad/interact(mob/user)
- if(!linked_pad || QDELETED(linked_pad))
+/obj/machinery/quantumpad/interact(mob/user, obj/machinery/quantumpad/target_pad = linked_pad)
+ if(!target_pad || QDELETED(target_pad))
if(!map_pad_link_id || !initMappedLink())
- to_chat(user, "There is no linked pad!")
+ to_chat(user, "Target pad not found!")
return
if(world.time < last_teleport + teleport_cooldown)
@@ -93,18 +104,18 @@
to_chat(user, "[src] is charging up. Please wait.")
return
- if(linked_pad.teleporting)
- to_chat(user, "Linked pad is busy. Please wait.")
+ if(target_pad.teleporting)
+ to_chat(user, "Target pad is busy. Please wait.")
return
- if(linked_pad.stat & NOPOWER)
- to_chat(user, "Linked pad is not responding to ping.")
+ if(target_pad.stat & NOPOWER)
+ to_chat(user, "Target pad is not responding to ping.")
return
add_fingerprint(user)
- doteleport(user)
+ doteleport(user, target_pad)
/obj/machinery/quantumpad/proc/sparks()
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ var/datum/effect_system/spark_spread/quantum/s = new
s.set_up(5, 1, get_turf(src))
s.start()
@@ -117,8 +128,8 @@
if(linked_pad)
ghost.forceMove(get_turf(linked_pad))
-/obj/machinery/quantumpad/proc/doteleport(mob/user)
- if(linked_pad)
+/obj/machinery/quantumpad/proc/doteleport(mob/user, obj/machinery/quantumpad/target_pad = linked_pad)
+ if(target_pad)
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
teleporting = TRUE
@@ -130,7 +141,7 @@
to_chat(user, "[src] is unpowered!")
teleporting = FALSE
return
- if(!linked_pad || QDELETED(linked_pad) || linked_pad.stat & NOPOWER)
+ if(!target_pad || QDELETED(target_pad) || target_pad.stat & NOPOWER)
to_chat(user, "Linked pad is not responding to ping. Teleport aborted.")
teleporting = FALSE
return
@@ -141,26 +152,30 @@
// use a lot of power
use_power(10000 / power_efficiency)
sparks()
- linked_pad.sparks()
+ target_pad.sparks()
flick("qpad-beam", src)
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
- flick("qpad-beam", linked_pad)
- playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
+ flick("qpad-beam", target_pad)
+ playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
for(var/atom/movable/ROI in get_turf(src))
+ if(QDELETED(ROI))
+ continue //sleeps in CHECK_TICK
+
// if is anchored, don't let through
if(ROI.anchored)
if(isliving(ROI))
var/mob/living/L = ROI
- if(L.buckled)
- // TP people on office chairs
- if(L.buckled.anchored)
- continue
+ //only TP living mobs buckled to non anchored items
+ if(!L.buckled || L.buckled.anchored)
+ continue
else
continue
+ //Don't TP camera mobs
else if(!isobserver(ROI))
continue
- do_teleport(ROI, get_turf(linked_pad))
+ do_teleport(ROI, get_turf(target_pad),null,TRUE,null,null,null,null,TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
+ CHECK_TICK
/obj/machinery/quantumpad/proc/initMappedLink()
. = FALSE
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index ff40a8539a..9d431487e0 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -65,6 +65,7 @@
return ..()
/obj/machinery/recycler/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -73,6 +74,7 @@
update_icon()
playsound(src, "sparks", 75, 1, -1)
to_chat(user, "You use the cryptographic sequencer on [src].")
+ return TRUE
/obj/machinery/recycler/update_icon()
..()
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index e2aebd2370..fc6577a4f1 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -195,6 +195,7 @@
return ..()
/obj/machinery/shieldgen/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "The access controller is damaged!")
return
@@ -202,6 +203,7 @@
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
/obj/machinery/shieldgen/update_icon()
if(active)
@@ -387,6 +389,7 @@
add_fingerprint(user)
/obj/machinery/shieldwallgen/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "The access controller is damaged!")
return
@@ -394,6 +397,7 @@
locked = FALSE
playsound(src, "sparks", 100, 1)
to_chat(user, "You short out the access controller.")
+ return TRUE
//////////////Containment Field START
/obj/machinery/shieldwall
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 298587cdea..4b73032a8a 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -99,6 +99,7 @@
return ..()
/obj/machinery/computer/slot_machine/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
@@ -106,6 +107,7 @@
spark_system.set_up(4, 0, src.loc)
spark_system.start()
playsound(src, "sparks", 50, 1)
+ return TRUE
/obj/machinery/computer/slot_machine/ui_interact(mob/living/user)
. = ..()
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index b11c6c102d..ebb40148d8 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -42,21 +42,23 @@
return ..()
/obj/machinery/computer/message_monitor/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
- if(!isnull(linkedServer))
- obj_flags |= EMAGGED
- screen = 2
- spark_system.set_up(5, 0, src)
- spark_system.start()
- var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
- // Will help make emagging the console not so easy to get away with.
- MK.info += "
�%@%(*$%&(�&?*(%&�/{}"
- var/time = 100 * length(linkedServer.decryptkey)
- addtimer(CALLBACK(src, .proc/UnmagConsole), time)
- message = rebootmsg
- else
+ if(isnull(linkedServer))
to_chat(user, "A no server error appears on the screen.")
+ return
+ obj_flags |= EMAGGED
+ screen = 2
+ spark_system.set_up(5, 0, src)
+ spark_system.start()
+ var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
+ // Will help make emagging the console not so easy to get away with.
+ MK.info += "
�%@%(*$%&(�&?*(%&�/{}"
+ var/time = 100 * length(linkedServer.decryptkey)
+ addtimer(CALLBACK(src, .proc/UnmagConsole), time)
+ message = rebootmsg
+ return TRUE
/obj/machinery/computer/message_monitor/New()
. = ..()
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index cc83e6502a..1f1f13ee22 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -66,18 +66,18 @@
visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.")
return
if (ismovableatom(M))
- if(do_teleport(M, com.target))
+ if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE))
use_power(5000)
- if(!calibrated && prob(30 - ((accurate) * 10))) //oh dear a problem
- log_game("[M] ([key_name(M)]) was turned into a fly person")
- if(ishuman(M))//don't remove people from the round randomly you jerks
- var/mob/living/carbon/human/human = M
- if(human.dna && human.dna.species.id == "human")
- to_chat(M, "You hear a buzzing in your ears.")
- human.set_species(/datum/species/fly)
- human.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0)
- calibrated = 0
+ if(!calibrated && iscarbon(M) && prob(30 - ((accurate) * 10))) //oh dear a problem
+ var/mob/living/carbon/C = M
+ if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE))
+ to_chat(C, "You hear a buzzing in your ears.")
+ C.set_species(/datum/species/fly)
+ log_game("[C] ([key_name(C)]) was turned into a fly person")
+ C.apply_effect((rand(120 - accurate * 40, 180 - accurate * 60)), EFFECT_IRRADIATE, 0)
+
+ calibrated = FALSE
return
/obj/machinery/teleport/hub/update_icon()
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 0a9a135986..5e8515d3d5 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -95,6 +95,12 @@
var/obj/item/toy/crayon/CR = WM.color_source
add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
+/obj/item/reagents_containers/rag/towel/machine_wash(obj/machinery/washing_machine/WM)
+ if(WM.color_source)
+ if(istype(WM.color_source, /obj/item/toy/crayon))
+ var/obj/item/toy/crayon/CR = WM.color_source
+ add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY)
+
/mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM)
gib()
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 7896d7aa35..cd7051d074 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -20,3 +20,6 @@
..()
defense_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 95137938d0..f9fa2544b8 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -63,3 +63,6 @@
..()
thrusters_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index 125aecd667..4c32e9c367 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -154,4 +154,6 @@
color = color+pick(colors)
return color
-
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index f5f369c2ad..1264a647c4 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -28,3 +28,6 @@
switch_damtype_action.Remove(user)
phasing_action.Remove(user)
+/obj/mecha/combat/Initialize()
+ . = ..()
+ trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 8a5a83379d..23be95ff16 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -76,6 +76,9 @@
return 0
if(energy_drain && !chassis.has_charge(energy_drain))
return 0
+ if(chassis.equipment_disabled)
+ to_chat(chassis.occupant, "Error -- Equipment control unit is unresponsive.")
+ return 0
return 1
/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target)
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index ba08109427..21bbdfd14b 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -159,15 +159,15 @@
t1 = "*dead*"
else
t1 = "Unknown"
- return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
- Core Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
- Brute Damage: [patient.getBruteLoss()]%
- Respiratory Damage: [patient.getOxyLoss()]%
- Toxin Content: [patient.getToxLoss()]%
- Burn Severity: [patient.getFireLoss()]%
- [patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
- [patient.getBrainLoss() ? "Significant brain damage detected." : ""]
- [length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
+ return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
+ Core Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
+ Brute Damage: [patient.getBruteLoss()]%
+ Respiratory Damage: [patient.getOxyLoss()]%
+ Toxin Content: [patient.getToxLoss()]%
+ Burn Severity: [patient.getFireLoss()]%
+ [patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
+ [patient.getBrainLoss() ? "Significant brain damage detected." : ""]
+ [length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
"}
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents()
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 80c92c7922..a8ba9850ff 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -17,7 +17,7 @@
return
var/turf/T = get_turf(target)
if(T)
- do_teleport(chassis, T, 4)
+ do_teleport(chassis, T, 4, channel = TELEPORT_CHANNEL_BLUESPACE)
return 1
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 01e304872f..e1dc80911f 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -64,10 +64,15 @@
/obj/machinery/mecha_part_fabricator/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
req_access = list()
+ INVOKE_ASYNC(src, .proc/error_action_sucessful)
+ return TRUE
+
+/obj/machinery/mecha_part_fabricator/proc/error_action_sucessful()
say("DB error \[Code 0x00F1\]")
sleep(10)
say("Attempting auto-repair...")
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index fc0665f51e..22aac63d2b 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -42,6 +42,7 @@
var/last_message = 0
var/add_req_access = 1
var/maint_access = 0
+ var/equipment_disabled = 0 //disabled due to EMP
var/dna_lock //dna-locking the mech
var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference
var/datum/effect_system/spark_spread/spark_system = new
@@ -143,7 +144,6 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
- diag_hud_set_mechtracking()
/obj/mecha/get_cell()
return cell
@@ -205,6 +205,15 @@
GLOB.mechas_list -= src //global mech list
return ..()
+/obj/mecha/proc/restore_equipment()
+ equipment_disabled = 0
+ if(istype(src, /obj/mecha/combat))
+ mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
+ if(occupant)
+ SEND_SOUND(occupant, sound('sound/items/timer.ogg', volume=50))
+ to_chat(occupant, "Equipment control unit has been rebooted successfuly.")
+ occupant.update_mouse_pointer()
+
/obj/mecha/CheckParts(list/parts_list)
..()
cell = locate(/obj/item/stock_parts/cell) in contents
@@ -394,8 +403,6 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
- diag_hud_set_mechtracking()
-
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 714c66d032..3b957431f7 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -11,8 +11,8 @@
var/obj/mecha/M = new result(drop_location())
QDEL_NULL(M.cell)
- var/atom/parent_atom = parent
- M.CheckParts(parent_atom.contents)
+ var/obj/item/mecha_parts/chassis/parent_chassis = parent
+ M.CheckParts(parent_chassis.contents)
SSblackbox.record_feedback("tally", "mechas_created", 1, M.name)
QDEL_NULL(parent)
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 1524da42f2..18c9b3eb2f 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -21,8 +21,9 @@
var/answer = TR.get_mecha_info()
if(answer)
dat += {"
[answer]
- Send message
- Show exosuit log | (EMP pulse)
"}
+ Send message
+ Show exosuit log
+ [TR.recharging?"Recharging EMP Pulse...
":"(EMP Pulse)
"]"}
if(screen==1)
dat += "Log contents
"
@@ -65,6 +66,7 @@
icon_state = "motion2"
w_class = WEIGHT_CLASS_SMALL
var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.
+ var/recharging = 0
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
if(!in_mecha())
@@ -102,10 +104,16 @@
return 0
/obj/item/mecha_parts/mecha_tracking/proc/shock()
+ if(recharging)
+ return
var/obj/mecha/M = in_mecha()
if(M)
- M.emp_act(EMP_LIGHT)
- qdel(src)
+ M.emp_act(EMP_HEAVY)
+ addtimer(CALLBACK(src, /obj/item/mecha_parts/mecha_tracking/proc/recharge), 15 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ recharging = 1
+
+/obj/item/mecha_parts/mecha_tracking/proc/recharge()
+ recharging = 0
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
if(!ismecha(loc))
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 367c750787..62a62b569d 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -149,7 +149,14 @@
use_power((cell.charge/3)/(severity*2))
take_damage(30 / severity, BURN, "energy", 1)
log_message("EMP detected", color="red")
- check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
+
+ if(istype(src, /obj/mecha/combat))
+ mouse_pointer = 'icons/mecha/mecha_mouse-disable.dmi'
+ occupant?.update_mouse_pointer()
+ if(!equipment_disabled && occupant) //prevent spamming this message with back-to-back EMPs
+ to_chat(occupant, "Error -- Connection to equipment control unit has been lost.")
+ addtimer(CALLBACK(src, /obj/mecha/proc/restore_equipment), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ equipment_disabled = 1
/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature>max_temperature)
diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm
index e86b5174cc..8b4e48cd3e 100644
--- a/code/game/mecha/medical/medical.dm
+++ b/code/game/mecha/medical/medical.dm
@@ -1,8 +1,3 @@
-/obj/mecha/medical/Initialize()
- . = ..()
- trackers += new /obj/item/mecha_parts/mecha_tracking(src)
-
-
/obj/mecha/medical/mechturn(direction)
setDir(direction)
playsound(src,'sound/mecha/mechmove01.ogg',40,1)
@@ -18,4 +13,4 @@
var/result = step_rand(src)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',25,1)
- return result
\ No newline at end of file
+ return result
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index 498ccd94fa..c9e7d99ac0 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -1,6 +1,3 @@
/obj/mecha/working
internal_damage_threshold = 60
-/obj/mecha/working/Initialize()
- . = ..()
- trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 91df57052e..fbe25c5d1b 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -190,11 +190,11 @@
/obj/effect/anomaly/bluespace/anomalyEffect()
..()
for(var/mob/living/M in range(1,src))
- do_teleport(M, locate(M.x, M.y, M.z), 4)
+ do_teleport(M, locate(M.x, M.y, M.z), 4, channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/effect/anomaly/bluespace/Bumped(atom/movable/AM)
if(isliving(AM))
- do_teleport(AM, locate(AM.x, AM.y, AM.z), 8)
+ do_teleport(AM, locate(AM.x, AM.y, AM.z), 8, channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/effect/anomaly/bluespace/detonate()
var/turf/T = safepick(get_area_turfs(impact_area))
diff --git a/code/game/objects/effects/blessing.dm b/code/game/objects/effects/blessing.dm
index 06ba2bb47c..5df90d65c7 100644
--- a/code/game/objects/effects/blessing.dm
+++ b/code/game/objects/effects/blessing.dm
@@ -16,3 +16,12 @@
I.alpha = 64
I.appearance_flags = RESET_ALPHA
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/blessedAware, "blessing", I)
+ RegisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORT, .proc/block_cult_teleport)
+
+/obj/effect/blessing/Destroy()
+ UnregisterSignal(loc, COMSIG_ATOM_INTERCEPT_TELEPORT)
+ return ..()
+
+/obj/effect/blessing/proc/block_cult_teleport(datum/source, channel, turf/origin, turf/destination)
+ if(channel == TELEPORT_CHANNEL_CULT)
+ return COMPONENT_BLOCK_TELEPORT
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index cc69b88cc4..9f072c48b6 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -42,6 +42,9 @@
/obj/effect/decal/cleanable/glass/ex_act()
qdel(src)
+/obj/effect/decal/cleanable/glass/plasma
+ icon_state = "plasmatiny"
+
/obj/effect/decal/cleanable/dirt
name = "dirt"
desc = "Someone should clean that up."
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 0656d9b3ca..19b0dc76dd 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -26,7 +26,7 @@
/obj/effect/particle_effect/sparks/Initialize()
. = ..()
- flick("sparks", src) // replay the animation
+ flick(icon_state, src) // replay the animation
playsound(src, "sparks", 100, TRUE)
var/turf/T = loc
if(isturf(T))
@@ -48,6 +48,8 @@
/datum/effect_system/spark_spread
effect_type = /obj/effect/particle_effect/sparks
+/datum/effect_system/spark_spread/quantum
+ effect_type = /obj/effect/particle_effect/sparks/quantum
//electricity
@@ -55,5 +57,9 @@
name = "lightning"
icon_state = "electricity"
+/obj/effect/particle_effect/sparks/quantum
+ name = "quantum sparks"
+ icon_state = "quantum_sparks"
+
/datum/effect_system/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index d69cfd38ef..631b87cada 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -20,6 +20,7 @@
var/mech_sized = FALSE
var/obj/effect/portal/linked
var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted.
+ var/teleport_channel = TELEPORT_CHANNEL_BLUESPACE
var/creator
var/turf/hard_target //For when a portal needs a hard target and isn't to be linked.
var/atmos_link = FALSE //Link source/destination atmos.
@@ -34,6 +35,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "anom"
mech_sized = TRUE
+ teleport_channel = TELEPORT_CHANNEL_WORMHOLE
/obj/effect/portal/Move(newloc)
for(var/T in newloc)
@@ -160,7 +162,7 @@
no_effect = TRUE
else
last_effect = world.time
- if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect))
+ if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel))
if(istype(M, /obj/item/projectile))
var/obj/item/projectile/P = M
P.ignore_source_check = TRUE
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 384a1e4ee4..566a64577d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -33,6 +33,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/usesound = null
var/throwhitsound = null
var/w_class = WEIGHT_CLASS_NORMAL
+ var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds.
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
pressure_resistance = 4
@@ -579,6 +580,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
/obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
+/obj/item/proc/get_worn_belt_overlay(icon_file)
+ return
+
/obj/item/proc/update_slot_icon()
if(!ismob(loc))
return
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 8895bffd70..1ff3c7df9f 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -616,7 +616,7 @@ RLD
name = "rapid-light-device (RLD)"
desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
- icon_state = "rld-5"
+ icon_state = "rld"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 500
@@ -625,6 +625,7 @@ RLD
var/mode = LIGHT_MODE
actions_types = list(/datum/action/item_action/pick_color)
ammo_sections = 5
+ has_ammobar = TRUE
var/wallcost = 10
var/floorcost = 15
@@ -638,6 +639,10 @@ RLD
var/color_choice = null
+/obj/item/construction/rld/Initialize()
+ . = ..()
+ update_icon()
+
/obj/item/construction/rld/ui_action_click(mob/user, var/datum/action/A)
if(istype(A, /datum/action/item_action/pick_color))
color_choice = input(user,"","Choose Color",color_choice) as color
@@ -645,9 +650,10 @@ RLD
..()
/obj/item/construction/rld/update_icon()
- icon_state = "rld-[round((matter/max_matter) * 5, 1)]"
..()
-
+ var/ratio = CEILING((matter / max_matter) * ammo_sections, 1)
+ cut_overlays() //To prevent infinite stacking of overlays
+ add_overlay("rld_light[ratio]")
/obj/item/construction/rld/attack_self(mob/user)
..()
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index cea8165e02..63f460f9aa 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -2,7 +2,7 @@
name = "rapid cable layer"
desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!"
icon = 'icons/obj/tools.dmi'
- icon_state = "rcl-0"
+ icon_state = "rcl-empty"
item_state = "rcl-0"
var/obj/structure/cable/last
var/obj/item/stack/cable_coil/loaded
@@ -92,22 +92,32 @@
/obj/item/twohanded/rcl/update_icon()
if(!loaded)
- icon_state = "rcl-0"
- item_state = "rcl-0"
+ icon_state = "rcl-empty"
+ item_state = "rcl-empty"
return
+ cut_overlays()
+ var/cable_amount = 0
switch(loaded.amount)
if(61 to INFINITY)
- icon_state = "rcl-30"
- item_state = "rcl"
+ cable_amount = 3
if(31 to 60)
- icon_state = "rcl-20"
- item_state = "rcl"
+ cable_amount = 2
if(1 to 30)
- icon_state = "rcl-10"
- item_state = "rcl"
+ cable_amount = 1
else
- icon_state = "rcl-0"
- item_state = "rcl-0"
+ cable_amount = 0
+
+ var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]")
+ cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
+ if(cable_amount >= 1)
+ icon_state = "rcl"
+ item_state = "rcl"
+ add_overlay(cable_overlay)
+ else
+ icon_state = "rcl-empty"
+ item_state = "rcl-0"
+ add_overlay(cable_overlay)
+
/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
update_icon()
@@ -302,6 +312,7 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook)
to_chat(user, "Color changed to [cwname]!")
if(loaded)
loaded.item_color= colors[current_color_index]
+ update_icon()
if(wiring_gui_menu)
wiringGuiUpdate(user)
else if(istype(action, /datum/action/item_action/rcl_gui))
@@ -318,13 +329,29 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook)
/obj/item/twohanded/rcl/ghetto/update_icon()
if(!loaded)
- icon_state = "rclg-0"
+ icon_state = "rclg-empty"
item_state = "rclg-0"
return
+ cut_overlays()
+ var/cable_amount = 0
switch(loaded.amount)
- if(1 to INFINITY)
- icon_state = "rclg-1"
- item_state = "rcl"
+ if(20 to INFINITY)
+ cable_amount = 3
+ if(10 to 19)
+ cable_amount = 2
+ if(1 to 9)
+ cable_amount = 1
else
- icon_state = "rclg-1"
- item_state = "rclg-1"
+ cable_amount = 0
+
+ var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]")
+ cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
+ if(cable_amount >= 1)
+ icon_state = "rclg"
+ item_state = "rclg"
+ add_overlay(cable_overlay)
+ else
+ icon_state = "rclg-empty"
+ item_state = "rclg-0"
+ add_overlay(cable_overlay)
+
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index 6dbf0c2ad3..141f7e510a 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -177,6 +177,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
desc = "A device used to rapidly pipe things."
icon = 'icons/obj/tools.dmi'
icon_state = "rpd"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
force = 10
throwforce = 10
@@ -435,6 +437,10 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
to_chat(user, "You start building a transit tube...")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, transit_build_speed, target = A))
+ for(var/obj/structure/c_transit_tube/tube in A)
+ if(tube.dir == queued_p_dir || (queued_p_flipped && (tube.dir == turn(queued_p_dir, 45))))
+ to_chat(user, "[src]'s error light flickers; there's already a pipe in the way!")
+ return
activate()
if(queued_p_type == /obj/structure/c_transit_tube_pod)
var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(A)
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index f0d15cc3a2..01205ee889 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -134,12 +134,14 @@ RSF
return
/obj/item/cookiesynth/emag_act(mob/user)
+ . = ..()
obj_flags ^= EMAGGED
if(obj_flags & EMAGGED)
to_chat(user, "You short out [src]'s reagent safety checker!")
else
to_chat(user, "You reset [src]'s reagent safety checker!")
- toxin = 0
+ toxin = FALSE
+ return TRUE
/obj/item/cookiesynth/attack_self(mob/user)
var/mob/living/silicon/robot/P = null
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 96bbe759ca..05ffcbf2fd 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -93,34 +93,22 @@
/obj/item/card/emag/afterattack(atom/target, mob/user, proximity)
. = ..()
var/atom/A = target
- if(!proximity && prox_check)
+ if(!proximity && prox_check || !(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
+ return
+ if(istype(A, /obj/item/storage) && !(istype(A, /obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod)))
return
- //Citadel changes: modular code misfiring, so we're bypassing into main code.
if(!uses)
user.visible_message("[src] emits a weak spark. It's burnt out!")
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
return
else if(uses <= 3)
playsound(src, 'sound/effects/light_flicker.ogg', 30, 1) //Tiiiiiiny warning sound to let ya know your emag's almost dead
-
- if(isturf(A))
+ if(!A.emag_act(user))
return
- if(istype(A,/obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod))
- A.emag_act(user)
- uses = max(uses - 1, 0)
- if(!uses)
- user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
- playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
- if(istype(A,/obj/item/storage))
- return
- if(!(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
- return
- else
- A.emag_act(user)
- uses = max(uses - 1, 0)
- if(!uses)
- user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
- playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
+ uses = max(uses - 1, 0)
+ if(!uses)
+ user.visible_message("[src] fizzles and sparks. It seems like it's out of charges.")
+ playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
/obj/item/card/emagfake
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 000c52ae43..09a128c558 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -764,20 +764,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
- if(screw)
- if(!(obj_flags & EMAGGED))
- cut_overlays()
- obj_flags |= EMAGGED
- super = FALSE
- to_chat(user, "You maximize the voltage of [src].")
- add_overlay("vapeopen_high")
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
- sp.set_up(5, 1, src)
- sp.start()
- else
- to_chat(user, "[src] is already emagged!")
- else
+ . = ..()
+ if(!screw)
to_chat(user, "You need to open the cap to do that.")
+ return
+ if(obj_flags & EMAGGED)
+ to_chat(user, "[src] is already emagged!")
+ return
+ cut_overlays()
+ obj_flags |= EMAGGED
+ super = FALSE
+ to_chat(user, "You maximize the voltage of [src].")
+ add_overlay("vapeopen_high")
+ var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
+ sp.set_up(5, 1, src)
+ sp.start()
+ return TRUE
/obj/item/clothing/mask/vape/attack_self(mob/user)
if(reagents.total_volume > 0)
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index a1ee62e2eb..bb45f80f2d 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -110,6 +110,7 @@
/obj/item/circuitboard/computer/cloning
name = "Cloning (Computer Board)"
build_path = /obj/machinery/computer/cloning
+ var/list/records = list()
/obj/item/circuitboard/computer/prototype_cloning
name = "Prototype Cloning (Computer Board)"
@@ -216,10 +217,13 @@
to_chat(user, "The spectrum chip is unresponsive.")
/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user)
- if(!(obj_flags & EMAGGED))
- contraband = TRUE
- obj_flags |= EMAGGED
- to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ contraband = TRUE
+ obj_flags |= EMAGGED
+ to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
+ return TRUE
/obj/item/circuitboard/computer/cargo/express
name = "Express Supply Console (Computer Board)"
@@ -233,8 +237,12 @@
obj_flags &= ~EMAGGED
/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user)
- to_chat(user, "You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")
- obj_flags |= EMAGGED
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(obj_flags & EMAGGED)
+ return
+ to_chat(user, "You change the routing protocols, allowing the Drop Pod to land anywhere on the station.")
+ obj_flags |= EMAGGED
+ return TRUE
/obj/item/circuitboard/computer/cargo/request
name = "Supply Request Console (Computer Board)"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 55e75b3992..5bef86c6d2 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -140,12 +140,10 @@
return ..()
/obj/item/defibrillator/emag_act(mob/user)
- if(safety)
- safety = FALSE
- to_chat(user, "You silently disable [src]'s safety protocols with the cryptographic sequencer.")
- else
- safety = TRUE
- to_chat(user, "You silently enable [src]'s safety protocols with the cryptographic sequencer.")
+ . = ..()
+ safety = !safety
+ to_chat(user, "You silently [safety ? "enable" : "disable"] [src]'s safety protocols with the cryptographic sequencer.")
+ return TRUE
/obj/item/defibrillator/emp_act(severity)
. = ..()
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index bf352e8eb7..3885a1f4d9 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -498,6 +498,23 @@ Code:
else
menu += "[ldat]"
+ menu += "Pimpin' Ride:
"
+
+ ldat = null
+ for (var/obj/vehicle/ridden/janicart/M in world)
+ var/turf/ml = get_turf(M)
+
+ if(ml)
+ if (ml.z != cl.z)
+ continue
+ var/direction = get_dir(src, M)
+ ldat += "Ride - \[[ml.x],[ml.y] ([uppertext(dir2text(direction))])\]
"
+
+ if (!ldat)
+ menu += "None"
+ else
+ menu += "[ldat]"
+
menu += "Located Janitorial Cart:
"
ldat = null
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 7823e570e0..38133e37bc 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -192,13 +192,15 @@
update_icon()
/obj/item/geiger_counter/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
if(scanning)
to_chat(user, "Turn off [src] before you perform this action!")
- return 0
+ return
to_chat(user, "You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.")
obj_flags |= EMAGGED
+ return TRUE
/obj/item/geiger_counter/cyborg
var/datum/component/mobhook
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 6615ebe8a8..1e31f14cfd 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -149,9 +149,11 @@
to_chat(user, "You fill \the [src] with lights from \the [S]. " + status_string() + "")
/obj/item/lightreplacer/emag_act()
+ . = ..()
if(obj_flags & EMAGGED)
return
Emag()
+ return TRUE
/obj/item/lightreplacer/attack_self(mob/user)
to_chat(user, status_string())
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 347bb6894d..915fcac504 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -38,11 +38,13 @@
speech_args[SPEECH_SPANS] |= voicespan
/obj/item/megaphone/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You overload \the [src]'s voice synthesizer.")
obj_flags |= EMAGGED
voicespan = list(SPAN_REALLYBIG, "userdanger")
+ return TRUE
/obj/item/megaphone/sec
name = "security megaphone"
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index f8b1d6e15b..a3ab9153ce 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -237,3 +237,10 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "multitool"
toolspeed = 0.1
+
+/obj/item/multitool/advanced
+ name = "advanced multitool"
+ desc = "The reproduction of an abductor's multitool, this multitool is a classy silver."
+ icon = 'icons/obj/advancedtools.dmi'
+ icon_state = "multitool"
+ toolspeed = 0.2
diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm
new file mode 100644
index 0000000000..37079722c0
--- /dev/null
+++ b/code/game/objects/items/devices/quantum_keycard.dm
@@ -0,0 +1,32 @@
+/obj/item/quantum_keycard
+ name = "quantum keycard"
+ desc = "A keycard able to link to a quantum pad's particle signature, allowing other quantum pads to travel there instead of their linked pad."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "quantum_keycard"
+ item_state = "card-id"
+ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ var/obj/machinery/quantumpad/qpad
+
+/obj/item/quantum_keycard/examine(mob/user)
+ ..()
+ if(qpad)
+ to_chat(user, "It's currently linked to a quantum pad.")
+ to_chat(user, "Alt-click to unlink the keycard.")
+ else
+ to_chat(user, "Insert [src] into an active quantum pad to link it.")
+
+/obj/item/quantum_keycard/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ to_chat(user, "You start pressing [src]'s unlink button...")
+ if(do_after(user, 40, target = src))
+ to_chat(user, "The keycard beeps twice and disconnects the quantum link.")
+ qpad = null
+
+/obj/item/quantum_keycard/update_icon()
+ if(qpad)
+ icon_state = "quantum_keycard_on"
+ else
+ icon_state = initial(icon_state)
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index dd7489d6b1..9adc0488aa 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -1,6 +1,6 @@
/obj/item/encryptionkey
name = "standard encryption key"
- desc = "An encryption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN."
+ desc = "An encryption key for a radio headset."
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
w_class = WEIGHT_CLASS_TINY
@@ -9,124 +9,119 @@
var/independent = FALSE
var/list/channels = list()
+/obj/item/encryptionkey/Initialize()
+ . = ..()
+ if(!channels.len)
+ desc = "An encryption key for a radio headset. Has no special codes in it. You should probably tell a coder!"
+
+/obj/item/encryptionkey/examine(mob/user)
+ . = ..()
+ if(LAZYLEN(channels))
+ var/list/examine_text_list = list()
+ for(var/i in channels)
+ examine_text_list += "[GLOB.channel_tokens[i]] - [lowertext(i)]"
+
+ to_chat(user, "It can access the following channels; [jointext(examine_text_list, ", ")].")
+
/obj/item/encryptionkey/syndicate
name = "syndicate encryption key"
- desc = "An encryption key for a radio headset. To access the syndicate channel, use :t."
icon_state = "syn_cypherkey"
- channels = list("Syndicate" = 1)
- syndie = 1//Signifies that it de-crypts Syndicate transmissions
+ channels = list(RADIO_CHANNEL_SYNDICATE = 1)
+ syndie = TRUE //Signifies that it de-crypts Syndicate transmissions
/obj/item/encryptionkey/binary
name = "binary translator key"
- desc = "An encryption key for a radio headset. To access the binary channel, use :b."
icon_state = "bin_cypherkey"
translate_binary = TRUE
/obj/item/encryptionkey/headset_sec
name = "security radio encryption key"
- desc = "An encryption key for a radio headset. To access the security channel, use :s."
icon_state = "sec_cypherkey"
- channels = list("Security" = 1)
+ channels = list(RADIO_CHANNEL_SECURITY = 1)
/obj/item/encryptionkey/headset_eng
name = "engineering radio encryption key"
- desc = "An encryption key for a radio headset. To access the engineering channel, use :e."
icon_state = "eng_cypherkey"
- channels = list("Engineering" = 1)
+ channels = list(RADIO_CHANNEL_ENGINEERING = 1)
/obj/item/encryptionkey/headset_rob
name = "robotics radio encryption key"
- desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For research, use :n."
icon_state = "rob_cypherkey"
- channels = list("Science" = 1, "Engineering" = 1)
+ channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_ENGINEERING = 1)
/obj/item/encryptionkey/headset_med
name = "medical radio encryption key"
- desc = "An encryption key for a radio headset. To access the medical channel, use :m."
icon_state = "med_cypherkey"
- channels = list("Medical" = 1)
+ channels = list(RADIO_CHANNEL_MEDICAL = 1)
/obj/item/encryptionkey/headset_sci
name = "science radio encryption key"
- desc = "An encryption key for a radio headset. To access the science channel, use :n."
icon_state = "sci_cypherkey"
- channels = list("Science" = 1)
+ channels = list(RADIO_CHANNEL_SCIENCE = 1)
/obj/item/encryptionkey/headset_medsci
name = "medical research radio encryption key"
- desc = "An encryption key for a radio headset. To access the medical channel, use :m. For science, use :n."
icon_state = "medsci_cypherkey"
- channels = list("Science" = 1, "Medical" = 1)
+ channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1)
/obj/item/encryptionkey/headset_com
name = "command radio encryption key"
- desc = "An encryption key for a radio headset. To access the command channel, use :c."
icon_state = "com_cypherkey"
- channels = list("Command" = 1)
+ channels = list(RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/captain
name = "\proper the captain's encryption key"
- desc = "An encryption key for a radio headset. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "cap_cypherkey"
- channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0)
+ channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 0, RADIO_CHANNEL_SCIENCE = 0, RADIO_CHANNEL_MEDICAL = 0, RADIO_CHANNEL_SUPPLY = 0, RADIO_CHANNEL_SERVICE = 0)
/obj/item/encryptionkey/heads/rd
name = "\proper the research director's encryption key"
- desc = "An encryption key for a radio headset. To access the science channel, use :n. For command, use :c."
icon_state = "rd_cypherkey"
- channels = list("Science" = 1, "Command" = 1)
+ channels = list(RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/hos
name = "\proper the head of security's encryption key"
- desc = "An encryption key for a radio headset. To access the security channel, use :s. For command, use :c."
icon_state = "hos_cypherkey"
- channels = list("Security" = 1, "Command" = 1)
+ channels = list(RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/ce
name = "\proper the chief engineer's encryption key"
- desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For command, use :c."
icon_state = "ce_cypherkey"
- channels = list("Engineering" = 1, "Command" = 1)
+ channels = list(RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/cmo
name = "\proper the chief medical officer's encryption key"
- desc = "An encryption key for a radio headset. To access the medical channel, use :m. For command, use :c."
icon_state = "cmo_cypherkey"
- channels = list("Medical" = 1, "Command" = 1)
+ channels = list(RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/heads/hop
name = "\proper the head of personnel's encryption key"
- desc = "An encryption key for a radio headset. Channels are as follows: :u - supply, :v - service, :c - command."
icon_state = "hop_cypherkey"
- channels = list("Supply" = 1, "Service" = 1, "Command" = 1)
+ channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_COMMAND = 1)
/obj/item/encryptionkey/headset_cargo
name = "supply radio encryption key"
- desc = "An encryption key for a radio headset. To access the supply channel, use :u."
icon_state = "cargo_cypherkey"
- channels = list("Supply" = 1)
+ channels = list(RADIO_CHANNEL_SUPPLY = 1)
/obj/item/encryptionkey/headset_mining
name = "mining radio encryption key"
- desc = "An encryption key for a radio headset. To access the supply channel, use :u. For science, use :n."
icon_state = "cargo_cypherkey"
- channels = list("Supply" = 1, "Science" = 1)
+ channels = list(RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SCIENCE = 1)
/obj/item/encryptionkey/headset_service
name = "service radio encryption key"
- desc = "An encryption key for a radio headset. To access the service channel, use :v."
icon_state = "srv_cypherkey"
- channels = list("Service" = 1)
+ channels = list(RADIO_CHANNEL_SERVICE = 1)
/obj/item/encryptionkey/headset_cent
name = "\improper CentCom radio encryption key"
- desc = "An encryption key for a radio headset. To access the CentCom channel, use :y."
icon_state = "cent_cypherkey"
independent = TRUE
- channels = list("CentCom" = 1)
+ channels = list(RADIO_CHANNEL_CENTCOM = 1)
/obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
- channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
+ channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1)
/obj/item/encryptionkey/secbot
- channels = list("AI Private"=1,"Security"=1)
+ channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1)
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index ea9c6fb99e..cca5eb4217 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -1,3 +1,19 @@
+// Used for translating channels to tokens on examination
+GLOBAL_LIST_INIT(channel_tokens, list(
+ RADIO_CHANNEL_COMMON = RADIO_KEY_COMMON,
+ RADIO_CHANNEL_SCIENCE = RADIO_TOKEN_SCIENCE,
+ RADIO_CHANNEL_COMMAND = RADIO_TOKEN_COMMAND,
+ RADIO_CHANNEL_MEDICAL = RADIO_TOKEN_MEDICAL,
+ RADIO_CHANNEL_ENGINEERING = RADIO_TOKEN_ENGINEERING,
+ RADIO_CHANNEL_SECURITY = RADIO_TOKEN_SECURITY,
+ RADIO_CHANNEL_CENTCOM = RADIO_TOKEN_CENTCOM,
+ RADIO_CHANNEL_SYNDICATE = RADIO_TOKEN_SYNDICATE,
+ RADIO_CHANNEL_SUPPLY = RADIO_TOKEN_SUPPLY,
+ RADIO_CHANNEL_SERVICE = RADIO_TOKEN_SERVICE,
+ MODE_BINARY = MODE_TOKEN_BINARY,
+ RADIO_CHANNEL_AI_PRIVATE = RADIO_TOKEN_AI_PRIVATE
+))
+
/obj/item/radio/headset
name = "radio headset"
desc = "An updated, modular intercom that fits over the head. Takes encryption keys."
@@ -17,9 +33,24 @@
/obj/item/radio/headset/examine(mob/user)
..()
- to_chat(user, "To speak on the general radio frequency, use ; before speaking.")
- if (command)
- to_chat(user, "Alt-click to toggle the high-volume mode.")
+
+ if(item_flags & IN_INVENTORY && loc == user)
+ // construction of frequency description
+ var/list/avail_chans = list("Use [RADIO_KEY_COMMON] for the currently tuned frequency")
+ if(translate_binary)
+ avail_chans += "use [MODE_TOKEN_BINARY] for [MODE_BINARY]"
+ if(length(channels))
+ for(var/i in 1 to length(channels))
+ if(i == 1)
+ avail_chans += "use [MODE_TOKEN_DEPARTMENT] or [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
+ else
+ avail_chans += "use [GLOB.channel_tokens[channels[i]]] for [lowertext(channels[i])]"
+ to_chat(user, "A small screen on the headset displays the following available frequencies:\n[english_list(avail_chans)].")
+
+ if(command)
+ to_chat(user, "Alt-click to toggle the high-volume mode.")
+ else
+ to_chat(user, "A small screen on the headset flashes, it's too small to read without holding or wearing the headset.")
/obj/item/radio/headset/Initialize()
. = ..()
@@ -47,7 +78,7 @@
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
- desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking."
+ desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs."
icon_state = "syndie_headset"
item_state = "syndie_headset"
@@ -72,13 +103,13 @@
/obj/item/radio/headset/headset_sec
name = "security radio headset"
- desc = "This is used by your elite security force.\nTo access the security channel, use :s."
+ desc = "This is used by your elite security force."
icon_state = "sec_headset"
keyslot = new /obj/item/encryptionkey/headset_sec
/obj/item/radio/headset/headset_sec/alt
name = "security bowman headset"
- desc = "This is used by your elite security force. Protects ears from flashbangs.\nTo access the security channel, use :s."
+ desc = "This is used by your elite security force. Protects ears from flashbangs."
icon_state = "sec_headset_alt"
item_state = "sec_headset_alt"
@@ -88,31 +119,31 @@
/obj/item/radio/headset/headset_eng
name = "engineering radio headset"
- desc = "When the engineers wish to chat like girls.\nTo access the engineering channel, use :e."
+ desc = "When the engineers wish to chat like girls."
icon_state = "eng_headset"
keyslot = new /obj/item/encryptionkey/headset_eng
/obj/item/radio/headset/headset_rob
name = "robotics radio headset"
- desc = "Made specifically for the roboticists, who cannot decide between departments.\nTo access the engineering channel, use :e. For research, use :n."
+ desc = "Made specifically for the roboticists, who cannot decide between departments."
icon_state = "rob_headset"
keyslot = new /obj/item/encryptionkey/headset_rob
/obj/item/radio/headset/headset_med
name = "medical radio headset"
- desc = "A headset for the trained staff of the medbay.\nTo access the medical channel, use :m."
+ desc = "A headset for the trained staff of the medbay."
icon_state = "med_headset"
keyslot = new /obj/item/encryptionkey/headset_med
/obj/item/radio/headset/headset_sci
name = "science radio headset"
- desc = "A sciency headset. Like usual.\nTo access the science channel, use :n."
+ desc = "A sciency headset. Like usual."
icon_state = "sci_headset"
keyslot = new /obj/item/encryptionkey/headset_sci
/obj/item/radio/headset/headset_medsci
name = "medical research radio headset"
- desc = "A headset that is a result of the mating between medical and science.\nTo access the medical channel, use :m. For science, use :n."
+ desc = "A headset that is a result of the mating between medical and science."
icon_state = "medsci_headset"
keyslot = new /obj/item/encryptionkey/headset_medsci
@@ -127,13 +158,13 @@
/obj/item/radio/headset/heads/captain
name = "\proper the captain's headset"
- desc = "The headset of the king.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
+ desc = "The headset of the king."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/captain
/obj/item/radio/headset/heads/captain/alt
name = "\proper the captain's bowman headset"
- desc = "The headset of the boss. Protects ears from flashbangs.\nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
+ desc = "The headset of the boss. Protects ears from flashbangs."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
@@ -143,19 +174,19 @@
/obj/item/radio/headset/heads/rd
name = "\proper the research director's headset"
- desc = "Headset of the fellow who keeps society marching towards technological singularity.\nTo access the science channel, use :n. For command, use :c."
+ desc = "Headset of the fellow who keeps society marching towards technological singularity."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/rd
/obj/item/radio/headset/heads/hos
name = "\proper the head of security's headset"
- desc = "The headset of the man in charge of keeping order and protecting the station.\nTo access the security channel, use :s. For command, use :c."
+ desc = "The headset of the man in charge of keeping order and protecting the station."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/hos
/obj/item/radio/headset/heads/hos/alt
name = "\proper the head of security's bowman headset"
- desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs.\nTo access the security channel, use :s. For command, use :c."
+ desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs."
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
@@ -165,43 +196,43 @@
/obj/item/radio/headset/heads/ce
name = "\proper the chief engineer's headset"
- desc = "The headset of the guy in charge of keeping the station powered and undamaged.\nTo access the engineering channel, use :e. For command, use :c."
+ desc = "The headset of the guy in charge of keeping the station powered and undamaged."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/ce
/obj/item/radio/headset/heads/cmo
name = "\proper the chief medical officer's headset"
- desc = "The headset of the highly trained medical chief.\nTo access the medical channel, use :m. For command, use :c."
+ desc = "The headset of the highly trained medical chief."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/cmo
/obj/item/radio/headset/heads/hop
name = "\proper the head of personnel's headset"
- desc = "The headset of the guy who will one day be captain.\nChannels are as follows: :u - supply, :v - service, :c - command."
+ desc = "The headset of the guy who will one day be captain."
icon_state = "com_headset"
keyslot = new /obj/item/encryptionkey/heads/hop
/obj/item/radio/headset/headset_cargo
name = "supply radio headset"
- desc = "A headset used by the QM and his slaves.\nTo access the supply channel, use :u."
+ desc = "A headset used by the QM and his slaves."
icon_state = "cargo_headset"
keyslot = new /obj/item/encryptionkey/headset_cargo
/obj/item/radio/headset/headset_cargo/mining
name = "mining radio headset"
- desc = "Headset used by shaft miners.\nTo access the supply channel, use :u. For science, use :n."
+ desc = "Headset used by shaft miners."
icon_state = "mine_headset"
keyslot = new /obj/item/encryptionkey/headset_mining
/obj/item/radio/headset/headset_srv
name = "service radio headset"
- desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean.\nTo access the service channel, use :v."
+ desc = "Headset used by the service staff, tasked with keeping the station full, happy and clean."
icon_state = "srv_headset"
keyslot = new /obj/item/encryptionkey/headset_service
/obj/item/radio/headset/headset_cent
name = "\improper CentCom headset"
- desc = "A headset used by the upper echelons of Nanotrasen.\nTo access the CentCom channel, use :y."
+ desc = "A headset used by the upper echelons of Nanotrasen."
icon_state = "cent_headset"
keyslot = new /obj/item/encryptionkey/headset_com
keyslot2 = new /obj/item/encryptionkey/headset_cent
@@ -215,7 +246,7 @@
/obj/item/radio/headset/headset_cent/alt
name = "\improper CentCom bowman headset"
- desc = "A headset especially for emergency response personnel. Protects ears from flashbangs.\nTo access the CentCom channel, use :y."
+ desc = "A headset especially for emergency response personnel. Protects ears from flashbangs."
icon_state = "cent_headset_alt"
item_state = "cent_headset_alt"
keyslot = null
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 1d51aabf86..7c136f556e 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -221,7 +221,7 @@
// From the channel, determine the frequency and get a reference to it.
var/freq
if(channel && channels && channels.len > 0)
- if(channel == "department")
+ if(channel == MODE_DEPARTMENT)
channel = channels[1]
freq = secure_radio_connections[channel]
if (!channels[channel]) // if the channel is turned off, don't broadcast
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 7337676a46..0059938720 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -137,15 +137,6 @@ SLIME SCANNER
to_chat(user, "Subject suffering from heart attack: Apply defibrillation or other electric shock immediately!")
if(H.undergoing_liver_failure() && H.stat != DEAD)
to_chat(user, "Subject is suffering from liver failure: Apply Corazone and begin a liver transplant immediately!")
- var/obj/item/organ/liver/L = M.getorganslot("liver")
- if(L.swelling > 20)
- to_chat(user, "Subject is suffering from an enlarged liver.") //i.e. shrink their liver or give them a transplant.
- var/obj/item/organ/tongue/T = M.getorganslot("tongue")
- if(!T || T.damage > 40)
- to_chat(user, "Subject is suffering from necrotic tissue on their tongue./span>") //i.e. their tongue is shot
- var/obj/item/organ/lungs/Lung = M.getorganslot("lungs")
- if(Lung.damage > 150)
- to_chat(user, "Subject is suffering from acute emphysema leading to trouble breathing.") //i.e. Their lungs are shot
var/msg = "*---------*\nAnalyzing results for [M]:\n\tOverall status: [mob_status]\n"
@@ -172,7 +163,37 @@ SLIME SCANNER
msg += "\tSevere brain damage detected. Subject likely to have mental traumas.\n"
else if (M.getBrainLoss() >= 45)
msg += "\tBrain damage detected.\n"
- if(iscarbon(M))
+ if(ishuman(M) && advanced) // Should I make this not advanced?
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/liver/L = H.getorganslot("liver")
+ if(L)
+ if(L.swelling > 20)
+ msg += "\tSubject is suffering from an enlarged liver.\n" //i.e. shrink their liver or give them a transplant.
+ else
+ msg += "\tSubject's liver is missing.\n"
+ var/obj/item/organ/tongue/T = H.getorganslot("tongue")
+ if(T)
+ if(T.damage > 40)
+ msg += "\tSubject is suffering from severe burn tissue on their tongue.\n" //i.e. their tongue is shot
+ if(T.name == "fluffy tongue")
+ msg += "\tSubject is suffering from a fluffified tongue. Suggested cure: Yamerol or a tongue transplant.\n"
+ else
+ msg += "\tSubject's tongue is missing.\n"
+ var/obj/item/organ/lungs/Lung = H.getorganslot("lungs")
+ if(Lung)
+ if(Lung.damage > 150)
+ msg += "\tSubject is suffering from acute emphysema leading to trouble breathing.\n" //i.e. Their lungs are shot
+ else
+ msg += "\tSubject's lungs have collapsed from trauma!\n"
+ var/obj/item/organ/genital/penis/P = H.getorganslot("penis")
+ if(P)
+ if(P.length>20)
+ msg += "\tSubject has a sizeable gentleman's organ at [P.length] inches.\n"
+ var/obj/item/organ/genital/breasts/Br = H.getorganslot("breasts")
+ if(Br)
+ if(Br.cached_size>5)
+ msg += "\tSubject has a sizeable bosom with a [Br.size] cup.\n"
+
var/mob/living/carbon/C = M
if(LAZYLEN(C.get_traumas()))
var/list/trauma_text = list()
@@ -192,7 +213,7 @@ SLIME SCANNER
msg += "\tSubject has the following physiological traits: [C.get_trait_string()].\n"
if(advanced)
msg += "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.\n"
- if (M.radiation)
+ if(M.radiation)
msg += "\tSubject is irradiated.\n"
if(advanced)
msg += "\tRadiation Level: [M.radiation]%.\n"
@@ -200,9 +221,17 @@ SLIME SCANNER
if(advanced && M.hallucinating())
msg += "\tSubject is hallucinating.\n"
- if(M.has_status_effect(/datum/status_effect/chem/enthrall))
+ //MKUltra
+ if(advanced && M.has_status_effect(/datum/status_effect/chem/enthrall))
msg += "\tSubject has abnormal brain fuctions.\n"
+ //Astrogen shenanigans
+ if(advanced && M.reagents.has_reagent("astral"))
+ if(M.mind)
+ msg += "\tWarning: subject may be possesed.\n"
+ else
+ msg += "\tSubject appears to be astrally projecting.\n"
+
//Eyes and ears
if(advanced)
if(iscarbon(M))
@@ -268,6 +297,7 @@ SLIME SCANNER
for(var/obj/item/bodypart/org in damaged)
msg += "\t\t[capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : "0"]-[(org.burn_dam > 0) ? "[org.burn_dam]" : "0"]\n"
+
// Species and body temperature
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -353,9 +383,19 @@ SLIME SCANNER
if(M.reagents)
var/msg = "*---------*\n"
if(M.reagents.reagent_list.len)
- msg += "Subject contains the following reagents:\n"
+ var/list/datum/reagent/reagents = list()
for(var/datum/reagent/R in M.reagents.reagent_list)
- msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]\n"
+ if(R.invisible)
+ continue
+ reagents += R
+
+ if(length(reagents))
+ msg += "Subject contains the following reagents:\n"
+ for(var/datum/reagent/R in reagents)
+ msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]\n"
+ else
+ msg += "Subject contains no reagents.\n"
+
else
msg += "Subject contains no reagents.\n"
if(M.reagents.addiction_list.len)
@@ -633,7 +673,7 @@ SLIME SCANNER
to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
if(T.effectmod)
to_chat(user, "Core mutation in progress: [T.effectmod]")
- to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")
+ to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")
to_chat(user, "========================")
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 21f6961e5d..71687f0d5a 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -1,4 +1,3 @@
-
///books that teach things (intrinsic actions like bar flinging, spells like fireball or smoke, or martial arts)///
/obj/item/book/granter
@@ -13,19 +12,50 @@
/obj/item/book/granter/proc/turn_page(mob/user)
playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, 1)
if(do_after(user,50, user))
- to_chat(user, "[pick(remarks)]")
+ if(remarks.len)
+ to_chat(user, "[pick(remarks)]")
+ else
+ to_chat(user, "You keep reading...")
return TRUE
return FALSE
/obj/item/book/granter/proc/recoil(mob/user) //nothing so some books can just return
+/obj/item/book/granter/proc/already_known(mob/user)
+ return FALSE
+
+/obj/item/book/granter/proc/on_reading_start(mob/user)
+ to_chat(user, "You start reading [name]...")
+
+/obj/item/book/granter/proc/on_reading_stopped(mob/user)
+ to_chat(user, "You stop reading...")
+
+/obj/item/book/granter/proc/on_reading_finished(mob/user)
+ to_chat(user, "You finish reading [name]!")
+
/obj/item/book/granter/proc/onlearned(mob/user)
used = TRUE
+
/obj/item/book/granter/attack_self(mob/user)
- if(reading == TRUE)
+ if(reading)
to_chat(user, "You're already reading this!")
return FALSE
+ if(already_known(user))
+ return FALSE
+ if(used && oneuse)
+ recoil(user)
+ else
+ on_reading_start(user)
+ reading = TRUE
+ for(var/i=1, i<=pages_to_mastery, i++)
+ if(!turn_page(user))
+ on_reading_stopped()
+ reading = FALSE
+ return
+ if(do_after(user,50, user))
+ on_reading_finished(user)
+ reading = FALSE
return TRUE
///ACTION BUTTONS///
@@ -34,33 +64,23 @@
var/granted_action
var/actionname = "catching bugs" //might not seem needed but this makes it so you can safely name action buttons toggle this or that without it fucking up the granter, also caps
-/obj/item/book/granter/action/attack_self(mob/user)
- . = ..()
- if(!.)
- return
+/obj/item/book/granter/action/already_known(mob/user)
if(!granted_action)
- return
- var/datum/action/G = new granted_action
+ return TRUE
for(var/datum/action/A in user.actions)
- if(A.type == G.type)
+ if(A.type == granted_action)
to_chat(user, "You already know all about [actionname].")
- qdel(G)
- return
- if(used == TRUE && oneuse == TRUE)
- recoil(user)
- else
- to_chat(user, "You start reading about [actionname]...")
- reading = TRUE
- for(var/i=1, i<=pages_to_mastery, i++)
- if(!turn_page(user))
- to_chat(user, "You stop reading...")
- reading = FALSE
- qdel(G)
- return
- if(do_after(user,50, user))
- to_chat(user, "You feel like you've got a good handle on [actionname]!")
- G.Grant(user)
- reading = FALSE
+ return TRUE
+ return FALSE
+
+/obj/item/book/granter/action/on_reading_start(mob/user)
+ to_chat(user, "You start reading about [actionname]...")
+
+/obj/item/book/granter/action/on_reading_finished(mob/user)
+ to_chat(user, "You feel like you've got a good handle on [actionname]!")
+ var/datum/action/G = new granted_action
+ G.Grant(user)
+ onlearned(user)
/obj/item/book/granter/action/drink_fling
granted_action = /datum/action/innate/drink_fling
@@ -120,38 +140,28 @@
var/spell
var/spellname = "conjure bugs"
-/obj/item/book/granter/spell/attack_self(mob/user)
- . = ..()
- if(!.)
- return
+/obj/item/book/granter/spell/already_known(mob/user)
if(!spell)
- return
- var/obj/effect/proc_holder/spell/S = new spell
+ return TRUE
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
- if(knownspell.type == S.type)
+ if(knownspell.type == spell)
if(user.mind)
if(iswizard(user))
- to_chat(user,"You're already far more versed in this spell than this flimsy howto book can provide.")
+ to_chat(user,"You're already far more versed in this spell than this flimsy how-to book can provide.")
else
to_chat(user,"You've already read this one.")
- return
- if(used == TRUE && oneuse == TRUE)
- recoil(user)
- else
- to_chat(user, "You start reading about casting [spellname]...")
- reading = TRUE
- for(var/i=1, i<=pages_to_mastery, i++)
- if(!turn_page(user))
- to_chat(user, "You stop reading...")
- reading = FALSE
- qdel(S)
- return
- if(do_after(user,50, user))
- to_chat(user, "You feel like you've experienced enough to cast [spellname]!")
- user.mind.AddSpell(S)
- user.log_message("learned the spell [spellname] ([S])", LOG_ATTACK, color="orange")
- onlearned(user)
- reading = FALSE
+ return TRUE
+ return FALSE
+
+/obj/item/book/granter/spell/on_reading_start(mob/user)
+ to_chat(user, "You start reading about casting [spellname]...")
+
+/obj/item/book/granter/spell/on_reading_finished(mob/user)
+ to_chat(user, "You feel like you've experienced enough to cast [spellname]!")
+ var/obj/effect/proc_holder/spell/S = new spell
+ user.mind.AddSpell(S)
+ user.log_message("learned the spell [spellname] ([S])", LOG_ATTACK, color="orange")
+ onlearned(user)
/obj/item/book/granter/spell/recoil(mob/user)
user.visible_message("[src] glows in a black light!")
@@ -280,7 +290,8 @@
if(ishuman(user))
to_chat(user,"HORSIE HAS RISEN")
var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
- user.dropItemToGround(user.wear_mask, TRUE)
+ if(!user.dropItemToGround(user.wear_mask))
+ qdel(user.wear_mask)
user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE)
qdel(src)
else
@@ -327,35 +338,24 @@
var/martialname = "bug jitsu"
var/greet = "You feel like you have mastered the art in breaking code. Nice work, jackass."
-/obj/item/book/granter/martial/attack_self(mob/user)
- . = ..()
- if(!.)
- return
+/obj/item/book/granter/martial/already_known(mob/user)
if(!martial)
- return
+ return TRUE
+ var/datum/martial_art/MA = martial
+ if(user.mind.has_martialart(initial(MA.id)))
+ to_chat(user,"You already know [martialname]!")
+ return TRUE
+ return FALSE
+
+/obj/item/book/granter/martial/on_reading_start(mob/user)
+ to_chat(user, "You start reading about [martialname]...")
+
+/obj/item/book/granter/martial/on_reading_finished(mob/user)
+ to_chat(user, "[greet]")
var/datum/martial_art/MA = new martial
- if(user.mind.martial_art)
- for(var/datum/martial_art/knownmartial in user.mind.martial_art)
- if(knownmartial.type == MA.type)
- to_chat(user,"You already know [martialname]!")
- return
- if(used == TRUE && oneuse == TRUE)
- recoil(user)
- else
- to_chat(user, "You start reading about [martialname]...")
- reading = TRUE
- for(var/i=1, i<=pages_to_mastery, i++)
- if(!turn_page(user))
- to_chat(user, "You stop reading...")
- reading = FALSE
- qdel(MA)
- return
- if(do_after(user,50, user))
- to_chat(user, "[greet]")
- MA.teach(user)
- user.log_message("learned the martial art [martialname] ([MA])", LOG_ATTACK, color="orange")
- onlearned(user)
- reading = FALSE
+ MA.teach(user)
+ user.log_message("learned the martial art [martialname] ([MA])", LOG_ATTACK, color="orange")
+ onlearned(user)
/obj/item/book/granter/martial/cqc
martial = /datum/martial_art/cqc
@@ -416,3 +416,44 @@
icon_state = "blankscroll"
// I did not include mushpunch's grant, it is not a book and the item does it just fine.
+
+
+//Crafting Recipe books
+
+/obj/item/book/granter/crafting_recipe
+ var/list/crafting_recipe_types = list() //Use full /datum/crafting_recipe/what_you_craft
+
+/obj/item/book/granter/crafting_recipe/on_reading_finished(mob/user)
+ . = ..()
+ if(!user.mind)
+ return
+ for(var/crafting_recipe_type in crafting_recipe_types)
+ var/datum/crafting_recipe/R = crafting_recipe_type
+ user.mind.teach_crafting_recipe(crafting_recipe_type)
+ to_chat(user,"You learned how to make [initial(R.name)].")
+
+/obj/item/book/granter/crafting_recipe/cooking_sweets_101 //We start at 101 for 103 and 105
+ name = "Cooking Desserts 101"
+ desc = "A cook book that teaches you some more of the newest desserts. AI approved, and a best seller on Honkplanet."
+ crafting_recipe_types = list(/datum/crafting_recipe/food/mimetart, /datum/crafting_recipe/food/berrytart, /datum/crafting_recipe/food/cocolavatart, /datum/crafting_recipe/food/clowncake, /datum/crafting_recipe/food/vanillacake)
+ icon_state = "cooking_learing_sweets"
+ oneuse = FALSE
+ remarks = list("So that is how icing is made!", "Placing fruit on top? How simple...", "Huh layering cake seems harder then this...", "This book smells like candy", "A clown must have made this page, or they forgot to spell check it before printing...", "Wait, a way to cook slime to be safe?")
+
+//Later content when I have free time - Trilby Date:02-Aug-2019
+
+/obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book
+ name = "Under The Oven"
+ desc = "A cook book that teaches you many illegal and fun candys. MALF AI approved, and a best seller on the blackmarket."
+ crafting_recipe_types = list()
+ icon_state = "cooking_learing_illegal"
+ oneuse = FALSE
+ remarks = list()
+
+/obj/item/book/granter/crafting_recipe/coldcooking //IceCream
+ name = "Cooking with Ice"
+ desc = "A cook book that teaches you many old icecream treats."
+ crafting_recipe_types = list()
+ icon_state = "cooking_learing_ice"
+ oneuse = FALSE
+ remarks = list()
\ No newline at end of file
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 5e19577b46..a306b48385 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -26,6 +26,7 @@
gender = PLURAL
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "handcuff"
+ item_state = "handcuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
@@ -103,7 +104,6 @@
desc = "A pair of restraints fashioned from long strands of flesh."
icon = 'icons/obj/mining.dmi'
icon_state = "sinewcuff"
- item_state = "sinewcuff"
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
@@ -164,14 +164,6 @@
/obj/item/restraints/handcuffs/cable/white
item_color = "white"
-/obj/item/restraints/handcuffs/alien
- icon_state = "handcuffAlien"
-
-/obj/item/restraints/handcuffs/fake
- name = "fake handcuffs"
- desc = "Fake handcuffs meant for gag purposes."
- breakouttime = 10 //Deciseconds = 1s
-
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/stack/rods))
@@ -206,7 +198,7 @@
/obj/item/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
- icon_state = "cuff"
+ item_state = "zipties"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
materials = list()
@@ -217,11 +209,25 @@
/obj/item/restraints/handcuffs/cable/zipties/used
desc = "A pair of broken zipties."
icon_state = "cuff_used"
- item_state = "cuff"
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
+/obj/item/restraints/handcuffs/alien
+ icon_state = "handcuffAlien"
+
+/obj/item/restraints/handcuffs/fake
+ name = "fake handcuffs"
+ desc = "Fake handcuffs meant for gag purposes."
+ breakouttime = 10 //Deciseconds = 1s
+
+/obj/item/restraints/handcuffs/fake/kinky
+ name = "kinky handcuffs"
+ desc = "Fake handcuffs meant for erotic roleplay."
+ icon = 'modular_citadel/icons/obj/items_and_weapons.dmi'
+ icon_state = "handcuffgag"
+ item_state = "kinkycuff"
+
//Legcuffs
/obj/item/restraints/legcuffs
@@ -230,6 +236,7 @@
gender = PLURAL
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "handcuff"
+ item_state = "legcuff"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
flags_1 = CONDUCT_1
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 6e977331a6..3be57d23f1 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -12,8 +12,9 @@
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
icon = 'icons/obj/items_and_weapons.dmi'
- w_class = WEIGHT_CLASS_GIGANTIC
+ w_class = WEIGHT_CLASS_BULKY
force = 12
+ total_mass = TOTAL_MASS_NORMAL_ITEM // average toolbox
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
var/awakened = FALSE
@@ -174,6 +175,7 @@
/obj/item/his_grace/proc/consume(mob/living/meal) //Here's your dinner, Mr. Grace.
if(!meal)
return
+ var/victims = 0
meal.visible_message("[src] swings open and devours [meal]!", "[src] consumes you!")
meal.adjustBruteLoss(200)
playsound(meal, 'sound/misc/desceration-02.ogg', 75, 1)
@@ -185,7 +187,10 @@
bloodthirst = max(LAZYLEN(contents), 1) //Never fully sated, and His hunger will only grow.
else
bloodthirst = HIS_GRACE_CONSUME_OWNER
- if(LAZYLEN(contents) >= victims_needed)
+ for(var/mob/living/C in contents)
+ if(C.mind)
+ victims++
+ if(victims >= victims_needed)
ascend()
update_stats()
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 0e8a9fef9e..6e3deaa694 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -285,14 +285,12 @@
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled")
-
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/godhand/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
-
-
/obj/item/nullrod/staff
icon_state = "godstaff-red"
item_state = "godstaff-red"
@@ -330,6 +328,7 @@
sharpness = IS_SHARP
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
@@ -523,6 +522,7 @@
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/nullrod/chainsaw
name = "chainsaw hand"
@@ -536,6 +536,7 @@
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/chainsaw/Initialize()
. = ..()
@@ -612,6 +613,7 @@
item_flags = ABSTRACT
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/nullrod/armblade/Initialize()
. = ..()
@@ -672,6 +674,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
item_flags = SLOWS_WHILE_IN_HAND
+ total_mass = TOTAL_MASS_NORMAL_ITEM
/obj/item/nullrod/tribal_knife/Initialize(mapload)
. = ..()
@@ -701,8 +704,8 @@
name = "egyptian staff"
desc = "A tutorial in mummification is carved into the staff. You could probably craft the wraps if you had some cloth."
icon = 'icons/obj/guns/magic.dmi'
- icon_state = "pharoah_sceptre"
- item_state = "pharoah_sceptre"
+ icon_state = "pharaoh_sceptre"
+ item_state = "pharaoh_sceptre"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/implants/implant_krav_maga.dm b/code/game/objects/items/implants/implant_krav_maga.dm
index 3a751ecd0e..373658b386 100644
--- a/code/game/objects/items/implants/implant_krav_maga.dm
+++ b/code/game/objects/items/implants/implant_krav_maga.dm
@@ -21,7 +21,7 @@
return
if(!H.mind)
return
- if(istype(H.mind.martial_art, /datum/martial_art/krav_maga))
+ if(H.mind.has_martialart(MARTIALART_KRAVMAGA))
style.remove(H)
else
style.teach(H,1)
diff --git a/code/game/objects/items/implants/implant_stealth.dm b/code/game/objects/items/implants/implant_stealth.dm
index 84f9f5f454..eb58d76d1b 100644
--- a/code/game/objects/items/implants/implant_stealth.dm
+++ b/code/game/objects/items/implants/implant_stealth.dm
@@ -9,6 +9,7 @@
name = "inconspicious box"
desc = "It's so normal that you didn't notice it before."
icon_state = "agentbox"
+ max_integrity = 1
use_mob_movespeed = TRUE
/obj/structure/closet/cardboard/agent/proc/go_invisible()
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 935d2a007e..d854ab9f5a 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -5,9 +5,12 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
var/brightness_on = 3
+ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
+
/obj/item/melee/transforming/energy/Initialize()
. = ..()
+ total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75))
if(active)
set_light(brightness_on)
START_PROCESSING(SSobj, src)
@@ -79,6 +82,7 @@
attack_verb_off = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
light_color = "#40ceff"
+ total_mass = null
/obj/item/melee/transforming/energy/axe/suicide_act(mob/user)
user.visible_message("[user] swings [src] towards [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 0d45960767..f9affc230d 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -44,6 +44,7 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "impaled", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/melee/synthetic_arm_blade/Initialize()
. = ..()
@@ -67,6 +68,7 @@
attack_verb = list("slashed", "cut")
hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
+ total_mass = 3.4
/obj/item/melee/sabre/Initialize()
. = ..()
@@ -89,6 +91,12 @@
if(istype(B))
playsound(B, 'sound/items/sheath.ogg', 25, 1)
+/obj/item/melee/sabre/get_belt_overlay()
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre")
+
+/obj/item/melee/sabre/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "-sabre")
+
/obj/item/melee/sabre/suicide_act(mob/living/user)
user.visible_message("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!")
var/i = 0
@@ -147,13 +155,20 @@
flags_1 = CONDUCT_1
obj_flags = UNIQUE_RENAME
w_class = WEIGHT_CLASS_BULKY
- sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
+ sharpness = IS_SHARP_ACCURATE //It cant be sharpend cook -_-
attack_verb = list("slashed", "cut", "pierces", "pokes")
+ total_mass = 3.4
/obj/item/melee/rapier/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 20, 65, 0)
+/obj/item/melee/rapier/get_belt_overlay()
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier")
+
+/obj/item/melee/rapier/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "-rapier")
+
/obj/item/melee/classic_baton
name = "police baton"
desc = "A wooden truncheon for beating criminal scum."
@@ -214,7 +229,7 @@
target.LAssailant = null
else
target.LAssailant = user
- cooldown = world.time + 40
+ cooldown = world.time
user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
/obj/item/melee/classic_baton/telescopic
@@ -230,6 +245,7 @@
item_flags = NONE
force = 0
on = FALSE
+ total_mass = TOTAL_MASS_SMALL_ITEM
/obj/item/melee/classic_baton/telescopic/suicide_act(mob/user)
var/mob/living/carbon/human/H = user
@@ -390,6 +406,7 @@
var/static/list/ovens
var/on = FALSE
var/datum/beam/beam
+ total_mass = 2.5
/obj/item/melee/roastingstick/Initialize()
. = ..()
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 0d39e6c847..aabb930bb2 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -13,6 +13,7 @@
var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects
var/w_class_on = WEIGHT_CLASS_BULKY
var/clumsy_check = TRUE
+ var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard.
/obj/item/melee/transforming/Initialize()
. = ..()
@@ -46,6 +47,7 @@
active = !active
if(active)
force = force_on
+ total_mass = total_mass_on
throwforce = throwforce_on
hitsound = hitsound_on
throw_speed = 4
@@ -62,6 +64,7 @@
attack_verb = attack_verb_off
icon_state = initial(icon_state)
w_class = initial(w_class)
+ total_mass = initial(total_mass)
if(is_sharp())
var/datum/component/butchering/BT = LoadComponent(/datum/component/butchering)
BT.butchering_enabled = TRUE
@@ -84,4 +87,4 @@
/obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user)
if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "You accidentally cut yourself with [src], like a doofus!")
- user.take_bodypart_damage(5,5)
+ user.take_bodypart_damage(5,5)
\ No newline at end of file
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index b5bb4fa233..40380dfe80 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -664,6 +664,27 @@
item_state = "box"
attack_verb = list("open", "closed", "packed", "hidden", "rigged", "bombed", "sent", "gave")
+/obj/item/toy/plush/slaggy
+ name = "slag plushie"
+ desc = "A piece of slag with some googly eyes and a drawn on mouth."
+ icon_state = "slaggy"
+ item_state = "slaggy"
+ attack_verb = list("melted", "refined", "stared")
+
+/obj/item/toy/plush/mr_buckety
+ name = "bucket plushie"
+ desc = "A bucket that is missing its handle with some googly eyes and a drawn on mouth."
+ icon_state = "mr_buckety"
+ item_state = "mr_buckety"
+ attack_verb = list("filled", "dumped", "stared")
+
+/obj/item/toy/plush/dr_scanny
+ name = "scanner plushie"
+ desc = "A old outdated scanner that has been modified to have googly eyes, a dawn on mouth and, heart."
+ icon_state = "dr_scanny"
+ item_state = "dr_scanny"
+ attack_verb = list("scanned", "beeped", "stared")
+
/obj/item/toy/plush/borgplushie
name = "robot plushie"
desc = "An adorable stuffed toy of a robot."
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 6d7c3036f9..5454b0fdb8 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -282,11 +282,13 @@
var/cooldown = 0
/obj/item/harmalarm/emag_act(mob/user)
+ . = ..()
obj_flags ^= EMAGGED
if(obj_flags & EMAGGED)
to_chat(user, "You short out the safeties on [src]!")
else
to_chat(user, "You reset the safeties on [src]!")
+ return TRUE
/obj/item/harmalarm/attack_self(mob/user)
var/safety = !(obj_flags & EMAGGED)
diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm
index 07f6edb828..28a4664a24 100644
--- a/code/game/objects/items/scrolls.dm
+++ b/code/game/objects/items/scrolls.dm
@@ -66,7 +66,8 @@
to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
return
- user.forceMove(pick(L))
-
- smoke.start()
- uses--
+ if(do_teleport(user, pick(L), forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE))
+ smoke.start()
+ uses--
+ else
+ to_chat(user, "The spell matrix was disrupted by something near the destination.")
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index 1fe57d151f..b6559c9091 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -16,6 +16,7 @@
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/twohanded/singularityhammer/New()
..()
@@ -84,6 +85,7 @@
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
target.Stun(60)
diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm
index 522e1a1153..49a735af9c 100644
--- a/code/game/objects/items/stacks/bscrystal.dm
+++ b/code/game/objects/items/stacks/bscrystal.dm
@@ -33,7 +33,7 @@
use(1)
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
- do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
+ do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom)
if(!..()) // not caught in mid-air
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 4bb3359c2f..5610cbad9a 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -18,7 +18,7 @@
/obj/item/stack/medical/attack(mob/living/M, mob/user)
- if(M.stat == DEAD)
+ if(M.stat == DEAD && !stop_bleeding)
var/t_him = "it"
if(M.gender == MALE)
t_him = "him"
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index cf967e25ba..eedf5f85c1 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -19,11 +19,11 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
singular_name = "glass sheet"
icon_state = "sheet-glass"
item_state = "sheet-glass"
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass
- grind_results = list("silicon" = 20)
+ grind_results = list(/datum/reagent/silicon = 20)
point_value = 1
/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
@@ -83,11 +83,11 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
singular_name = "plasma glass sheet"
icon_state = "sheet-pglass"
item_state = "sheet-pglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass
- grind_results = list("silicon" = 20, "plasma" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
/obj/item/stack/sheet/plasmaglass/fifty
amount = 50
@@ -134,11 +134,11 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
item_state = "sheet-rglass"
- materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/metal=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
- grind_results = list("silicon" = 20, "iron" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
point_value = 4
/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
@@ -177,11 +177,11 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
singular_name = "reinforced plasma glass sheet"
icon_state = "sheet-prglass"
item_state = "sheet-prglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL = MINERAL_MATERIAL_AMOUNT * 0.5,)
+ materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT, /datum/material/metal = MINERAL_MATERIAL_AMOUNT * 0.5,)
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmarglass
- grind_results = list("silicon" = 20, "plasma" = 10, "iron" = 10)
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10)
point_value = 23
/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
@@ -198,7 +198,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
singular_name = "titanium glass sheet"
icon_state = "sheet-titaniumglass"
item_state = "sheet-titaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/titaniumglass
@@ -217,7 +217,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
singular_name = "plastitanium glass sheet"
icon_state = "sheet-plastitaniumglass"
item_state = "sheet-plastitaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plastitaniumglass
@@ -237,14 +237,15 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
item_state = "shard-glass"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
resistance_flags = ACID_PROOF
armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
max_integrity = 40
- var/cooldown = 0
sharpness = IS_SHARP
+ var/icon_prefix
+
/obj/item/shard/suicide_act(mob/user)
user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")
@@ -266,9 +267,19 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if("large")
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
- var/matrix/M = matrix(transform)
- M.Turn(rand(-170, 170))
- transform = M
+ if (icon_prefix)
+ icon_state = "[icon_prefix][icon_state]"
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
+
+/obj/item/shard/Destroy()
+ . = ..()
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
. = ..()
@@ -298,6 +309,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
return ..()
/obj/item/shard/welder_act(mob/living/user, obj/item/I)
+ ..()
if(I.use_tool(src, user, 0, volume=50))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for(var/obj/item/stack/sheet/glass/G in user.loc)
@@ -316,4 +328,13 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
playsound(loc, 'sound/effects/glass_step.ogg', 30, 1)
else
playsound(loc, 'sound/effects/glass_step.ogg', 50, 1)
- . = ..()
+ return ..()
+
+/obj/item/shard/plasma
+ name = "purple shard"
+ desc = "A nasty looking shard of plasma glass."
+ force = 6
+ throwforce = 11
+ icon_state = "plasmalarge"
+ materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
+ icon_prefix = "plasma"
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e1ecf6d14d..8c808d0e5f 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -201,6 +201,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
@@ -248,7 +249,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
null, \
new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
- new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \
+ new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
+ new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
@@ -277,6 +279,31 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
/obj/item/stack/sheet/cloth/ten
amount = 10
+//Durathread fuck slash-asterisk comments
+ GLOBAL_LIST_INIT(durathread_recipes, list ( \
+ new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40),
+ new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
+ new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
+ new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
+ ))
+
+/obj/item/stack/sheet/durathread
+ name = "durathread"
+ desc = "A fabric sown from incredibly durable threads, known for its usefulness in armor production."
+ singular_name = "durathread roll"
+ icon_state = "sheet-durathread"
+ item_state = "sheet-cloth"
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/durathread
+
+/obj/item/stack/sheet/durathread/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.durathread_recipes
+ return ..()
+
+
+
/*
* Cardboard
*/
@@ -414,6 +441,8 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("brass window - directional", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe("brass window - fulltile", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass bar stool", /obj/structure/chair/stool/bar/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass stool", /obj/structure/chair/stool/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
@@ -425,7 +454,7 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
null,
- new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/holyoil/null), \
+ new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/bottle/holyoil/empty), \
))
@@ -477,6 +506,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \
new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \
null,
new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
))
/obj/item/stack/tile/bronze
@@ -598,3 +629,29 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
amount = 20
/obj/item/stack/sheet/paperframes/fifty
amount = 50
+
+
+//durathread and cotton raw
+/obj/item/stack/sheet/cotton
+ name = "raw cotton bundle"
+ desc = "A bundle of raw cotton ready to be spun on the loom."
+ singular_name = "raw cotton ball"
+ icon_state = "sheet-cotton"
+ is_fabric = TRUE
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/cotton
+ pull_effort = 30
+ loom_result = /obj/item/stack/sheet/cloth
+
+/obj/item/stack/sheet/cotton/durathread
+ name = "raw durathread bundle"
+ desc = "A bundle of raw durathread ready to be spun on the loom."
+ singular_name = "raw durathread ball"
+ icon_state = "sheet-durathreadraw"
+ merge_type = /obj/item/stack/sheet/cotton/durathread
+ pull_effort = 70
+ loom_result = /obj/item/stack/sheet/durathread
+
+
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 21b43eba20..908fc88383 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -12,4 +12,7 @@
novariants = FALSE
var/perunit = MINERAL_MATERIAL_AMOUNT
var/sheettype = null //this is used for girders in the creation of walls/false walls
- var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity.
\ No newline at end of file
+ var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity
+ var/is_fabric = FALSE //is this a valid material for the loom?
+ var/loom_result //result from pulling on the loom
+ var/pull_effort = 0 //amount of delay when pulling on the loom
\ No newline at end of file
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index eb71311c96..887b6f5a2e 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -248,12 +248,13 @@
desc = "A bone satchel fashend with watcher wings and large bones from goliath. Can be worn on the belt."
icon = 'icons/obj/mining.dmi'
icon_state = "goliath_saddle"
- slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT
+ slot_flags = ITEM_SLOT_BACK
/obj/item/storage/backpack/satchel/bone/ComponentInitialize()
. = ..()
GET_COMPONENT(STR, /datum/component/storage)
- STR.max_combined_w_class = 10
+ STR.max_combined_w_class = 20
+ STR.max_items = 15
/obj/item/storage/backpack/satchel/cap
name = "captain's satchel"
@@ -383,6 +384,14 @@
icon_state = "duffel-eng"
item_state = "duffel-eng"
+/obj/item/storage/backpack/duffelbag/durathread
+ name = "durathread duffel bag"
+ desc = "A lightweight duffel bag made out of durathread."
+ icon_state = "duffel-durathread"
+ item_state = "duffel-durathread"
+ resistance_flags = FIRE_PROOF
+ slowdown = 0
+
/obj/item/storage/backpack/duffelbag/drone
name = "drone duffel bag"
desc = "A large duffel bag for holding tools and hats."
@@ -398,6 +407,7 @@
new /obj/item/stack/cable_coil/random(src)
new /obj/item/wirecutters(src)
new /obj/item/multitool(src)
+ new /obj/item/pipe_dispenser(src)
/obj/item/storage/backpack/duffelbag/clown
name = "clown's duffel bag"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index e3494e36cf..4495e9da14 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -10,6 +10,7 @@
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
+ var/worn_overlays = FALSE //worn counterpart of the above.
/obj/item/storage/belt/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins belting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -23,6 +24,12 @@
add_overlay(M)
..()
+/obj/item/storage/belt/worn_overlays(isinhands, icon_file)
+ . = ..()
+ if(!isinhands && worn_overlays)
+ for(var/obj/item/I in contents)
+ . += I.get_worn_belt_overlay(icon_file)
+
/obj/item/storage/belt/Initialize()
. = ..()
update_icon()
@@ -424,6 +431,48 @@
GET_COMPONENT(STR, /datum/component/storage)
STR.max_items = 6
+/obj/item/storage/belt/durathread
+ name = "durathread toolbelt"
+ desc = "A toolbelt made out of durathread, it seems resistant enough to hold even big tools like an RCD, it also has higher capacity."
+ icon_state = "webbing-durathread"
+ item_state = "webbing-durathread"
+ resistance_flags = FIRE_PROOF
+
+/obj/item/storage/belt/durathread/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 14
+ STR.max_combined_w_class = 32
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.can_hold = typecacheof(list(
+ /obj/item/crowbar,
+ /obj/item/screwdriver,
+ /obj/item/weldingtool,
+ /obj/item/wirecutters,
+ /obj/item/wrench,
+ /obj/item/multitool,
+ /obj/item/flashlight,
+ /obj/item/stack/cable_coil,
+ /obj/item/t_scanner,
+ /obj/item/analyzer,
+ /obj/item/geiger_counter,
+ /obj/item/extinguisher/mini,
+ /obj/item/radio,
+ /obj/item/clothing/gloves,
+ /obj/item/holosign_creator/atmos,
+ /obj/item/holosign_creator/engineering,
+ /obj/item/forcefield_projector,
+ /obj/item/assembly/signaler,
+ /obj/item/lightreplacer,
+ /obj/item/rcd_ammo,
+ /obj/item/construction/rcd,
+ /obj/item/pipe_dispenser,
+ /obj/item/stack/rods,
+ /obj/item/stack/tile/plasteel,
+ /obj/item/grenade/chem_grenade/metalfoam,
+ /obj/item/grenade/chem_grenade/smart_metal_foam
+ ))
+
/obj/item/storage/belt/grenade
name = "grenadier belt"
desc = "A belt for holding grenades."
@@ -517,12 +566,15 @@
/obj/item/grenade/chem_grenade,
/obj/item/lightreplacer,
/obj/item/flashlight,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/glass/bottle,
/obj/item/reagent_containers/spray,
/obj/item/soap,
/obj/item/holosign_creator,
/obj/item/key/janitor,
/obj/item/clothing/gloves,
/obj/item/melee/flyswatter,
+ /obj/item/paint/paint_remover,
/obj/item/assembly/mousetrap
))
@@ -541,6 +593,22 @@
/obj/item/ammo_casing/shotgun
))
+/obj/item/storage/belt/bandolier/durathread
+ name = "durathread bandolier"
+ desc = "An double stacked bandolier made out of durathread."
+ icon_state = "bandolier-durathread"
+ item_state = "bandolier-durathread"
+ resistance_flags = FIRE_PROOF
+
+/obj/item/storage/belt/bandolier/durathread/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_items = 32
+ STR.display_numerical_stacking = TRUE
+ STR.can_hold = typecacheof(list(
+ /obj/item/ammo_casing
+ ))
+
/obj/item/storage/belt/medolier
name = "medolier"
desc = "A medical bandolier for holding smartdarts."
@@ -653,6 +721,10 @@
icon_state = "sheath"
item_state = "sheath"
w_class = WEIGHT_CLASS_BULKY
+ content_overlays = TRUE
+ worn_overlays = TRUE
+ var/list/fitting_swords = list(/obj/item/melee/sabre, /obj/item/melee/baton/stunsword)
+ var/starting_sword = /obj/item/melee/sabre
/obj/item/storage/belt/sabre/ComponentInitialize()
. = ..()
@@ -660,35 +732,7 @@
STR.max_items = 1
STR.rustle_sound = FALSE
STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.can_hold = typecacheof(list(
- /obj/item/melee/sabre
- ))
-
-/obj/item/storage/belt/sabre/rapier
- name = "rapier sheath"
- desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
- icon_state = "rsheath"
- item_state = "rsheath"
- force = 5
- throwforce = 15
- block_chance = 30
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("bashed", "slashes", "prods", "pokes")
-
-/obj/item/storage/belt/sabre/rapier/ComponentInitialize()
- . = ..()
- GET_COMPONENT(STR, /datum/component/storage)
- STR.max_items = 1
- STR.rustle_sound = FALSE
- STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.can_hold = typecacheof(list(
- /obj/item/melee/rapier
- ))
-
-/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK)
- final_block_chance = 0 //To thin to block bullets
- return ..()
+ STR.can_hold = typecacheof(fitting_swords)
/obj/item/storage/belt/sabre/examine(mob/user)
..()
@@ -707,20 +751,28 @@
to_chat(user, "[src] is empty.")
/obj/item/storage/belt/sabre/update_icon()
- icon_state = initial(icon_state)
- item_state = initial(item_state)
- if(contents.len)
- icon_state += "-sabre"
- item_state += "-sabre"
- if(loc && isliving(loc))
+ . = ..()
+ if(isliving(loc))
var/mob/living/L = loc
L.regenerate_icons()
- ..()
/obj/item/storage/belt/sabre/PopulateContents()
- new /obj/item/melee/sabre(src)
- update_icon()
+ new starting_sword(src)
-/obj/item/storage/belt/sabre/rapier/PopulateContents()
- new /obj/item/melee/rapier(src)
- update_icon()
+/obj/item/storage/belt/sabre/rapier
+ name = "rapier sheath"
+ desc = "A black, thin sheath that looks to house only a long thin blade. Feels like its made of metal."
+ icon_state = "rsheath"
+ item_state = "rsheath"
+ force = 5
+ throwforce = 15
+ block_chance = 30
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("bashed", "slashes", "prods", "pokes")
+ fitting_swords = list(/obj/item/melee/rapier)
+ starting_sword = /obj/item/melee/rapier
+
+/obj/item/storage/belt/sabre/rapier/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 0 //To thin to block bullets
+ return ..()
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index 4ff63ceeac..903c319644 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -1131,6 +1131,7 @@
name = "Nanotrasen MRE Ration Kit Menu 0"
desc = "A package containing food suspended in an outdated bluespace pocket which lasts for centuries. If you're lucky you may even be able to enjoy the meal without getting food poisoning."
icon_state = "mre"
+ illustration = null
var/can_expire = TRUE
var/spawner_chance = 2
var/expiration_date
@@ -1184,7 +1185,7 @@
/obj/item/storage/box/mre/menu3
name = "\improper Nanotrasen MRE Ration Kit Menu 3"
- desc = "The holy grail of MREs. This item contains the fabled MRE pizza and a sample of coffee instant type 2. Any NT employee lucky enough to get their hands on one of these is truly blessed."
+ desc = "The holy grail of MREs. This item contains the fabled MRE pizza, spicy nachos and a sample of coffee instant type 2. Any NT employee lucky enough to get their hands on one of these is truly blessed."
icon_state = "menu3"
can_expire = FALSE //always fresh, never expired.
spawner_chance = 1
@@ -1192,7 +1193,42 @@
/obj/item/storage/box/mre/menu3/PopulateContents()
new /obj/item/reagent_containers/food/snacks/pizzaslice/pepperoni(src)
new /obj/item/reagent_containers/food/snacks/breadslice/plain(src)
- new /obj/item/reagent_containers/food/snacks/cheesewedge(src)
+ new /obj/item/reagent_containers/food/snacks/cubannachos(src)
new /obj/item/reagent_containers/food/snacks/grown/chili(src)
new /obj/item/reagent_containers/food/drinks/coffee/type2(src)
new /obj/item/tank/internals/emergency_oxygen(src)
+
+/obj/item/storage/box/mre/menu4
+ name = "\improper Nanotrasen MRE Ration Kit Menu 4"
+
+/obj/item/storage/box/mre/menu4/safe
+ spawner_chance = 0
+ desc = "A package containing food suspended in a bluespace pocket capable of lasting till the end of time."
+ can_expire = FALSE
+
+/obj/item/storage/box/mre/menu4/PopulateContents()
+ if(prob(66))
+ new /obj/item/reagent_containers/food/snacks/salad/boiledrice(src)
+ else
+ new /obj/item/reagent_containers/food/snacks/salad/ricebowl(src)
+ new /obj/item/reagent_containers/food/snacks/burger/tofu(src)
+ new /obj/item/reagent_containers/food/snacks/salad/fruit(src)
+ new /obj/item/reagent_containers/food/snacks/cracker(src)
+ new /obj/item/tank/internals/emergency_oxygen(src)
+
+//Where do I put this?
+/obj/item/secbat
+ name = "Secbat box"
+ desc = "Contained inside is a secbat for use with law enforcement."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "box"
+ item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+
+/obj/item/secbat/attack_self(mob/user)
+ new /mob/living/simple_animal/hostile/retaliate/bat/secbat(user.loc)
+ to_chat(user, "You open the box, releasing the secbat!")
+ var/obj/item/stack/sheet/cardboard/I = new(user.drop_location())
+ qdel(src)
+ user.put_in_hands(I)
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index bca13f2a45..ed547bc17d 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -40,9 +40,18 @@
/obj/item/storage/briefcase/lawyer/family
name = "battered briefcase"
- desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. Comes with an added belt clip!"
+ icon_state = "gbriefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
+ desc = "An old briefcase with a golden trim. It's clear they don't make them as good as they used to. Comes with an added belt clip!"
slot_flags = ITEM_SLOT_BELT
+/obj/item/storage/briefcase/lawyer/family/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.max_combined_w_class = 14
+
/obj/item/storage/briefcase/lawyer/family/PopulateContents()
new /obj/item/stamp/law(src)
new /obj/item/pen/fountain(src)
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 4924051855..eeebc6f4c5 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -48,14 +48,16 @@
to_chat(user, "It's locked!")
/obj/item/storage/lockbox/emag_act(mob/user)
- if(!broken)
- broken = TRUE
- SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
- desc += "It appears to be broken."
- icon_state = src.icon_broken
- if(user)
- visible_message("\The [src] has been broken by [user] with an electromagnetic card!")
- return
+ . = ..()
+ if(broken)
+ return
+ broken = TRUE
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
+ desc += "It appears to be broken."
+ icon_state = src.icon_broken
+ if(user)
+ visible_message("\The [src] has been broken by [user] with an electromagnetic card!")
+ return TRUE
/obj/item/storage/lockbox/Entered()
. = ..()
diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm
index 7c2694016b..b69567a2a5 100644
--- a/code/game/objects/items/storage/storage.dm
+++ b/code/game/objects/items/storage/storage.dm
@@ -16,7 +16,7 @@
AddComponent(component_type)
/obj/item/storage/AllowDrop()
- return TRUE
+ return FALSE
/obj/item/storage/contents_explosion(severity, target)
for(var/atom/A in contents)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index a6a3cea373..6e41527b24 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -132,7 +132,7 @@
new /obj/item/card/emag(src) // 6 tc
if("ninja") // 40~ tc worth
- new /obj/item/katana(src) // Unique , basicly a better esword. 10 tc?
+ new /obj/item/katana(src) // Unique , basicly a better esword. 10 tc?
new /obj/item/implanter/adrenalin(src) // 8 tc
new /obj/item/throwing_star(src) // ~5 tc for all 6
new /obj/item/throwing_star(src)
@@ -294,6 +294,7 @@
new /obj/item/radio/headset/chameleon(src)
new /obj/item/stamp/chameleon(src)
new /obj/item/pda/chameleon(src)
+ new /obj/item/clothing/neck/cloak/chameleon(src)
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index c263c2669d..cb5790e45f 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -36,7 +36,8 @@
/obj/item/reagent_containers/syringe,
/obj/item/screwdriver,
/obj/item/valentine,
- /obj/item/stamp))
+ /obj/item/stamp,
+ /obj/item/key))
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
@@ -60,7 +61,7 @@
/obj/item/storage/wallet/update_icon()
var/new_state = "wallet"
if(front_id)
- new_state = "wallet_[front_id.icon_state]"
+ new_state = "wallet_id"
if(new_state != icon_state) //avoid so many icon state changes.
icon_state = new_state
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 1245b7de94..d409e40575 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -23,7 +23,7 @@
toggle_internals(user)
/obj/item/tank/proc/toggle_internals(mob/user)
- var/mob/living/carbon/human/H = user
+ var/mob/living/carbon/H = user
if(!istype(H))
return
@@ -33,13 +33,19 @@
H.update_internals_hud_icon(0)
else
if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(!H.wear_mask)
- to_chat(H, "You need a mask!")
- return
- if(H.wear_mask.mask_adjusted)
- H.wear_mask.adjustmask(H)
- if(!(H.wear_mask.clothing_flags & MASKINTERNALS))
- to_chat(H, "[H.wear_mask] can't use [src]!")
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(H))
+ if(istype(check, /obj/item/clothing/mask))
+ var/obj/item/clothing/mask/M = check
+ if(M.mask_adjusted)
+ M.adjustmask(H)
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
+
+ if(!internals)
+ to_chat(H, "You are not wearing an internals mask!")
return
if(H.internal)
diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm
index 341c85fa1c..40392c19c3 100644
--- a/code/game/objects/items/teleprod.dm
+++ b/code/game/objects/items/teleprod.dm
@@ -10,7 +10,7 @@
. = ..()
if(!. || !istype(M) || M.anchored)
return
- do_teleport(M, get_turf(M), 15)
+ do_teleport(M, get_turf(M), 15, channel = TELEPORT_CHANNEL_BLUESPACE)
/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
@@ -18,7 +18,7 @@
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
- if(do_teleport(user, get_turf(user), 50))
+ if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE))
deductcharge(hitcost)
else
deductcharge(hitcost * 0.25)
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 97375221d4..70bfebb799 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -90,4 +90,12 @@
var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power(drop_location())
to_chat(user, "You attach the cutting jaws to [src].")
qdel(src)
- user.put_in_active_hand(cutjaws)
\ No newline at end of file
+ user.put_in_active_hand(cutjaws)
+
+/obj/item/crowbar/advanced
+ name = "advanced crowbar"
+ desc = "A scientist's almost successful reproduction of an abductor's crowbar, it uses the same technology combined with a handle that can't quite hold it."
+ icon = 'icons/obj/advancedtools.dmi'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ icon_state = "crowbar"
+ toolspeed = 0.2
\ No newline at end of file
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index e5808de088..68946f73cd 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -141,4 +141,14 @@
name = "powered screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
usesound = 'sound/items/drill_use.ogg'
- toolspeed = 0.5
\ No newline at end of file
+ toolspeed = 0.5
+
+/obj/item/screwdriver/advanced
+ name = "advanced screwdriver"
+ desc = "A classy silver screwdriver with an alien alloy tip, it works almost as well as the real thing."
+ icon = 'icons/obj/advancedtools.dmi'
+ icon_state = "screwdriver_a"
+ item_state = "screwdriver_nuke"
+ usesound = 'sound/items/pshoom.ogg'
+ toolspeed = 0.2
+ random_color = FALSE
\ No newline at end of file
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 718035a9a5..9b622a14c4 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -377,4 +377,18 @@
nextrefueltick = world.time + 10
reagents.add_reagent("welding_fuel", 1)
+/obj/item/weldingtool/advanced
+ name = "advanced welding tool"
+ desc = "A modern welding tool combined with an alien welding tool, it never runs out of fuel and works almost as fast."
+ icon = 'icons/obj/advancedtools.dmi'
+ icon_state = "welder"
+ toolspeed = 0.2
+ light_intensity = 0
+ change_icons = 0
+
+/obj/item/weldingtool/advanced/process()
+ if(get_fuel() <= max_fuel)
+ reagents.add_reagent("welding_fuel", 1)
+ ..()
+
#undef WELDER_FUEL_BURN_INTERVAL
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 1a35196bd8..527891afdb 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -82,7 +82,6 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "cutters"
toolspeed = 0.1
-
random_color = FALSE
/obj/item/wirecutters/cyborg
@@ -126,3 +125,11 @@
return
else
..()
+
+/obj/item/wirecutters/advanced
+ name = "advanced wirecutters"
+ desc = "A set of reproduction alien wirecutters, they have a silver handle with an exceedingly sharp blade."
+ icon = 'icons/obj/advancedtools.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.2
+ random_color = FALSE
\ No newline at end of file
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 4fd99e9adf..8ff960825a 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -112,4 +112,12 @@
user.dust()
- return OXYLOSS
\ No newline at end of file
+ return OXYLOSS
+
+/obj/item/wrench/advanced
+ name = "advanced wrench"
+ desc = "A wrench that uses the same magnetic technology that abductor tools use, but slightly more ineffeciently."
+ icon = 'icons/obj/advancedtools.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/empulse.ogg'
+ toolspeed = 0.2
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 9ac5261e5f..46fabea8b0 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -30,6 +30,7 @@
throw_speed = 3
throw_range = 7
force = 0
+ total_mass = TOTAL_MASS_TINY_ITEM
/*
@@ -112,10 +113,6 @@
/obj/item/toy/syndicateballoon
name = "syndicate balloon"
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
- throwforce = 0
- throw_speed = 3
- throw_range = 7
- force = 0
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "syndballoon"
item_state = "syndballoon"
@@ -225,6 +222,8 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
var/hacked = FALSE
+ total_mass = 0.4
+ var/total_mass_on = TOTAL_MASS_TOY_SWORD
/obj/item/toy/sword/attack_self(mob/user)
active = !( active )
@@ -274,6 +273,9 @@
else
return ..()
+/obj/item/toy/sword/getweight()
+ return (active ? total_mass_on : total_mass) || w_class *1.25
+
/*
* Foam armblade
*/
@@ -327,12 +329,13 @@
force_unwielded = 0
force_wielded = 0
attack_verb = list("attacked", "struck", "hit")
+ total_mass_on = TOTAL_MASS_TOY_SWORD
/obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- return 0
+ return FALSE
/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles
- return 0
+ return FALSE
/obj/item/toy/katana
name = "replica katana"
@@ -346,6 +349,7 @@
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 5
throwforce = 5
+ total_mass = null
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index bf63a96f05..82bf2c6b5f 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -28,6 +28,8 @@
var/force_wielded = 0
var/wieldsound = null
var/unwieldsound = null
+ var/slowdown_wielded = 0
+ item_flags = SLOWS_WHILE_IN_HAND
/obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE)
if(!wielded || !user)
@@ -55,7 +57,7 @@
var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
if(O && istype(O))
O.unwield()
- return
+ slowdown -= slowdown_wielded
/obj/item/twohanded/proc/wield(mob/living/carbon/user)
if(wielded)
@@ -85,7 +87,7 @@
O.desc = "Your second grip on [src]."
O.wielded = TRUE
user.put_in_inactive_hand(O)
- return
+ slowdown += slowdown_wielded
/obj/item/twohanded/dropped(mob/user)
. = ..()
@@ -279,6 +281,7 @@
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
hitsound = "swing_hit"
+ var/hitsound_on = 'sound/weapons/blade1.ogg'
armour_penetration = 35
item_color = "green"
light_color = "#00ff00"//green
@@ -290,8 +293,10 @@
var/hacked = FALSE
var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
var/list/possible_colors = list("red", "blue", "green", "purple")
- total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces.
- var/total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds. //Values copied from the regular e-sword
+ var/list/rainbow_colors = list(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ var/spinnable = TRUE
+ total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
+ var/total_mass_on = 3.4
/obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user)
if(wielded)
@@ -353,7 +358,7 @@
if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
impale(user)
return
- if((wielded) && prob(50))
+ if(spinnable && (wielded) && prob(50))
INVOKE_ASYNC(src, .proc/jedi_spin, user)
/obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
@@ -406,11 +411,14 @@
/obj/item/twohanded/dualsaber/process()
if(wielded)
if(hacked)
- light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ rainbow_process()
open_flame()
else
STOP_PROCESSING(SSobj, src)
+/obj/item/twohanded/dualsaber/proc/rainbow_process()
+ light_color = pick(rainbow_colors)
+
/obj/item/twohanded/dualsaber/IsReflect()
if(wielded)
return 1
@@ -428,7 +436,8 @@
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
add_fingerprint(user)
// Light your candles while spinning around the room
- INVOKE_ASYNC(src, .proc/jedi_spin, user)
+ if(spinnable)
+ INVOKE_ASYNC(src, .proc/jedi_spin, user)
/obj/item/twohanded/dualsaber/green
possible_colors = list("green")
@@ -478,6 +487,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
var/obj/item/grenade/explosive = null
var/war_cry = "AAAAARGH!!!"
+ var/icon_prefix = "spearglass"
/obj/item/twohanded/spear/Initialize()
. = ..()
@@ -520,7 +530,7 @@
if(explosive)
icon_state = "spearbomb[wielded]"
else
- icon_state = "spearglass[wielded]"
+ icon_state = "[icon_prefix][wielded]"
/obj/item/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
. = ..()
@@ -547,6 +557,13 @@
src.war_cry = input
/obj/item/twohanded/spear/CheckParts(list/parts_list)
+ var/obj/item/shard/tip = locate() in parts_list
+ if (istype(tip, /obj/item/shard/plasma))
+ force_wielded = 19
+ force_unwielded = 11
+ throwforce = 21
+ icon_prefix = "spearplasma"
+ qdel(tip)
var/obj/item/twohanded/spear/S = locate() in parts_list
if(S)
if(S.explosive)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 48681c3d6d..f224a6abc7 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -69,6 +69,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/claymore/Initialize()
. = ..()
@@ -223,11 +224,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
+ total_mass = TOTAL_MASS_MEDIEVAL_WEAPON
/obj/item/katana/cursed
slot_flags = null
-/obj/item/katana/Initialize()
+/obj/item/katana/cursed/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
@@ -253,7 +255,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
remove_item_from_storage(user)
- qdel(I)
+ if (!user.transferItemToLoc(I, S))
+ return
+ S.CheckParts(list(I))
qdel(src)
user.put_in_hands(S)
@@ -431,6 +435,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
sharpness = IS_SHARP
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsawhit.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/mounted_chainsaw/Initialize()
. = ..()
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index b8320c80fb..405e697d3b 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES))
return
//Cleaning one pixel with a soap or rag
- if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag))
+ if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag))
//Pixel info created only when needed
var/icon/masterpiece = icon(icon,icon_state)
var/thePix = masterpiece.GetPixel(pixX,pixY)
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 1ab28a33de..2093ae5660 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -112,12 +112,16 @@
/obj/structure/sign/barsign/emag_act(mob/user)
+ . = ..()
if(broken || (obj_flags & EMAGGED))
to_chat(user, "Nothing interesting happens!")
return
obj_flags |= EMAGGED
to_chat(user, "You emag the barsign. Takeover in progress...")
- sleep(10 SECONDS)
+ addtimer(CALLBACK(src, .proc/syndie_bar_good), 10 SECONDS)
+ return TRUE
+
+/obj/structure/sign/barsign/proc/syndie_bar_good()
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
req_access = list(ACCESS_SYNDICATE)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index e944eb32da..88d141a9ad 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -317,9 +317,6 @@
new stack_type(get_turf(loc))
qdel(src)
-
-
-
/obj/item/chair/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance))
owner.visible_message("[owner] fends off [attack_text] with [src]!")
@@ -338,7 +335,6 @@
C.Knockdown(20)
smash(user)
-
/obj/item/chair/stool
name = "stool"
icon_state = "stool_toppled"
@@ -352,6 +348,70 @@
item_state = "stool_bar"
origin_type = /obj/structure/chair/stool/bar
+//////////////////////////
+//Brass & Bronze stools!//
+//////////////////////////
+
+/obj/structure/chair/stool/bar/brass
+ name = "brass bar stool"
+ desc = "A brass bar stool with red silk for a pillow."
+ icon_state = "barbrass"
+ item_chair = /obj/item/chair/stool/bar/brass
+ buildstacktype = /obj/item/stack/tile/brass
+ buildstackamount = 1
+
+/obj/structure/chair/stool/bar/bronze
+ name = "bronze bar stool"
+ desc = "A bronze bar stool with red silk for a pillow."
+ icon_state = "barbrass"
+ item_chair = /obj/item/chair/stool/bar/bronze
+ buildstacktype = /obj/item/stack/tile/bronze
+ buildstackamount = 1
+
+/obj/structure/chair/stool/brass
+ name = "brass stool"
+ desc = "A brass stool with a silk top for comfort."
+ icon_state = "stoolbrass"
+ item_chair = /obj/item/chair/stool/brass
+ buildstacktype = /obj/item/stack/tile/brass
+ buildstackamount = 1
+
+/obj/structure/chair/stool/bronze
+ name = "bronze stool"
+ desc = "A bronze stool with a silk top for comfort."
+ icon_state = "stoolbrass"
+ item_chair = /obj/item/chair/stool/bronze
+ buildstacktype = /obj/item/stack/tile/bronze
+ buildstackamount = 1
+
+/obj/item/chair/stool/brass
+ name = "brass stool"
+ icon_state = "stoolbrass_toppled"
+ item_state = "stoolbrass"
+ origin_type = /obj/structure/chair/stool/brass
+
+/obj/item/chair/stool/bar/brass
+ name = "brass bar stool"
+ icon_state = "barbrass_toppled"
+ item_state = "stoolbrass_bar"
+ origin_type = /obj/structure/chair/stool/bar/brass
+
+/obj/item/chair/stool/bronze
+ name = "bronze stool"
+ icon_state = "stoolbrass_toppled"
+ item_state = "stoolbrass"
+ origin_type = /obj/structure/chair/stool/bronze
+
+/obj/item/chair/stool/bar/bronze
+ name = "bronze bar stool"
+ icon_state = "barbrass_toppled"
+ item_state = "stoolbrass_bar"
+ origin_type = /obj/structure/chair/stool/bar/bronze
+
+/////////////////////////////////
+//End of Brass & Bronze stools!//
+/////////////////////////////////
+
/obj/item/chair/stool/narsie_act()
return //sturdy enough to ignore a god
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 2c4463928c..edcb4a6181 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -34,6 +34,10 @@
var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable.
var/anchorable = TRUE
var/icon_welded = "welded"
+ var/obj/item/electronics/airlock/lockerelectronics //Installed electronics
+ var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
+ var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
+ var/obj/structure/closet/eigen_target //Where you go to.
/obj/structure/closet/Initialize(mapload)
@@ -42,47 +46,56 @@
PopulateContents()
if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents
take_contents()
+ if(secure)
+ lockerelectronics = new(src)
+ lockerelectronics.accesses = req_access
//USE THIS TO FILL IT, NOT INITIALIZE OR NEW
/obj/structure/closet/proc/PopulateContents()
return
/obj/structure/closet/Destroy()
- dump_contents()
+ dump_contents(override = FALSE)
return ..()
/obj/structure/closet/update_icon()
cut_overlays()
- if(!opened)
+ if(opened & icon_door_override)
+ add_overlay("[icon_door]_open")
layer = OBJ_LAYER
- if(icon_door)
- add_overlay("[icon_door]_door")
- else
- add_overlay("[icon_state]_door")
- if(welded)
- add_overlay(icon_welded)
- if(secure && !broken)
- if(locked)
- add_overlay("locked")
- else
- add_overlay("unlocked")
-
+ return
+ else if(opened)
+ add_overlay("[icon_state]_open")
+ return
+ if(icon_door)
+ add_overlay("[icon_door]_door")
else
layer = BELOW_OBJ_LAYER
- if(icon_door_override)
- add_overlay("[icon_door]_open")
- else
- add_overlay("[icon_state]_open")
+ add_overlay("[icon_state]_door")
+ if(welded)
+ add_overlay("welded")
+ if(!secure)
+ return
+ if(broken)
+ add_overlay("off")
+ add_overlay("sparking")
+ else if(locked)
+ add_overlay("locked")
+ else
+ add_overlay("unlocked")
/obj/structure/closet/examine(mob/user)
..()
if(welded)
- to_chat(user, "It's welded shut.")
+ to_chat(user, "It's welded shut.")
if(anchored)
to_chat(user, "It is bolted to the ground.")
if(opened)
to_chat(user, "The parts are welded together.")
else if(secure && !opened)
+ else if(broken)
+ to_chat(user, "The lock is screwed in.")
+ else if(secure)
to_chat(user, "Alt-click to [locked ? "unlock" : "lock"].")
if(isliving(user))
var/mob/living/L = user
@@ -117,9 +130,39 @@
return FALSE
return TRUE
-/obj/structure/closet/proc/dump_contents()
+/obj/structure/closet/proc/can_lock(mob/living/user, var/check_access = TRUE) //set check_access to FALSE if you only need to check if a locker has a functional lock rather than access
+ if(!secure)
+ return FALSE
+ if(broken)
+ to_chat(user, "[src] is broken!")
+ return FALSE
+ if(QDELETED(lockerelectronics) && !locked) //We want to be able to unlock it regardless of electronics, but only lockable with electronics
+ to_chat(user, "[src] is missing locker electronics!")
+ return FALSE
+ if(!check_access)
+ return TRUE
+ if(allowed(user))
+ return TRUE
+ to_chat(user, "Access denied.")
+
+/obj/structure/closet/proc/togglelock(mob/living/user)
+ add_fingerprint(user)
+ if(eigen_target)
+ return
+ if(opened)
+ return
+ if(!can_lock(user))
+ return
+ locked = !locked
+ user.visible_message("[user] [locked ? null : "un"]locks [src].",
+ "You [locked ? null : "un"]lock [src].")
+ update_icon()
+
+/obj/structure/closet/proc/dump_contents(var/override = TRUE) //Override is for not revealing the locker electronics when you open the locker, for example
var/atom/L = drop_location()
for(var/atom/movable/AM in src)
+ if(AM == lockerelectronics && override)
+ continue
AM.forceMove(L)
if(throwing) // you keep some momentum when getting out of a thrown closet
step(AM, dir)
@@ -148,7 +191,12 @@
if(contents.len >= storage_capacity)
return -1
if(insertion_allowed(AM))
- AM.forceMove(src)
+ if(eigen_teleport) // For teleporting people with linked lockers.
+ do_teleport(AM, get_turf(eigen_target), 0)
+ if(eigen_target.opened == FALSE)
+ eigen_target.bust_open()
+ else
+ AM.forceMove(src)
return TRUE
else
return FALSE
@@ -207,6 +255,73 @@
else
return open(user)
+/obj/structure/closet/proc/bust_open()
+ welded = FALSE //applies to all lockers
+ locked = FALSE //applies to critter crates and secure lockers only
+ broken = TRUE //applies to secure lockers only
+ open()
+
+/obj/structure/closet/proc/handle_lock_addition(mob/user, obj/item/electronics/airlock/E)
+ add_fingerprint(user)
+ if(lock_in_use)
+ to_chat(user, "Wait for work on [src] to be done first!")
+ return
+ if(secure)
+ to_chat(user, "This locker already has a lock!")
+ return
+ if(broken)
+ to_chat(user, "Unscrew the broken lock first!")
+ return
+ if(!istype(E))
+ return
+ user.visible_message("[user] begins installing a lock on [src]...","You begin installing a lock on [src]...")
+ lock_in_use = TRUE
+ playsound(loc, 'sound/items/screwdriver.ogg', 50, 1)
+ if(!do_after(user, 60, target = src))
+ lock_in_use = FALSE
+ return
+ lock_in_use = FALSE
+ to_chat(user, "You finish the lock on [src]!")
+ E.forceMove(src)
+ lockerelectronics = E
+ req_access = E.accesses
+ secure = TRUE
+ update_icon()
+ return TRUE
+
+/obj/structure/closet/proc/handle_lock_removal(mob/user, obj/item/screwdriver/S)
+ if(lock_in_use)
+ to_chat(user, "Wait for work on [src] to be done first!")
+ return
+ if(locked)
+ to_chat(user, "Unlock it first!")
+ return
+ if(!secure)
+ to_chat(user, "[src] doesn't have a lock that you can remove!")
+ return
+ if(!istype(S))
+ return
+ var/brokenword = broken ? "broken " : null
+ user.visible_message("[user] begins removing the [brokenword]lock on [src]...","You begin removing the [brokenword]lock on [src]...")
+ playsound(loc, S.usesound, 50, 1)
+ lock_in_use = TRUE
+ if(!do_after(user, 100 * S.toolspeed, target = src))
+ lock_in_use = FALSE
+ return
+ to_chat(user, "You remove the [brokenword]lock from [src]!")
+ if(!QDELETED(lockerelectronics))
+ lockerelectronics.add_fingerprint(user)
+ lockerelectronics.forceMove(user.loc)
+ lockerelectronics = null
+ req_access = null
+ secure = FALSE
+ broken = FALSE
+ locked = FALSE
+ lock_in_use = FALSE
+ update_icon()
+ return TRUE
+
+
/obj/structure/closet/deconstruct(disassembled = TRUE)
if(ispath(material_drop) && material_drop_amount && !(flags_1 & NODECONSTRUCT_1))
new material_drop(loc, material_drop_amount)
@@ -234,6 +349,9 @@
to_chat(user, "You begin cutting \the [src] apart...")
if(W.use_tool(src, user, 40, volume=50))
+ if(eigen_teleport)
+ to_chat(user, "The unstable nature of \the [src] makes it impossible to cut!")
+ return
if(!opened)
return
user.visible_message("[user] slices apart \the [src].",
@@ -247,18 +365,25 @@
deconstruct(TRUE)
return
if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
- return
+ return TRUE
+ else if(istype(W, /obj/item/electronics/airlock))
+ handle_lock_addition(user, W)
+ else if(istype(W, /obj/item/screwdriver))
+ handle_lock_removal(user, W)
else if(istype(W, /obj/item/weldingtool) && can_weld_shut)
if(!W.tool_start_check(user, amount=0))
return
to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...")
if(W.use_tool(src, user, 40, volume=50))
+ if(eigen_teleport)
+ to_chat(user, "The unstable nature of \the [src] makes it impossible to weld!")
+ return
if(opened)
return
welded = !welded
after_weld(welded)
- user.visible_message("[user] [welded ? "welds shut" : "unwelded"] \the [src].",
+ user.visible_message("[user] [welded ? "welds shut" : "unwelds"] \the [src].",
"You [welded ? "weld" : "unwelded"] \the [src] with \the [W].",
"You hear welding.")
update_icon()
@@ -401,20 +526,12 @@
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
to_chat(user, "You fail to break out of [src]!")
-/obj/structure/closet/proc/bust_open()
- welded = FALSE //applies to all lockers
- locked = FALSE //applies to critter crates and secure lockers only
- broken = TRUE //applies to secure lockers only
- open()
-
/obj/structure/closet/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc))
+ if(!user.canUseTopic(src, be_close=TRUE) || !isturf(loc))
+ to_chat(user, "You can't do that right now!")
return
- if(opened || !secure)
- return
- else
- togglelock(user)
+ togglelock(user)
/obj/structure/closet/CtrlShiftClick(mob/living/user)
if(!HAS_TRAIT(user, TRAIT_SKITTISH))
@@ -423,29 +540,19 @@
return
dive_into(user)
-/obj/structure/closet/proc/togglelock(mob/living/user, silent)
- if(secure && !broken)
- if(allowed(user))
- if(iscarbon(user))
- add_fingerprint(user)
- locked = !locked
- user.visible_message("[user] [locked ? null : "un"]locks [src].",
- "You [locked ? null : "un"]lock [src].")
- update_icon()
- else if(!silent)
- to_chat(user, "Access Denied")
- else if(secure && broken)
- to_chat(user, "\The [src] is broken!")
-
/obj/structure/closet/emag_act(mob/user)
- if(secure && !broken)
- user.visible_message("Sparks fly from [src]!",
- "You scramble [src]'s lock, breaking it open!",
- "You hear a faint electrical spark.")
- playsound(src, "sparks", 50, 1)
- broken = TRUE
- locked = FALSE
- update_icon()
+ . = ..()
+ if(!secure || broken)
+ return
+ user.visible_message("Sparks fly from [src]!",
+ "You scramble [src]'s lock, breaking it open!",
+ "You hear a faint electrical spark.")
+ playsound(src, "sparks", 50, 1)
+ broken = TRUE
+ locked = FALSE
+ if(!QDELETED(lockerelectronics))
+ QDEL_NULL(lockerelectronics)
+ update_icon()
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
@@ -458,16 +565,19 @@
if (!(. & EMP_PROTECT_CONTENTS))
for(var/obj/O in src)
O.emp_act(severity)
- if(secure && !broken && !(. & EMP_PROTECT_SELF))
- if(prob(50 / severity))
- locked = !locked
- update_icon()
- if(prob(20 / severity) && !opened)
- if(!locked)
- open()
- else
- req_access = list()
- req_access += pick(get_all_accesses())
+ if(!secure || broken)
+ return ..()
+ if(prob(50 / severity))
+ locked = !locked
+ update_icon()
+ if(prob(20 / severity) && !opened)
+ if(!locked)
+ open()
+ else
+ req_access = list()
+ req_access += pick(get_all_accesses())
+ if(!QDELETED(lockerelectronics))
+ lockerelectronics.accesses = req_access
/obj/structure/closet/contents_explosion(severity, target)
for(var/atom/A in contents)
diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
index 502b23354c..1c34850274 100644
--- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
@@ -49,6 +49,12 @@
return 1
return 0
+/obj/structure/closet/body_bag/handle_lock_addition()
+ return
+
+/obj/structure/closet/body_bag/handle_lock_removal()
+ return
+
/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
. = ..()
if(over_object == usr && Adjacent(usr) && (in_range(src, usr) || usr.contents.Find(src)))
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 82b0d1a441..aad68b2166 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -57,6 +57,11 @@
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
+/obj/structure/closet/cardboard/handle_lock_addition() //Whoever heard of a lockable cardboard box anyway
+ return
+
+/obj/structure/closet/cardboard/handle_lock_removal()
+ return
/obj/structure/closet/cardboard/metal
name = "large metal box"
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 0809edaa71..d2ab9ea6fb 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -21,8 +21,8 @@
new /obj/item/clothing/head/soft/black(src)
new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/shoes/sneakers/black(src)
- new /obj/item/reagent_containers/glass/rag(src)
- new /obj/item/reagent_containers/glass/rag(src)
+ new /obj/item/reagent_containers/rag(src)
+ new /obj/item/reagent_containers/rag(src)
new /obj/item/storage/box/beanbag(src)
new /obj/item/clothing/suit/armor/vest/alt(src)
new /obj/item/circuitboard/machine/dish_drive(src)
@@ -53,7 +53,7 @@
new /obj/item/clothing/suit/toggle/chef(src)
new /obj/item/clothing/under/rank/chef(src)
new /obj/item/clothing/head/chefhat(src)
- new /obj/item/reagent_containers/glass/rag(src)
+ new /obj/item/reagent_containers/rag(src)
/obj/structure/closet/jcloset
name = "custodial closet"
@@ -358,3 +358,8 @@
new /obj/item/clothing/shoes/workboots/mining(src)
new /obj/item/storage/backpack/satchel/explorer(src)
+/obj/structure/closet/coffin/handle_lock_addition()
+ return
+
+/obj/structure/closet/coffin/handle_lock_removal()
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 5a9228e397..18928424c0 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -9,6 +9,7 @@
new /obj/item/clothing/head/beret/qm(src)
new /obj/item/storage/lockbox/medal/cargo(src)
new /obj/item/clothing/under/rank/cargo(src)
+ new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/radio/headset/headset_cargo(src)
new /obj/item/clothing/suit/fire/firefighter(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 0d06276876..167823b9be 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -8,6 +8,7 @@
new /obj/item/clothing/neck/cloak/ce(src)
new /obj/item/clothing/head/beret/ce(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
+ new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/head/welding(src)
new /obj/item/clothing/gloves/color/yellow(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 9081cddbe4..0f810225b3 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -61,6 +61,7 @@
new /obj/item/clothing/head/bio_hood/cmo(src)
new /obj/item/clothing/suit/toggle/labcoat/cmo(src)
new /obj/item/clothing/under/rank/chief_medical_officer(src)
+ new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown (src)
new /obj/item/cartridge/cmo(src)
new /obj/item/radio/headset/heads/cmo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index eb764fc230..e44d3c9079 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -4,6 +4,18 @@
req_access = list(ACCESS_ALL_PERSONAL_LOCKERS)
var/registered_name = null
+/obj/structure/closet/secure_closet/personal/examine(mob/user)
+ ..()
+ if(registered_name)
+ to_chat(user, "The display reads, \"Owned by [registered_name]\".")
+
+/obj/structure/closet/secure_closet/personal/check_access(obj/item/card/id/I)
+ . = ..()
+ if(!I || !istype(I))
+ return
+ if(registered_name == I.registered_name)
+ return TRUE
+
/obj/structure/closet/secure_closet/personal/PopulateContents()
..()
if(prob(50))
@@ -33,21 +45,21 @@
/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params)
var/obj/item/card/id/I = W.GetID()
- if(istype(I))
- if(broken)
- to_chat(user, "It appears to be broken.")
- return
- if(!I || !I.registered_name)
- return
- if(allowed(user) || !registered_name || (istype(I) && (registered_name == I.registered_name)))
- //they can open all lockers, or nobody owns this, or they own this locker
- locked = !locked
- update_icon()
-
- if(!registered_name)
- registered_name = I.registered_name
- desc = "Owned by [I.registered_name]."
- else
- to_chat(user, "Access Denied.")
- else
+ if(!I || !istype(I))
return ..()
+ if(!can_lock(user, FALSE)) //Can't do anything if there isn't a lock!
+ return
+ if(I.registered_name && !registered_name)
+ to_chat(user, "You claim [src].")
+ registered_name = I.registered_name
+ else
+ ..()
+
+/obj/structure/closet/secure_closet/personal/handle_lock_addition() //If lock construction is successful we don't care what access the electronics had, so we override it
+ if(..())
+ req_access = list(ACCESS_ALL_PERSONAL_LOCKERS)
+ lockerelectronics.accesses = req_access
+
+/obj/structure/closet/secure_closet/personal/handle_lock_removal()
+ if(..())
+ registered_name = null
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 7fe1247eb7..efcc2aa7ca 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -11,8 +11,11 @@
new /obj/item/clothing/head/bio_hood/scientist(src)
new /obj/item/clothing/suit/toggle/labcoat(src)
new /obj/item/clothing/under/rank/research_director(src)
+ new /obj/item/clothing/under/rank/research_director/skirt(src)
new /obj/item/clothing/under/rank/research_director/alt(src)
+ new /obj/item/clothing/under/rank/research_director/alt/skirt(src)
new /obj/item/clothing/under/rank/research_director/turtleneck(src)
+ new /obj/item/clothing/under/rank/research_director/turtleneck/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/cartridge/rd(src)
new /obj/item/clothing/gloves/color/latex(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 8c06af91a4..3cb8ceb22b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -2,7 +2,6 @@
name = "\proper captain's locker"
req_access = list(ACCESS_CAPTAIN)
icon_state = "cap"
-
/obj/structure/closet/secure_closet/captains/PopulateContents()
..()
new /obj/item/clothing/suit/hooded/wintercoat/captain(src)
@@ -14,6 +13,7 @@
new /obj/item/pet_carrier(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/clothing/under/rank/captain(src)
+ new /obj/item/clothing/under/rank/captain/skirt(src)
new /obj/item/clothing/suit/armor/vest/capcarapace(src)
new /obj/item/clothing/head/caphat(src)
new /obj/item/clothing/under/captainparade(src)
@@ -34,16 +34,15 @@
new /obj/item/gun/energy/e_gun(src)
new /obj/item/door_remote/captain(src)
new /obj/item/storage/photo_album/Captain(src)
-
/obj/structure/closet/secure_closet/hop
name = "\proper head of personnel's locker"
req_access = list(ACCESS_HOP)
icon_state = "hop"
-
/obj/structure/closet/secure_closet/hop/PopulateContents()
..()
new /obj/item/clothing/neck/cloak/hop(src)
new /obj/item/clothing/under/rank/head_of_personnel(src)
+ new /obj/item/clothing/under/rank/head_of_personnel/skirt(src)
new /obj/item/clothing/head/hopcap(src)
new /obj/item/clothing/head/hopcap/beret(src)
new /obj/item/cartridge/hop(src)
@@ -62,12 +61,10 @@
new /obj/item/door_remote/civillian(src)
new /obj/item/circuitboard/machine/techfab/department/service(src)
new /obj/item/storage/photo_album/HoP(src)
-
/obj/structure/closet/secure_closet/hos
name = "\proper head of security's locker"
req_access = list(ACCESS_HOS)
icon_state = "hos"
-
/obj/structure/closet/secure_closet/hos/PopulateContents()
..()
new /obj/item/clothing/neck/cloak/hos(src)
@@ -77,7 +74,9 @@
new /obj/item/clothing/under/hosparademale(src)
new /obj/item/clothing/suit/armor/vest/leather(src)
new /obj/item/clothing/suit/armor/hos(src)
+ new /obj/item/clothing/under/rank/head_of_security/skirt(src)
new /obj/item/clothing/under/rank/head_of_security/alt(src)
+ new /obj/item/clothing/under/rank/head_of_security/alt/skirt(src)
new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch(src)
new /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars(src)
@@ -95,12 +94,10 @@
new /obj/item/pinpointer/nuke(src)
new /obj/item/circuitboard/machine/techfab/department/security(src)
new /obj/item/storage/photo_album/HoS(src)
-
/obj/structure/closet/secure_closet/warden
name = "\proper warden's locker"
req_access = list(ACCESS_ARMORY)
icon_state = "warden"
-
/obj/structure/closet/secure_closet/warden/PopulateContents()
..()
new /obj/item/radio/headset/headset_sec(src)
@@ -110,6 +107,7 @@
new /obj/item/clothing/head/beret/sec/navywarden(src)
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
new /obj/item/clothing/under/rank/warden/navyblue(src)
+ new /obj/item/clothing/under/rank/warden/skirt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/holosign_creator/security(src)
new /obj/item/clothing/mask/gas/sechailer(src)
@@ -120,12 +118,10 @@
new /obj/item/clothing/gloves/krav_maga/sec(src)
new /obj/item/door_remote/head_of_security(src)
new /obj/item/gun/ballistic/shotgun/automatic/combat/compact(src)
-
/obj/structure/closet/secure_closet/security
name = "security officer's locker"
req_access = list(ACCESS_SECURITY)
icon_state = "sec"
-
/obj/structure/closet/secure_closet/security/PopulateContents()
..()
new /obj/item/clothing/suit/armor/vest(src)
@@ -134,55 +130,45 @@
new /obj/item/radio/headset/headset_sec/alt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/flashlight/seclite(src)
-
/obj/structure/closet/secure_closet/security/sec
-
/obj/structure/closet/secure_closet/security/sec/PopulateContents()
..()
new /obj/item/storage/belt/security/full(src)
-
/obj/structure/closet/secure_closet/security/cargo
-
/obj/structure/closet/secure_closet/security/cargo/PopulateContents()
..()
new /obj/item/clothing/accessory/armband/cargo(src)
new /obj/item/encryptionkey/headset_cargo(src)
-
/obj/structure/closet/secure_closet/security/engine
-
/obj/structure/closet/secure_closet/security/engine/PopulateContents()
..()
new /obj/item/clothing/accessory/armband/engine(src)
new /obj/item/encryptionkey/headset_eng(src)
-
/obj/structure/closet/secure_closet/security/science
-
/obj/structure/closet/secure_closet/security/science/PopulateContents()
..()
new /obj/item/clothing/accessory/armband/science(src)
new /obj/item/encryptionkey/headset_sci(src)
-
/obj/structure/closet/secure_closet/security/med
-
/obj/structure/closet/secure_closet/security/med/PopulateContents()
..()
new /obj/item/clothing/accessory/armband/medblue(src)
new /obj/item/encryptionkey/headset_med(src)
-
/obj/structure/closet/secure_closet/detective
name = "\improper detective's cabinet"
req_access = list(ACCESS_FORENSICS_LOCKERS)
icon_state = "cabinet"
resistance_flags = FLAMMABLE
max_integrity = 70
-
/obj/structure/closet/secure_closet/detective/PopulateContents()
..()
new /obj/item/clothing/under/rank/det(src)
+ new /obj/item/clothing/under/rank/det/skirt(src)
new /obj/item/clothing/suit/det_suit(src)
new /obj/item/clothing/head/fedora/det_hat(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/under/rank/det/grey(src)
+ new /obj/item/clothing/under/rank/det/grey/skirt(src)
new /obj/item/clothing/accessory/waistcoat(src)
new /obj/item/clothing/suit/det_suit/grey(src)
new /obj/item/clothing/head/fedora(src)
@@ -200,33 +186,29 @@
/obj/structure/closet/secure_closet/injection
name = "lethal injections"
req_access = list(ACCESS_HOS)
-
/obj/structure/closet/secure_closet/injection/PopulateContents()
..()
for(var/i in 1 to 5)
new /obj/item/reagent_containers/syringe/lethal/execution(src)
-
/obj/structure/closet/secure_closet/brig
name = "brig locker"
req_access = list(ACCESS_BRIG)
anchored = TRUE
var/id = null
-
/obj/structure/closet/secure_closet/evidence
anchored = TRUE
name = "Secure Evidence Closet"
req_access_txt = "0"
req_one_access_txt = list(ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS)
-
/obj/structure/closet/secure_closet/brig/PopulateContents()
..()
new /obj/item/clothing/under/rank/prisoner( src )
+ new /obj/item/clothing/under/rank/prisoner/skirt( src )
new /obj/item/clothing/shoes/sneakers/orange( src )
/obj/structure/closet/secure_closet/courtroom
name = "courtroom locker"
req_access = list(ACCESS_COURT)
-
/obj/structure/closet/secure_closet/courtroom/PopulateContents()
..()
new /obj/item/clothing/shoes/sneakers/brown(src)
@@ -236,22 +218,18 @@
new /obj/item/clothing/suit/judgerobe (src)
new /obj/item/clothing/head/powdered_wig (src)
new /obj/item/storage/briefcase(src)
-
/obj/structure/closet/secure_closet/contraband/armory
anchored = TRUE
name = "Contraband Locker"
req_access = list(ACCESS_ARMORY)
-
/obj/structure/closet/secure_closet/contraband/heads
anchored = TRUE
name = "Contraband Locker"
req_access = list(ACCESS_HEADS)
-
/obj/structure/closet/secure_closet/armory1
name = "armory armor locker"
req_access = list(ACCESS_ARMORY)
icon_state = "armory"
-
/obj/structure/closet/secure_closet/armory1/PopulateContents()
..()
new /obj/item/clothing/suit/armor/laserproof(src)
@@ -261,12 +239,10 @@
new /obj/item/clothing/head/helmet/riot(src)
for(var/i in 1 to 3)
new /obj/item/shield/riot(src)
-
/obj/structure/closet/secure_closet/armory2
name = "armory ballistics locker"
req_access = list(ACCESS_ARMORY)
icon_state = "armory"
-
/obj/structure/closet/secure_closet/armory2/PopulateContents()
..()
new /obj/item/storage/box/firingpins(src)
@@ -274,12 +250,10 @@
new /obj/item/storage/box/rubbershot(src)
for(var/i in 1 to 3)
new /obj/item/gun/ballistic/shotgun/riot(src)
-
/obj/structure/closet/secure_closet/armory3
name = "armory energy gun locker"
req_access = list(ACCESS_ARMORY)
icon_state = "armory"
-
/obj/structure/closet/secure_closet/armory3/PopulateContents()
..()
new /obj/item/storage/box/firingpins(src)
@@ -288,24 +262,20 @@
new /obj/item/gun/energy/e_gun(src)
for(var/i in 1 to 3)
new /obj/item/gun/energy/laser(src)
-
/obj/structure/closet/secure_closet/tac
name = "armory tac locker"
req_access = list(ACCESS_ARMORY)
icon_state = "tac"
-
/obj/structure/closet/secure_closet/tac/PopulateContents()
..()
new /obj/item/gun/ballistic/automatic/wt550(src)
new /obj/item/clothing/head/helmet/alt(src)
new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/clothing/suit/armor/bulletproof(src)
-
/obj/structure/closet/secure_closet/lethalshots
name = "shotgun lethal rounds"
req_access = list(ACCESS_ARMORY)
icon_state = "tac"
-
/obj/structure/closet/secure_closet/lethalshots/PopulateContents()
..()
for(var/i in 1 to 3)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index f2d32b773e..94d1b03fdb 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -9,6 +9,7 @@
/obj/structure/closet/syndicate/personal/PopulateContents()
..()
new /obj/item/clothing/under/syndicate(src)
+ new /obj/item/clothing/under/syndicate/skirt(src)
new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/radio/headset/syndicate(src)
new /obj/item/ammo_box/magazine/m10mm(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 7493603ad4..d83922d708 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -2,33 +2,34 @@
name = "wardrobe"
desc = "It's a storage unit for standard-issue Nanotrasen attire."
icon_door = "blue"
-
/obj/structure/closet/wardrobe/PopulateContents()
..()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/blue(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/blue(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/brown(src)
return
-
/obj/structure/closet/wardrobe/pink
name = "pink wardrobe"
icon_door = "pink"
-
/obj/structure/closet/wardrobe/pink/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/pink(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/pink(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/brown(src)
return
-
/obj/structure/closet/wardrobe/black
name = "black wardrobe"
icon_door = "black"
-
/obj/structure/closet/wardrobe/black/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/black(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/black(src)
if(prob(25))
new /obj/item/clothing/suit/jacket/leather(src)
if(prob(20))
@@ -44,66 +45,60 @@
if(prob(40))
new /obj/item/clothing/mask/bandana/skull(src)
return
-
-
/obj/structure/closet/wardrobe/green
name = "green wardrobe"
icon_door = "green"
-
/obj/structure/closet/wardrobe/green/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/green(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/green(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/clothing/mask/bandana/green(src)
new /obj/item/clothing/mask/bandana/green(src)
return
-
-
/obj/structure/closet/wardrobe/orange
name = "prison wardrobe"
desc = "It's a storage unit for Nanotrasen-regulation prisoner attire."
icon_door = "orange"
-
/obj/structure/closet/wardrobe/orange/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/rank/prisoner(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/rank/prisoner/skirt(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/orange(src)
return
-
-
/obj/structure/closet/wardrobe/yellow
name = "yellow wardrobe"
icon_door = "yellow"
-
/obj/structure/closet/wardrobe/yellow/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/yellow(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/yellow(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/orange(src)
new /obj/item/clothing/mask/bandana/gold(src)
new /obj/item/clothing/mask/bandana/gold(src)
return
-
-
/obj/structure/closet/wardrobe/white
name = "white wardrobe"
icon_door = "white"
-
/obj/structure/closet/wardrobe/white/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/white(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/white(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/white(src)
for(var/i in 1 to 3)
new /obj/item/clothing/head/soft/mime(src)
return
-
/obj/structure/closet/wardrobe/pjs
name = "pajama wardrobe"
icon_door = "white"
-
/obj/structure/closet/wardrobe/pjs/PopulateContents()
new /obj/item/clothing/under/pj/red(src)
new /obj/item/clothing/under/pj/red(src)
@@ -112,15 +107,14 @@
for(var/i in 1 to 4)
new /obj/item/clothing/shoes/sneakers/white(src)
return
-
-
/obj/structure/closet/wardrobe/grey
name = "grey wardrobe"
icon_door = "grey"
-
/obj/structure/closet/wardrobe/grey/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/clothing/under/color/grey(src)
+ for(var/i in 1 to 3)
+ new /obj/item/clothing/under/skirt/color/grey(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/black(src)
for(var/i in 1 to 3)
@@ -140,28 +134,36 @@
if(prob(30))
new /obj/item/clothing/accessory/pocketprotector(src)
return
-
-
/obj/structure/closet/wardrobe/mixed
name = "mixed wardrobe"
icon_door = "mixed"
-
/obj/structure/closet/wardrobe/mixed/PopulateContents()
if(prob(40))
new /obj/item/clothing/suit/jacket(src)
if(prob(40))
new /obj/item/clothing/suit/jacket(src)
new /obj/item/clothing/under/color/white(src)
+ new /obj/item/clothing/under/skirt/color/white(src)
new /obj/item/clothing/under/color/blue(src)
+ new /obj/item/clothing/under/skirt/color/blue(src)
new /obj/item/clothing/under/color/yellow(src)
+ new /obj/item/clothing/under/skirt/color/yellow(src)
new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/under/skirt/color/green(src)
new /obj/item/clothing/under/color/orange(src)
+ new /obj/item/clothing/under/skirt/color/orange(src)
new /obj/item/clothing/under/color/pink(src)
+ new /obj/item/clothing/under/skirt/color/pink(src)
new /obj/item/clothing/under/color/red(src)
+ new /obj/item/clothing/under/skirt/color/red(src)
new /obj/item/clothing/under/color/darkblue(src)
+ new /obj/item/clothing/under/skirt/color/darkblue(src)
new /obj/item/clothing/under/color/teal(src)
+ new /obj/item/clothing/under/skirt/color/teal(src)
new /obj/item/clothing/under/color/lightpurple(src)
+ new /obj/item/clothing/under/skirt/color/lightpurple(src)
new /obj/item/clothing/under/color/green(src)
+ new /obj/item/clothing/under/skirt/color/green(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/blue(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 067b1b0eb1..6caa7d834b 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -54,6 +54,12 @@
manifest = null
update_icon()
+/obj/structure/closet/crate/handle_lock_addition()
+ return
+
+/obj/structure/closet/crate/handle_lock_removal()
+ return
+
/obj/structure/closet/crate/proc/tear_manifest(mob/user)
to_chat(user, "You tear the manifest off of [src].")
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 461e19adf1..cdca354563 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -79,4 +79,4 @@
var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null
if(!n_color || !H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return default_color
- return n_color
+ return sanitize_hexcolor(n_color)
diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
new file mode 100644
index 0000000000..e3002a8fae
--- /dev/null
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -0,0 +1,175 @@
+#define BREAKER_ANIMATION_LENGTH 32
+#define BREAKER_SLAT_RAISED 1
+#define BREAKER_SLAT_MOVING 2
+#define BREAKER_SLAT_DROPPED 3
+#define BREAKER_ACTIVATE_DELAY 30
+#define BREAKER_WRENCH_DELAY 10
+#define BREAKER_ACTION_INUSE 5
+#define BREAKER_ACTION_WRENCH 6
+
+/obj/structure/femur_breaker
+ name = "femur breaker"
+ desc = "A large structure used to break the femurs of traitors and treasonists."
+ icon = 'icons/obj/femur_breaker.dmi'
+ icon_state = "breaker_raised"
+ can_buckle = TRUE
+ anchored = TRUE
+ density = TRUE
+ max_buckled_mobs = 1
+ buckle_lying = TRUE
+ buckle_prevents_pull = TRUE
+ layer = ABOVE_MOB_LAYER
+ var/slat_status = BREAKER_SLAT_RAISED
+ var/current_action = 0 // What's currently happening to the femur breaker
+
+/obj/structure/femur_breaker/examine(mob/user)
+ ..()
+
+ var/msg = ""
+
+ msg += "It is [anchored ? "secured to the floor." : "unsecured."]
"
+
+ if (slat_status == BREAKER_SLAT_RAISED)
+ msg += "The breaker slat is in a neutral position."
+ else
+ msg += "The breaker slat is lowered, and must be raised."
+
+ if (LAZYLEN(buckled_mobs))
+ msg += "
"
+ msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
+
+ to_chat(user, msg)
+
+ return msg
+
+/obj/structure/femur_breaker/attack_hand(mob/user)
+ add_fingerprint(user)
+
+ // Currently being used
+ if (current_action)
+ return
+
+ switch (slat_status)
+ if (BREAKER_SLAT_MOVING)
+ return
+ if (BREAKER_SLAT_DROPPED)
+ slat_status = BREAKER_SLAT_MOVING
+ icon_state = "breaker_raise"
+ addtimer(CALLBACK(src, .proc/raise_slat), BREAKER_ANIMATION_LENGTH)
+ return
+ if (BREAKER_SLAT_RAISED)
+ if (LAZYLEN(buckled_mobs))
+ if (user.a_intent == INTENT_HARM)
+ user.visible_message("[user] begins to pull the lever!",
+ "You begin to the pull the lever.")
+ current_action = BREAKER_ACTION_INUSE
+
+ if (do_after(user, BREAKER_ACTIVATE_DELAY, target = src) && slat_status == BREAKER_SLAT_RAISED)
+ current_action = 0
+ slat_status = BREAKER_SLAT_MOVING
+ icon_state = "breaker_drop"
+ drop_slat(user)
+ else
+ current_action = 0
+ else
+ var/mob/living/carbon/human/H = buckled_mobs[1]
+
+ if (H)
+ H.regenerate_icons()
+
+ unbuckle_all_mobs()
+ else //HERE
+ slat_status = BREAKER_SLAT_DROPPED
+ icon_state = "breaker_drop"
+
+/obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H)
+ H.emote("scream")
+ H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ H.adjustBruteLoss(rand(5,20) + (max(0, H.health))) //Make absolutely sure they end up in crit, so that they can succumb if they wish.
+
+/obj/structure/femur_breaker/proc/raise_slat()
+ slat_status = BREAKER_SLAT_RAISED
+ icon_state = "breaker_raised"
+
+/obj/structure/femur_breaker/proc/drop_slat(mob/user)
+ if (buckled_mobs.len)
+ var/mob/living/carbon/human/H = buckled_mobs[1]
+
+ if (!H)
+ return
+
+ playsound(src, 'sound/effects/femur_breaker.ogg', 100, FALSE)
+ H.Stun(BREAKER_ANIMATION_LENGTH)
+ addtimer(CALLBACK(src, .proc/damage_leg, H), BREAKER_ANIMATION_LENGTH, TIMER_UNIQUE)
+ log_combat(user, H, "femur broke", src)
+
+ slat_status = BREAKER_SLAT_DROPPED
+ icon_state = "breaker"
+
+/obj/structure/femur_breaker/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
+ if (!anchored)
+ to_chat(usr, "The [src] needs to be wrenched to the floor!")
+ return FALSE
+
+ if (!istype(M, /mob/living/carbon/human))
+ to_chat(usr, "It doesn't look like [M.p_they()] can fit into this properly!")
+ return FALSE
+
+ if (slat_status != BREAKER_SLAT_RAISED)
+ to_chat(usr, "The femur breaker must be in its neutral position before buckling someone in!")
+ return FALSE
+
+ return ..(M, force, FALSE)
+
+/obj/structure/femur_breaker/post_buckle_mob(mob/living/M)
+ if (!istype(M, /mob/living/carbon/human))
+ return
+
+ var/mob/living/carbon/human/H = M
+
+ if (H.dna)
+ if (H.dna.species)
+ var/datum/species/S = H.dna.species
+
+ if (!istype(S))
+ unbuckle_all_mobs()
+ else
+ unbuckle_all_mobs()
+ else
+ unbuckle_all_mobs()
+
+ ..()
+
+/obj/structure/femur_breaker/can_be_unfasten_wrench(mob/user, silent)
+ if (LAZYLEN(buckled_mobs))
+ if (!silent)
+ to_chat(user, "Can't unfasten, someone's strapped in!")
+ return FAILED_UNFASTEN
+
+ if (current_action)
+ return FAILED_UNFASTEN
+
+ return ..()
+
+/obj/structure/femur_breaker/wrench_act(mob/living/user, obj/item/I)
+ if (current_action)
+ return
+
+ current_action = BREAKER_ACTION_WRENCH
+
+ if (do_after(user, BREAKER_WRENCH_DELAY, target = src))
+ current_action = 0
+ default_unfasten_wrench(user, I, 0)
+ setDir(SOUTH)
+ return TRUE
+ else
+ current_action = 0
+
+#undef BREAKER_ANIMATION_LENGTH
+#undef BREAKER_SLAT_RAISED
+#undef BREAKER_SLAT_MOVING
+#undef BREAKER_SLAT_DROPPED
+#undef BREAKER_ACTIVATE_DELAY
+#undef BREAKER_WRENCH_DELAY
+#undef BREAKER_ACTION_INUSE
+#undef BREAKER_ACTION_WRENCH
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
new file mode 100644
index 0000000000..c4e1968e59
--- /dev/null
+++ b/code/game/objects/structures/loom.dm
@@ -0,0 +1,21 @@
+//Loom, turns raw cotton and durathread into their respective fabrics.
+
+/obj/structure/loom
+ name = "loom"
+ desc = "A simple device used to weave cloth and other thread-based fabrics together into usable material."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "loom"
+ density = TRUE
+ anchored = TRUE
+
+/obj/structure/loom/attackby(obj/item/stack/sheet/W, mob/user)
+ if(W.is_fabric && W.amount > 1)
+ user.show_message("You start weaving the [W.name] through the loom..", 1)
+ if(W.use_tool(src, user, W.pull_effort))
+ new W.loom_result(drop_location())
+ user.show_message("You weave the [W.name] into a workable fabric.", 1)
+ W.amount = (W.amount - 2)
+ if(W.amount < 1)
+ qdel(W)
+ else
+ user.show_message("You need a valid fabric and at least 2 of said fabric before using this.", 1)
\ No newline at end of file
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index e979d4f18e..226d279288 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -100,6 +100,14 @@
to_chat(user, "You start adding [B] to [src]...")
if(do_after(user, 20, target = src) && B.use(1))
make_new_table(/obj/structure/table/bronze)
+ else if(istype(I, /obj/item/stack/sheet/plasmaglass))
+ var/obj/item/stack/sheet/plasmaglass/G = I
+ if(G.get_amount() < 1)
+ to_chat(user, "You need one plasmaglass sheet to do this!")
+ return
+ to_chat(user, "You start adding [G] to [src]...")
+ if(do_after(user, 20, target = src) && G.use(1))
+ make_new_table(/obj/structure/table/plasmaglass)
else
return ..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 8c29c1b2c5..fcffafb262 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -258,6 +258,53 @@
for(var/obj/item/shard/S in debris)
S.color = NARSIE_WINDOW_COLOUR
+/*
+ * Plasmaglass tables
+ */
+/obj/structure/table/plasmaglass
+ name = "plasmaglass table"
+ desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?"
+ icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi'
+ icon_state = "plasmaglass_table"
+ climbable = TRUE
+ buildstack = /obj/item/stack/sheet/plasmaglass
+ canSmoothWith = null
+ max_integrity = 270
+ resistance_flags = ACID_PROOF
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ var/list/debris = list()
+
+/obj/structure/table/plasmaglass/New()
+ . = ..()
+ debris += new frame
+ debris += new /obj/item/shard/plasma
+
+/obj/structure/table/plasmaglass/Destroy()
+ QDEL_LIST(debris)
+ . = ..()
+
+/obj/structure/table/plasmaglass/proc/check_break(mob/living/M)
+ return
+
+/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ ..()
+ return
+ else
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/X in debris)
+ var/atom/movable/AM = X
+ AM.forceMove(T)
+ debris -= AM
+ qdel(src)
+
+/obj/structure/table/plasmaglass/narsie_act()
+ color = NARSIE_WINDOW_COLOUR
+ for(var/obj/item/shard/S in debris)
+ S.color = NARSIE_WINDOW_COLOUR
+
/*
* Wooden tables
*/
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index d70838a30b..46db567b10 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -537,7 +537,7 @@
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
- new /obj/item/reagent_containers/glass/rag(src.loc)
+ new /obj/item/reagent_containers/rag(src.loc)
to_chat(user, "You tear off a strip of gauze and make a rag.")
G.use(1)
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index a26d57e3e1..9fc055c2ba 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -281,6 +281,8 @@
. += new /obj/effect/decal/cleanable/glass(location)
if (reinf)
. += new /obj/item/stack/rods(location, (fulltile ? 2 : 1))
+ if (fulltile)
+ . += new /obj/item/shard(location)
/obj/structure/window/proc/can_be_rotated(mob/user,rotation_type)
if(anchored)
@@ -409,6 +411,15 @@
glass_type = /obj/item/stack/sheet/plasmaglass
rad_insulation = RAD_NO_INSULATION
+/obj/structure/window/plasma/spawnDebris(location)
+ . = list()
+ . += new /obj/item/shard/plasma(location)
+ . += new /obj/effect/decal/cleanable/glass/plasma(location)
+ if (reinf)
+ . += new /obj/item/stack/rods(location, (fulltile ? 2 : 1))
+ if (fulltile)
+ . += new /obj/item/shard/plasma(location)
+
/obj/structure/window/plasma/spawner/east
dir = EAST
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index cff219c63e..f6d234b346 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -272,7 +272,7 @@
return 0
if(ishuman(C) && (lube&NO_SLIP_WHEN_WALKING))
var/mob/living/carbon/human/H = C
- if(!H.sprinting && H.getStaminaLoss() >= 20)
+ if(!H.sprinting && H.getStaminaLoss() <= 20)
return 0
if(!(lube&SLIDE_ICE))
to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!")
diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm
index dfc6972578..8b63d60939 100644
--- a/code/game/turfs/simulated/wall/misc_walls.dm
+++ b/code/game/turfs/simulated/wall/misc_walls.dm
@@ -7,6 +7,7 @@
smooth = SMOOTH_MORE
sheet_type = /obj/item/stack/sheet/runed_metal
sheet_amount = 1
+ explosion_block = 10
girder_type = /obj/structure/girder/cult
/turf/closed/wall/mineral/cult/Initialize()
@@ -49,7 +50,7 @@
/turf/closed/wall/clockwork
name = "clockwork wall"
desc = "A huge chunk of warm metal. The clanging of machinery emanates from within."
- explosion_block = 2
+ explosion_block = 5
hardness = 10
slicing_duration = 80
sheet_type = /obj/item/stack/tile/brass
diff --git a/code/game/world.dm b/code/game/world.dm
index dedf822597..e9c8433006 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -137,7 +137,7 @@ GLOBAL_VAR(restart_counter)
// but those are both private, so let's put the commit info in the runtime
// log which is ultimately public.
log_runtime(GLOB.revdata.get_log_message())
-
+
/world/Topic(T, addr, master, key)
TGS_TOPIC //redirect to server tools if necessary
@@ -270,7 +270,8 @@ GLOBAL_VAR(restart_counter)
if (M.client)
n++
- features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
+ if(SSmapping.config) // this just stops the runtime, honk.
+ features += "[SSmapping.config.map_name]" //CIT CHANGE - makes the hub entry display the current map
if(get_security_level())//CIT CHANGE - makes the hub entry show the security level
features += "[get_security_level()] alert"
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index bfbf6b5b79..89e9c33ecc 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -54,12 +54,16 @@
only_current_user_can_interact = TRUE
/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user)
- return
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/obj/machinery/vr_sleeper/emag_act(mob/user)
+ . = ..()
+ if(you_die_in_the_game_you_die_for_real)
+ return
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
addtimer(CALLBACK(src, .proc/emagNotify), 150)
+ return TRUE
/obj/machinery/vr_sleeper/update_icon()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index fad7410a6a..f66cda42dc 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -15,9 +15,9 @@
H.real_name = random_unique_name(H.gender)
H.name = H.real_name
H.underwear = random_underwear(H.gender)
- H.undie_color = random_color()
+ H.undie_color = random_short_color()
H.undershirt = random_undershirt(H.gender)
- H.shirt_color = random_color()
+ H.shirt_color = random_short_color()
H.skin_tone = random_skin_tone()
H.hair_style = random_hair_style(H.gender)
H.facial_hair_style = random_facial_hair_style(H.gender)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 6fa118ab7f..d881044757 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1882,14 +1882,14 @@
return
var/mob/M = locate(href_list["CentComReply"])
- usr.client.admin_headset_message(M, "CentCom")
+ usr.client.admin_headset_message(M, RADIO_CHANNEL_CENTCOM)
else if(href_list["SyndicateReply"])
if(!check_rights(R_ADMIN))
return
var/mob/M = locate(href_list["SyndicateReply"])
- usr.client.admin_headset_message(M, "Syndicate")
+ usr.client.admin_headset_message(M, RADIO_CHANNEL_SYNDICATE)
else if(href_list["HeadsetMessage"])
if(!check_rights(R_ADMIN))
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 84e5ba4f82..5f3153d90f 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -6,7 +6,7 @@
set category = null
set name = "Admin PM Mob"
if(!holder)
- to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.")
+ to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.")
return
if( !ismob(M) || !M.client )
return
@@ -18,7 +18,7 @@
set category = "Admin"
set name = "Admin PM"
if(!holder)
- to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
+ to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
return
var/list/client/targets[0]
for(var/client/T)
@@ -37,7 +37,7 @@
/client/proc/cmd_ahelp_reply(whom)
if(prefs.muted & MUTE_ADMINHELP)
- to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
+ to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
return
var/client/C
if(istext(whom))
@@ -48,7 +48,7 @@
C = whom
if(!C)
if(holder)
- to_chat(src, "Error: Admin-PM: Client not found.")
+ to_chat(src, "Error: Admin-PM: Client not found.")
return
var/datum/admin_help/AH = C.current_ticket
@@ -65,12 +65,12 @@
//Fetching a message if needed. src is the sender and C is the target client
/client/proc/cmd_admin_pm(whom, msg)
if(prefs.muted & MUTE_ADMINHELP)
- to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
+ to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
return
if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo
- to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.")
- to_chat(src, "Message: [msg]")
+ to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.")
+ to_chat(src, "Message: [msg]")
return
var/client/recipient
@@ -95,14 +95,14 @@
if(!msg)
return
if(holder)
- to_chat(src, "Error: Use the admin IRC channel, nerd.")
+ to_chat(src, "Error: Use the admin IRC channel, nerd.")
return
else
if(!recipient)
if(holder)
- to_chat(src, "Error: Admin-PM: Client not found.")
+ to_chat(src, "Error: Admin-PM: Client not found.")
if(msg)
to_chat(src, msg)
return
@@ -118,12 +118,12 @@
return
if(prefs.muted & MUTE_ADMINHELP)
- to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
+ to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
return
if(!recipient)
if(holder)
- to_chat(src, "Error: Admin-PM: Client not found.")
+ to_chat(src, "Error: Admin-PM: Client not found.")
else
current_ticket.MessageNoRecipient(msg)
return
@@ -145,15 +145,15 @@
var/keywordparsedmsg = keywords_lookup(msg)
if(irc)
- to_chat(src, "PM to-Admins: [rawmsg]")
+ to_chat(src, "PM to-Admins: [rawmsg]")
var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]")
ircreplyamount--
send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg)
else
if(recipient.holder)
if(holder) //both are admins
- to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]")
- to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]")
+ to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]")
+ to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]")
//omg this is dumb, just fill in both their tickets
var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]"
@@ -162,10 +162,10 @@
admin_ticket_log(recipient, interaction_message)
else //recipient is an admin but sender is not
- var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]"
- admin_ticket_log(src, replymsg)
- to_chat(recipient, replymsg)
- to_chat(src, "PM to-Admins: [msg]")
+ var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]"
+ admin_ticket_log(src, "[replymsg]")
+ to_chat(recipient, "[replymsg]")
+ to_chat(src, "PM to-Admins: [msg]")
//play the receiving admin the adminhelp sound (if they have them enabled)
if(recipient.prefs.toggles & SOUND_ADMINHELP)
@@ -177,11 +177,11 @@
new /datum/admin_help(msg, recipient, TRUE)
to_chat(recipient, "-- Administrator private message --")
- to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]")
- to_chat(recipient, "Click on the administrator's name to reply.")
- to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]")
+ to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]")
+ to_chat(recipient, "Click on the administrator's name to reply.")
+ to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]")
- admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]")
+ admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]")
//always play non-admin recipients the adminhelp sound
SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg'))
@@ -200,20 +200,20 @@
return
else //neither are admins
- to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.")
+ to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.")
return
if(irc)
log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]")
for(var/client/X in GLOB.admins)
- to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]")
+ to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]")
else
window_flash(recipient, ignorepref = TRUE)
log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in GLOB.admins)
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
- to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" )
+ to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" )
@@ -296,10 +296,10 @@
msg = emoji_parse(msg)
to_chat(C, "-- Administrator private message --")
- to_chat(C, "Admin PM from-[adminname]: [msg]")
- to_chat(C, "Click on the administrator's name to reply.")
+ to_chat(C, "Admin PM from-[adminname]: [msg]")
+ to_chat(C, "Click on the administrator's name to reply.")
- admin_ticket_log(C, "PM From [irc_tagged]: [msg]")
+ admin_ticket_log(C, "PM From [irc_tagged]: [msg]")
window_flash(C, ignorepref = TRUE)
//always play non-admin recipients the adminhelp sound
diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm
index 6295d4be43..c0445d588d 100644
--- a/code/modules/admin/verbs/borgpanel.dm
+++ b/code/modules/admin/verbs/borgpanel.dm
@@ -62,7 +62,7 @@
.["laws"] = borg.laws ? borg.laws.get_law_list(include_zeroth = TRUE) : list()
.["channels"] = list()
for (var/k in GLOB.radiochannels)
- if (k == "Common")
+ if (k == RADIO_CHANNEL_COMMON)
continue
.["channels"] += list(list("name" = k, "installed" = (k in borg.radio.channels)))
.["cell"] = borg.cell ? list("missing" = FALSE, "maxcharge" = borg.cell.maxcharge, "charge" = borg.cell.charge) : list("missing" = TRUE, "maxcharge" = 1, "charge" = 0)
@@ -164,15 +164,15 @@
if (channel in borg.radio.channels) // We're removing a channel
if (!borg.radio.keyslot) // There's no encryption key. This shouldn't happen but we can cope
borg.radio.channels -= channel
- if (channel == "Syndicate")
+ if (channel == RADIO_CHANNEL_SYNDICATE)
borg.radio.syndie = FALSE
- else if (channel == "CentCom")
+ else if (channel == RADIO_CHANNEL_CENTCOM)
borg.radio.independent = FALSE
else
borg.radio.keyslot.channels -= channel
- if (channel == "Syndicate")
+ if (channel == RADIO_CHANNEL_SYNDICATE)
borg.radio.keyslot.syndie = FALSE
- else if (channel == "CentCom")
+ else if (channel == RADIO_CHANNEL_CENTCOM)
borg.radio.keyslot.independent = FALSE
message_admins("[key_name_admin(user)] removed the [channel] radio channel from [ADMIN_LOOKUPFLW(borg)].")
log_admin("[key_name(user)] removed the [channel] radio channel from [key_name(borg)].")
@@ -180,9 +180,9 @@
if (!borg.radio.keyslot) // Assert that an encryption key exists
borg.radio.keyslot = new (borg.radio)
borg.radio.keyslot.channels[channel] = 1
- if (channel == "Syndicate")
+ if (channel == RADIO_CHANNEL_SYNDICATE)
borg.radio.keyslot.syndie = TRUE
- else if (channel == "CentCom")
+ else if (channel == RADIO_CHANNEL_CENTCOM)
borg.radio.keyslot.independent = TRUE
message_admins("[key_name_admin(user)] added the [channel] radio channel to [ADMIN_LOOKUPFLW(borg)].")
log_admin("[key_name(user)] added the [channel] radio channel to [key_name(borg)].")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index f74b31760d..a725399b0f 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -65,7 +65,7 @@
return
if (!sender)
- sender = input("Who is the message from?", "Sender") as null|anything in list("CentCom","Syndicate")
+ sender = input("Who is the message from?", "Sender") as null|anything in list(RADIO_CHANNEL_CENTCOM,RADIO_CHANNEL_SYNDICATE)
if(!sender)
return
@@ -298,7 +298,7 @@
if(candidates.len)
ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
else
- to_chat(usr, "Error: create_xeno(): no suitable candidates.")
+ to_chat(usr, "Error: create_xeno(): no suitable candidates.")
if(!istext(ckey))
return 0
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index a1b9b53fe9..252e2b5cbe 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -353,7 +353,7 @@
/datum/antagonist/changeling/greet()
if (you_are_greet)
to_chat(owner.current, "You are [changelingID], a changeling! You have absorbed and taken the form of a human.")
- to_chat(owner.current, "Use say \":g message\" to communicate with your fellow changelings.")
+ to_chat(owner.current, "Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with your fellow changelings.")
to_chat(owner.current, "You must complete the following tasks:")
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ling_aler.ogg', 100, FALSE, pressure_affected = FALSE)
diff --git a/code/modules/antagonists/changeling/powers/hivemind.dm b/code/modules/antagonists/changeling/powers/hivemind.dm
index 1d7382d947..f7718d7708 100644
--- a/code/modules/antagonists/changeling/powers/hivemind.dm
+++ b/code/modules/antagonists/changeling/powers/hivemind.dm
@@ -1,8 +1,8 @@
-//HIVEMIND COMMUNICATION (:g)
+//HIVEMIND COMMUNICATION //MODE_TOKEN_CHANGELING / :g
/obj/effect/proc_holder/changeling/hivemind_comms
name = "Hivemind Communication"
desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings."
- helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives."
+ helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." //MODE_TOKEN_CHANGELING needs to be manually updated here.
dna_cost = 1
chemical_cost = -1
action_icon = 'icons/mob/actions/actions_xeno.dmi'
@@ -20,7 +20,7 @@
..()
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
changeling.changeling_speak = 1
- to_chat(user, "Use say \":g message\" to communicate with the other changelings.")
+ to_chat(user, "Use say \"[MODE_TOKEN_CHANGELING] message\" to communicate with the other changelings.")
var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new
if(!changeling.has_sting(S1))
changeling.purchasedpowers+=S1
diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm
index 70df78e3b4..971c811074 100644
--- a/code/modules/antagonists/changeling/powers/linglink.dm
+++ b/code/modules/antagonists/changeling/powers/linglink.dm
@@ -56,8 +56,8 @@
if(M.lingcheck() == LINGHIVE_LING)
to_chat(M, "We can sense a foreign presence in the hivemind...")
target.mind.linglink = 1
- target.say(":g AAAAARRRRGGGGGHHHHH!!")
- to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!")
+ target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!")
+ to_chat(target, "You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!")
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
sleep(1800)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]"))
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 4e0595362c..c428c56d45 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -161,11 +161,13 @@
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
+ armour_penetration = 20
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
var/can_drop = FALSE
var/fake = FALSE
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
. = ..()
@@ -244,6 +246,7 @@
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON
+ slot_flags = NONE
flags_1 = NONE
w_class = WEIGHT_CLASS_HUGE
ammo_type = /obj/item/ammo_casing/magic/tentacle
diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm
index baeed8b0b2..bdbd38b92d 100644
--- a/code/modules/antagonists/changeling/powers/strained_muscles.dm
+++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm
@@ -5,7 +5,7 @@
name = "Strained Muscles"
desc = "We evolve the ability to reduce the acid buildup in our muscles, allowing us to move much faster."
helptext = "The strain will make us tired, and we will rapidly become fatigued. Standard weight restrictions, like hardsuits, still apply. Cannot be used in lesser form."
- chemical_cost = 0
+ chemical_cost = 15
dna_cost = 1
req_human = 1
var/stacks = 0 //Increments every 5 seconds; damage increases over time
@@ -15,13 +15,16 @@
action_background_icon_state = "bg_ling"
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(mob/living/carbon/user)
+ var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
active = !active
if(active)
to_chat(user, "Our muscles tense and strengthen.")
+ changeling.chem_recharge_slowdown += 0.5
else
REMOVE_TRAIT(user, TRAIT_GOTTAGOFAST, "changeling_muscles")
to_chat(user, "Our muscles relax.")
- if(stacks >= 10)
+ changeling.chem_recharge_slowdown -= 0.5
+ if(stacks >= 20)
to_chat(user, "We collapse in exhaustion.")
user.Knockdown(60)
user.emote("gasp")
@@ -42,9 +45,9 @@
stacks++
//user.take_bodypart_damage(stacks * 0.03, 0)
- user.staminaloss += stacks * 1.3 //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
+ user.adjustStaminaLoss(stacks*1.3) //At first the changeling may regenerate stamina fast enough to nullify fatigue, but it will stack
- if(stacks == 11) //Warning message that the stacks are getting too high
+ if(stacks == 10) //Warning message that the stacks are getting too high
to_chat(user, "Our legs are really starting to hurt...")
sleep(40)
diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm
index 5a701d8a96..c58d934d6d 100644
--- a/code/modules/antagonists/changeling/powers/tiny_prick.dm
+++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm
@@ -62,13 +62,13 @@
/obj/effect/proc_holder/changeling/sting/transformation
- name = "Transformation Sting"
- desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
- helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
+ name = "Temporary Transformation Sting"
+ desc = "We silently sting a human, injecting a chemical that forces them to transform into a chosen being for a limited time. Additional stings extend the duration."
+ helptext = "The victim will transform much like a changeling would for a limited time. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
sting_icon = "sting_transform"
- chemical_cost = 50
- dna_cost = 3
- loudness = 2
+ chemical_cost = 10
+ dna_cost = 2
+ loudness = 1
var/datum/changelingprofile/selected_dna = null
action_icon = 'icons/mob/actions/actions_changeling.dmi'
action_icon_state = "ling_sting_transform"
@@ -97,19 +97,19 @@
return 1
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target)
- log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
- var/datum/dna/NewDNA = selected_dna.dna
+
if(ismonkey(target))
to_chat(user, "Our genes cry out as we sting [target.name]!")
var/mob/living/carbon/C = target
. = TRUE
if(istype(C))
- C.real_name = NewDNA.real_name
- NewDNA.transfer_identity(C)
- if(ismonkey(C))
- C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
- C.updateappearance(mutcolor_update=1)
+ if(C.reagents.has_reagent("changeling_sting_real"))
+ C.reagents.add_reagent("changeling_sting_real",120)
+ log_combat(user, target, "stung", "transformation sting", ", extending the duration.")
+ else
+ C.reagents.add_reagent("changeling_sting_real",120,list("desired_dna" = selected_dna.dna))
+ log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
/obj/effect/proc_holder/changeling/sting/false_armblade
@@ -230,24 +230,23 @@
/obj/effect/proc_holder/changeling/sting/LSD
name = "Hallucination Sting"
- desc = "Causes terror in the target."
- helptext = "We evolve the ability to sting a target with a powerful hallucinogenic chemical. The target does not notice they have been stung, and the effect begins after a few seconds."
+ desc = "Causes terror in the target and deals a minor amount of toxin damage."
+ helptext = "We evolve the ability to sting a target with a powerful toxic hallucinogenic chemical. The target does not notice they have been stung, and the effect begins instantaneously. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
sting_icon = "sting_lsd"
chemical_cost = 10
dna_cost = 1
+ loudness = 1
action_icon = 'icons/mob/actions/actions_changeling.dmi'
action_icon_state = "ling_sting_lsd"
action_background_icon_state = "bg_ling"
-/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target)
+/obj/effect/proc_holder/changeling/sting/LSD/sting_action(mob/user, mob/target)
log_combat(user, target, "stung", "LSD sting")
- addtimer(CALLBACK(src, .proc/hallucination_time, target), rand(100,200))
+ if(target.reagents)
+ target.reagents.add_reagent("regenerative_materia", 5)
+ target.reagents.add_reagent("mindbreaker", 5)
return TRUE
-/obj/effect/proc_holder/changeling/sting/LSD/proc/hallucination_time(mob/living/carbon/target)
- if(target)
- target.hallucination = max(90, target.hallucination)
-
/obj/effect/proc_holder/changeling/sting/cryo
name = "Cryogenic Sting"
desc = "We silently sting a human with a cocktail of chemicals that freeze them."
diff --git a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
index ea2ec4d6ef..5cf7ab7923 100644
--- a/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/spatial_gateway.dm
@@ -133,6 +133,9 @@
return FALSE
if(!uses)
return FALSE
+ if(!do_teleport(A, get_turf(linked_gateway), channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
+ visible_message("[A] bounces off [src]!")
+ return FALSE
if(isliving(A))
var/mob/living/user = A
to_chat(user, "You pass through [src] and appear elsewhere!")
@@ -141,7 +144,6 @@
playsound(linked_gateway, 'sound/effects/empulse.ogg', 50, 1)
transform = matrix() * 1.5
linked_gateway.transform = matrix() * 1.5
- A.forceMove(get_turf(linked_gateway))
if(!no_cost)
uses = max(0, uses - 1)
linked_gateway.uses = max(0, linked_gateway.uses - 1)
diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
index 530c4c5662..23caa788d4 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
@@ -67,6 +67,7 @@
name = "replicant manacles"
desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid."
icon_state = "brass_manacles"
+ item_state = "brass_manacles"
item_flags = DROPDEL
/obj/item/restraints/handcuffs/clockwork/dropped(mob/user)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
index 54027266e5..0ac96c47f9 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm
@@ -69,7 +69,7 @@
heat_protection = CHEST|GROIN|LEGS
resistance_flags = FIRE_PROOF | ACID_PROOF
armor = list("melee" = 60, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
- allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/holyoil)
+ allowed = list(/obj/item/clockwork, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor, /obj/item/mmi/posibrain/soul_vessel, /obj/item/reagent_containers/food/drinks/bottle/holyoil)
/obj/item/clothing/suit/armor/clockwork/Initialize()
. = ..()
diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
index 552a747651..6d6b1fa9d0 100644
--- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
+++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm
@@ -27,7 +27,7 @@
to_chat(invoker, "Stargazers can't be built off-station.")
return
return ..()
-
+
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
/datum/clockwork_scripture/create_object/integration_cog
@@ -224,12 +224,14 @@
. = ..()
/datum/clockwork_scripture/abscond/scripture_effects()
- var/take_pulling = invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)
+ var/mob/living/pulled_mob = (invoker.pulling && isliving(invoker.pulling) && get_clockwork_power(ABSCOND_ABDUCTION_COST)) ? invoker.pulling : null
var/turf/T
if(GLOB.ark_of_the_clockwork_justiciar)
T = get_step(GLOB.ark_of_the_clockwork_justiciar, SOUTH)
else
T = get_turf(pick(GLOB.servant_spawns))
+ if(!do_teleport(invoker, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
+ return
invoker.visible_message("[invoker] flickers and phases out of existence!", \
"You feel a dizzying sense of vertigo as you're yanked back to Reebe!")
T.visible_message("[invoker] flickers and phases into existence!")
@@ -237,10 +239,9 @@
playsound(T, 'sound/magic/magic_missile.ogg', 50, TRUE)
do_sparks(5, TRUE, invoker)
do_sparks(5, TRUE, T)
- if(take_pulling)
+ if(pulled_mob && do_teleport(pulled_mob, T, channel = TELEPORT_CHANNEL_CULT, forced = TRUE))
adjust_clockwork_power(-special_power_cost)
- invoker.pulling.forceMove(T)
- invoker.forceMove(T)
+ invoker.start_pulling(pulled_mob) //forcemove resets pulls, so we need to re-pull
if(invoker.client)
animate(invoker.client, color = client_color, time = 25)
diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
index 2b1d9d5f02..56b36d13e6 100644
--- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm
@@ -131,10 +131,8 @@
if(!M || !M.current)
continue
if(isliving(M.current) && M.current.stat != DEAD)
- if(isAI(M.current))
- M.current.forceMove(get_step(get_step(src, NORTH),NORTH)) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
- else
- M.current.forceMove(get_turf(src))
+ var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark.
+ do_teleport(M, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE)
M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash)
M.current.clear_fullscreen("flash", 5)
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 244a6d8f28..1dbae4ca98 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -490,11 +490,12 @@
to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.")
return
uses--
- user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \
- "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.")
+ var/turf/origin = get_turf(user)
var/mob/living/L = target
- L.forceMove(dest)
- dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
+ if(do_teleport(L, dest, channel = TELEPORT_CHANNEL_CULT))
+ origin.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \
+ "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.")
+ dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
..()
//Shackles
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 9a17c3270b..25e3663c0b 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -105,7 +105,6 @@
inhand_x_dimension = 64
inhand_y_dimension = 64
actions_types = list()
- item_flags = SLOWS_WHILE_IN_HAND
var/datum/action/innate/dash/cult/jaunt
var/datum/action/innate/cult/spin2win/linked_action
var/spinning = FALSE
@@ -568,7 +567,7 @@
var/mob/living/carbon/C = user
if(C.pulling)
var/atom/movable/pulled = C.pulling
- pulled.forceMove(T)
+ do_teleport(pulled, T, channel = TELEPORT_CHANNEL_CULT)
. = pulled
/obj/item/cult_shift/attack_self(mob/user)
@@ -593,13 +592,12 @@
new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir)
var/atom/movable/pulled = handle_teleport_grab(destination, C)
- C.forceMove(destination)
- if(pulled)
- C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
-
- new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
- playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
- playsound(destination, "sparks", 50, 1)
+ if(do_teleport(C, destination, channel = TELEPORT_CHANNEL_CULT))
+ if(pulled)
+ C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
+ new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
+ playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(destination, "sparks", 50, 1)
else
to_chat(C, "The veil cannot be torn here!")
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 2f3a039e70..9330e9b153 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -244,13 +244,14 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(M, "Something is shielding [convertee]'s mind!")
log_game("Offer rune failed - convertee had anti-magic")
return 0
- to_chat(convertee, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
- and something evil takes root.")
- to_chat(convertee, "Do you wish to embrace the Geometer of Blood? Click here to become a follower of Nar'sie. Or you could choose to continue resisting and suffer a fate worse than death...")
+ to_chat(convertee, "The world goes red. All at once you are aware of an evil, eldritch truth taking roots into your mind.\n\
+ Click here to become a follower of Nar'sie, or suffer a fate worse than death.")
+ INVOKE_ASYNC(src, .proc/optinalert, convertee)
currentconversionman = convertee
- conversiontimeout = world.time + (10 SECONDS)
- convertee.Stun(100)
+ conversiontimeout = world.time + (14 SECONDS)
+ convertee.Stun(140)
ADD_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
+ flash_color(convertee, list("#960000", "#960000", "#960000", rgb(0,0,0)), 50)
conversionresult = FALSE
while(world.time < conversiontimeout && convertee && !conversionresult)
stoplag(1)
@@ -283,6 +284,17 @@ structure_check() searches for nearby cultist structures required for the invoca
H.cultslurring = 0
return 1
+/obj/effect/rune/convert/proc/optinalert(mob/living/convertee)
+ var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise")
+ if(src && alert == "Join the Blood Cult")
+ signmeup(convertee)
+
+/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
+ if(currentconversionman == convertee)
+ conversionresult = TRUE
+ else
+ to_chat(convertee, "Your fate has already been set in stone.")
+
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
var/mob/living/first_invoker = invokers[1]
if(!first_invoker)
@@ -335,11 +347,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/convert/Topic(href, href_list)
if(href_list["signmeup"])
- if(currentconversionman == usr)
- conversionresult = TRUE
- else
- to_chat(usr, "Your fate has already been set in stone.")
-
+ signmeup(usr)
/obj/effect/rune/empower
cultist_name = "Empower"
@@ -414,6 +422,7 @@ structure_check() searches for nearby cultist structures required for the invoca
return
var/movedsomething = FALSE
var/moveuserlater = FALSE
+ var/movesuccess = FALSE
for(var/atom/movable/A in T)
if(ishuman(A))
new /obj/effect/temp_visual/dir_setting/cult/phase/out(T, A.dir)
@@ -424,20 +433,26 @@ structure_check() searches for nearby cultist structures required for the invoca
continue
if(!A.anchored)
movedsomething = TRUE
- A.forceMove(target)
+ if(do_teleport(A, target, forceMove = TRUE, channel = TELEPORT_CHANNEL_CULT))
+ movesuccess = TRUE
if(movedsomething)
..()
- visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!", null, "You hear a sharp crack.")
- to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")
if(moveuserlater)
- user.forceMove(target)
+ if(do_teleport(user, target, channel = TELEPORT_CHANNEL_CULT))
+ movesuccess = TRUE
+ if(movesuccess)
+ visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!", null, "You hear a sharp crack.")
+ to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")
+ else
+ to_chat(user, "You[moveuserlater ? "r vision blurs briefly, but nothing happens":" try send everything above the rune away, but the teleportation fails"].")
if(is_mining_level(z) && !is_mining_level(target.z)) //No effect if you stay on lavaland
actual_selected_rune.handle_portal("lava")
else
var/area/A = get_area(T)
if(A.map_name == "Space")
actual_selected_rune.handle_portal("space", T)
- target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
+ if(movesuccess)
+ target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
else
fail_invoke()
diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm
index 21d0381982..b4b8ac0956 100644
--- a/code/modules/antagonists/disease/disease_disease.dm
+++ b/code/modules/antagonists/disease/disease_disease.dm
@@ -51,7 +51,7 @@
if(cures.len)
return
var/list/not_used = advance_cures.Copy()
- cures = list(pick_n_take(not_used), pick_n_take(not_used))
+ cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
// Get the cure name from the cure_id
var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]]
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index 53f8aa2da1..bb24af4f7a 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -36,30 +36,42 @@
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
-/datum/antagonist/ert/security/red
+/datum/antagonist/ert/security/amber
outfit = /datum/outfit/ert/security/alert
+/datum/antagonist/ert/security/red
+ outfit = /datum/outfit/ert/security/alert/red
+
/datum/antagonist/ert/engineer
role = "Engineer"
outfit = /datum/outfit/ert/engineer
-/datum/antagonist/ert/engineer/red
+/datum/antagonist/ert/engineer/amber
outfit = /datum/outfit/ert/engineer/alert
+/datum/antagonist/ert/engineer/red
+ outfit = /datum/outfit/ert/engineer/alert/red
+
/datum/antagonist/ert/medic
role = "Medical Officer"
outfit = /datum/outfit/ert/medic
-/datum/antagonist/ert/medic/red
+/datum/antagonist/ert/medic/amber
outfit = /datum/outfit/ert/medic/alert
+/datum/antagonist/ert/medic/red
+ outfit = /datum/outfit/ert/medic/alert/red
+
/datum/antagonist/ert/commander
role = "Commander"
outfit = /datum/outfit/ert/commander
-/datum/antagonist/ert/commander/red
+/datum/antagonist/ert/commander/amber
outfit = /datum/outfit/ert/commander/alert
+/datum/antagonist/ert/commander/red
+ outfit = /datum/outfit/ert/commander/alert/red
+
/datum/antagonist/ert/deathsquad
name = "Deathsquad Trooper"
outfit = /datum/outfit/death_commando
diff --git a/code/modules/antagonists/greybois/greybois.dm b/code/modules/antagonists/greybois/greybois.dm
new file mode 100644
index 0000000000..b5e18045e8
--- /dev/null
+++ b/code/modules/antagonists/greybois/greybois.dm
@@ -0,0 +1,23 @@
+/datum/antagonist/greybois
+ name = "Emergency Assistant"
+ show_name_in_check_antagonists = TRUE
+ show_in_antagpanel = FALSE
+ var/mission = "Assist the station."
+ var/datum/outfit/outfit = /datum/outfit/ert/greybois
+
+/datum/antagonist/greybois/greygod
+ outfit = /datum/outfit/ert/greybois/greygod
+
+/datum/antagonist/greybois/greet()
+ to_chat(owner, "You are an Emergency Assistant.")
+ to_chat(owner, "Central Command is sending you to [station_name()] with the task: [mission]")
+
+/datum/antagonist/greybois/on_gain()
+ equipERT()
+ . = ..()
+
+/datum/antagonist/greybois/proc/equipERT()
+ var/mob/living/carbon/human/H = owner.current
+ if(!istype(H))
+ return
+ H.equipOutfit(outfit)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
index c616459bd1..edae8a4240 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
@@ -5,6 +5,7 @@
#define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
GLOBAL_LIST_EMPTY(jam_on_wardec)
+GLOBAL_VAR_INIT(war_declared, FALSE)
/obj/item/nuclear_challenge
name = "Declaration of War (Challenge Mode)"
@@ -61,8 +62,13 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec)
D.jammed = TRUE
+
+ GLOB.war_declared = TRUE
+ var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
+ var/actual_players = GLOB.joined_player_list.len - nukeops.len
+
+ new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * actual_players, 1))
- new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * GLOB.player_list.len, 1))
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
@@ -72,7 +78,10 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
if(declaring_war)
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
return FALSE
- if(GLOB.player_list.len < CHALLENGE_MIN_PLAYERS)
+
+ var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
+ var/actual_players = GLOB.joined_player_list.len - nukeops.len
+ if(actual_players < CHALLENGE_MIN_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return FALSE
if(!user.onSyndieBase())
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index ade5458765..add3c1d9b0 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -373,6 +373,11 @@
S.switch_mode_to(TRACK_INFILTRATOR)
countdown.start()
set_security_level("delta")
+
+ if(GLOB.war_declared)
+ var/area/A = get_area(src)
+ priority_announce("Alert: Unexpected increase in radiation levels near [A.name] ([src.x],[src.y],[src.z]). Please send an authorized radiation specialist to investigate.", "Sensory Nuclear Indexer Telemetry Calculation Helper")
+
else
detonation_timer = null
set_security_level(previous_level)
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 9fb2c3e2b7..87cee7586d 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -488,7 +488,7 @@
S.set_up(4,0,get_turf(target))
S.start()
playsound(src,'sound/effects/sparks4.ogg',50,1)
- do_teleport(target, F, 0)
+ do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE)
if(!tesla_shock)
diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
index 051bf74705..f2e6566e8f 100644
--- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm
+++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
@@ -244,10 +244,12 @@
to_chat(owner.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.")
to_chat(owner.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.")
to_chat(owner.current, " You have been provided with a standard uplink to accomplish your task. ")
+ to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
else
to_chat(owner.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.")
to_chat(owner.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.")
to_chat(owner.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.")
+ to_chat(owner.current, "By no means reveal that you, or any other NT employees, are undercover agents.")
to_chat(owner.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.")
owner.announce_objectives()
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 7cfefd5413..8642484895 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -385,9 +385,11 @@
/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
if(!istype(user) || on_cooldown)
return
+ var/turf/T = get_turf(user)
+ if(!T)
+ return
on_cooldown = TRUE
last_user = user
- var/turf/T = get_turf(user)
playsound(T,'sound/magic/warpwhistle.ogg', 200, 1)
user.canmove = FALSE
new /obj/effect/temp_visual/tornado(T)
@@ -402,9 +404,15 @@
return
var/breakout = 0
while(breakout < 50)
+ if(!T)
+ end_effect(user)
+ return
var/turf/potential_T = find_safe_turf()
+ if(!potential_T)
+ end_effect(user)
+ return
if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
- user.forceMove(potential_T)
+ do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC)
user.canmove = 0
T = potential_T
break
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 9858db2abb..0d9c0730c1 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -38,8 +38,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
for(var/id in cached_gases)
. += cached_gases[id] * cached_gasheats[id]
-/datum/gas_mixture/turf/heat_capacity()
- . = ..()
+/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
+ var/list/cached_gases = gases
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
if(!.)
. += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
@@ -331,22 +334,19 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
/datum/gas_mixture/react(datum/holder)
. = NO_REACTION
var/list/cached_gases = gases
- if(!cached_gases.len)
+ if(!length(cached_gases))
return
- var/possible
+ var/list/reactions = list()
for(var/I in cached_gases)
- if(GLOB.nonreactive_gases[I])
- continue
- possible = TRUE
- break
- if(!possible)
+ reactions += SSair.gas_reactions[I]
+ if(!length(reactions))
return
reaction_results = new
var/temp = temperature
var/ener = THERMAL_ENERGY(src)
reaction_loop:
- for(var/r in SSair.gas_reactions)
+ for(var/r in reactions)
var/datum/gas_reaction/reaction = r
var/list/min_reqs = reaction.min_requirements
@@ -376,14 +376,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
continue reaction_loop
//at this point, all requirements for the reaction are satisfied. we can now react()
*/
-
. |= reaction.react(src, holder)
if (. & STOP_REACTIONS)
break
if(.)
GAS_GARBAGE_COLLECT(gases)
- if(temperature < TCMB) //just for safety
- temperature = TCMB
//Takes the amount of the gas you want to PP as an argument
//So I don't have to do some hacky switches/defines/magic strings
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index d628826b01..19f7bff965 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -78,22 +78,26 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
var/moles_visible = null
var/dangerous = FALSE //currently used by canisters
var/fusion_power = 0 //How much the gas accelerates a fusion reaction
+ var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list.
/datum/gas/oxygen
id = "o2"
specific_heat = 20
name = "Oxygen"
+ rarity = 900
/datum/gas/nitrogen
id = "n2"
specific_heat = 20
name = "Nitrogen"
+ rarity = 1000
/datum/gas/carbon_dioxide //what the fuck is this?
id = "co2"
specific_heat = 30
name = "Carbon Dioxide"
fusion_power = 3
+ rarity = 700
/datum/gas/plasma
id = "plasma"
@@ -102,6 +106,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
gas_overlay = "plasma"
moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
+ rarity = 800
/datum/gas/water_vapor
id = "water_vapor"
@@ -110,6 +115,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
gas_overlay = "water_vapor"
moles_visible = MOLES_GAS_VISIBLE
fusion_power = 8
+ rarity = 500
/datum/gas/hypernoblium
id = "nob"
@@ -118,6 +124,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
gas_overlay = "freon"
moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
+ rarity = 50
/datum/gas/nitrous_oxide
id = "n2o"
@@ -126,6 +133,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
gas_overlay = "nitrous_oxide"
moles_visible = MOLES_GAS_VISIBLE * 2
dangerous = TRUE
+ rarity = 600
/datum/gas/nitryl
id = "no2"
@@ -135,6 +143,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
fusion_power = 15
+ rarity = 100
/datum/gas/tritium
id = "tritium"
@@ -144,6 +153,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
moles_visible = MOLES_GAS_VISIBLE
dangerous = TRUE
fusion_power = 1
+ rarity = 300
/datum/gas/bz
id = "bz"
@@ -151,18 +161,21 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
name = "BZ"
dangerous = TRUE
fusion_power = 8
+ rarity = 400
/datum/gas/stimulum
id = "stim"
specific_heat = 5
name = "Stimulum"
fusion_power = 7
+ rarity = 1
/datum/gas/pluoxium
id = "pluox"
specific_heat = 80
name = "Pluoxium"
fusion_power = 10
+ rarity = 200
/datum/gas/miasma
id = "miasma"
@@ -171,6 +184,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
name = "Miasma"
gas_overlay = "miasma"
moles_visible = MOLES_GAS_VISIBLE * 60
+ rarity = 250
/obj/effect/overlay/gas
icon = 'icons/effects/atmospherics.dmi'
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index ef0a422079..8e320b2f3e 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -1,19 +1,36 @@
//All defines used in reactions are located in ..\__DEFINES\reactions.dm
/proc/init_gas_reactions()
- var/list/reaction_types = list()
+ . = list()
+ for(var/type in subtypesof(/datum/gas))
+ .[type] = list()
+
for(var/r in subtypesof(/datum/gas_reaction))
var/datum/gas_reaction/reaction = r
- if(!initial(reaction.exclude))
- reaction_types += reaction
- reaction_types = sortList(reaction_types, /proc/cmp_gas_reactions)
+ if(initial(reaction.exclude))
+ continue
+ reaction = new r
+ var/datum/gas/reaction_key
+ for (var/req in reaction.min_requirements)
+ if (ispath(req))
+ var/datum/gas/req_gas = req
+ if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity))
+ reaction_key = req_gas
+ .[reaction_key] += list(reaction)
+ sortTim(., /proc/cmp_gas_reactions, TRUE)
- . = list()
- for(var/path in reaction_types)
- . += new path
-
-/proc/cmp_gas_reactions(datum/gas_reaction/a, datum/gas_reaction/b) //sorts in descending order of priority
- return initial(b.priority) - initial(a.priority)
+/proc/cmp_gas_reactions(list/datum/gas_reaction/a, list/datum/gas_reaction/b) // compares lists of reactions by the maximum priority contained within the list
+ if (!length(a) || !length(b))
+ return length(b) - length(a)
+ var/maxa
+ var/maxb
+ for (var/datum/gas_reaction/R in a)
+ if (R.priority > maxa)
+ maxa = R.priority
+ for (var/datum/gas_reaction/R in b)
+ if (R.priority > maxb)
+ maxb = R.priority
+ return maxb - maxa
/datum/gas_reaction
//regarding the requirements lists: the minimum or maximum requirements must be non-zero.
@@ -347,15 +364,10 @@
var/list/cached_gases = air.gases
var/temperature = air.temperature
var/pressure = air.return_pressure()
-
var/old_heat_capacity = air.heat_capacity()
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
- if(cached_gases[/datum/gas/miasma] && cached_gases[/datum/gas/miasma] > 0)
- energy_released /= cached_gases[/datum/gas/miasma]*0.1
- if(cached_gases[/datum/gas/bz] && cached_gases[/datum/gas/bz] > 0)
- energy_released *= cached_gases[/datum/gas/bz]*0.1
- if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
+ if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
return NO_REACTION
cached_gases[/datum/gas/bz] += reaction_efficency
if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
@@ -364,7 +376,7 @@
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (reaction_efficency**0.5)*BZ_RESEARCH_AMOUNT)
+ SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
if(energy_released > 0)
var/new_heat_capacity = air.heat_capacity()
@@ -460,4 +472,4 @@
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
air.temperature += cleaned_air * 0.002
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
\ No newline at end of file
+ SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 3bf54a1178..6ca25c0d80 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -1,880 +1,882 @@
-/datum/tlv
- var/min2
- var/min1
- var/max1
- var/max2
-
-/datum/tlv/New(min2 as num, min1 as num, max1 as num, max2 as num)
- if(min2) src.min2 = min2
- if(min1) src.min1 = min1
- if(max1) src.max1 = max1
- if(max2) src.max2 = max2
-
-/datum/tlv/proc/get_danger_level(val as num)
- if(max2 != -1 && val >= max2)
- return 2
- if(min2 != -1 && val <= min2)
- return 2
- if(max1 != -1 && val >= max1)
- return 1
- if(min1 != -1 && val <= min1)
- return 1
- return 0
-
-/datum/tlv/no_checks
- min2 = -1
- min1 = -1
- max1 = -1
- max2 = -1
-
-/datum/tlv/dangerous
- min2 = -1
- min1 = -1
- max1 = 0.2
- max2 = 0.5
-
-/obj/item/electronics/airalarm
- name = "air alarm electronics"
- icon_state = "airalarm_electronics"
-
-/obj/item/wallframe/airalarm
- name = "air alarm frame"
- desc = "Used for building Air Alarms."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "alarm_bitem"
- result_path = /obj/machinery/airalarm
-
-#define AALARM_MODE_SCRUBBING 1
-#define AALARM_MODE_VENTING 2 //makes draught
-#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables widenet)
-#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing
-#define AALARM_MODE_OFF 5
-#define AALARM_MODE_FLOOD 6 //Emagged mode; turns off scrubbers and pressure checks on vents
-#define AALARM_MODE_SIPHON 7 //Scrubbers suck air
-#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing.
-#define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output
-
-#define AALARM_REPORT_TIMEOUT 100
-
-#define AALARM_OVERLAY_OFF "alarm_off"
-#define AALARM_OVERLAY_GREEN "alarm_green"
-#define AALARM_OVERLAY_WARN "alarm_amber"
-#define AALARM_OVERLAY_DANGER "alarm_red"
-
-/obj/machinery/airalarm
- name = "air alarm"
- desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "alarm0"
- use_power = IDLE_POWER_USE
- idle_power_usage = 4
- active_power_usage = 8
- power_channel = ENVIRON
- req_access = list(ACCESS_ATMOSPHERICS)
- max_integrity = 250
- integrity_failure = 80
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
- resistance_flags = FIRE_PROOF
-
- var/danger_level = 0
- var/mode = AALARM_MODE_SCRUBBING
-
- var/locked = TRUE
- var/aidisabled = 0
- var/shorted = 0
- var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/brightness_on = 1
-
- var/frequency = FREQ_ATMOS_CONTROL
- var/alarm_frequency = FREQ_ATMOS_ALARMS
- var/datum/radio_frequency/radio_connection
-
- var/list/TLV = list( // Breathable air.
- "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
- "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66),
- /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
- /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
- /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
- /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
- /datum/gas/plasma = new/datum/tlv/dangerous,
- /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
- /datum/gas/bz = new/datum/tlv/dangerous,
- /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
- /datum/gas/water_vapor = new/datum/tlv/dangerous,
- /datum/gas/tritium = new/datum/tlv/dangerous,
- /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
- /datum/gas/nitryl = new/datum/tlv/dangerous,
- /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- )
-
-/obj/machinery/airalarm/server // No checks here.
- TLV = list(
- "pressure" = new/datum/tlv/no_checks,
- "temperature" = new/datum/tlv/no_checks,
- /datum/gas/oxygen = new/datum/tlv/no_checks,
- /datum/gas/nitrogen = new/datum/tlv/no_checks,
- /datum/gas/carbon_dioxide = new/datum/tlv/no_checks,
- /datum/gas/miasma = new/datum/tlv/no_checks,
- /datum/gas/plasma = new/datum/tlv/no_checks,
- /datum/gas/nitrous_oxide = new/datum/tlv/no_checks,
- /datum/gas/bz = new/datum/tlv/no_checks,
- /datum/gas/hypernoblium = new/datum/tlv/no_checks,
- /datum/gas/water_vapor = new/datum/tlv/no_checks,
- /datum/gas/tritium = new/datum/tlv/no_checks,
- /datum/gas/stimulum = new/datum/tlv/no_checks,
- /datum/gas/nitryl = new/datum/tlv/no_checks,
- /datum/gas/pluoxium = new/datum/tlv/no_checks
- )
-
-/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
- TLV = list(
- "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
- "temperature" = new/datum/tlv(T0C-73.15, T0C-63.15, T0C, T0C+10),
- /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
- /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
- /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
- /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
- /datum/gas/plasma = new/datum/tlv/dangerous,
- /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
- /datum/gas/bz = new/datum/tlv/dangerous,
- /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
- /datum/gas/water_vapor = new/datum/tlv/dangerous,
- /datum/gas/tritium = new/datum/tlv/dangerous,
- /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
- /datum/gas/nitryl = new/datum/tlv/dangerous,
- /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
- )
-
-/obj/machinery/airalarm/unlocked
- locked = FALSE
-
-/obj/machinery/airalarm/engine
- name = "engine air alarm"
- locked = FALSE
- req_access = null
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_ENGINE)
-
-/obj/machinery/airalarm/mixingchamber
- name = "chamber air alarm"
- locked = FALSE
- req_access = null
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_TOX, ACCESS_TOX_STORAGE)
-
-/obj/machinery/airalarm/all_access
- name = "all-access air alarm"
- desc = "This particular atmos control unit appears to have no access restrictions."
- locked = FALSE
- req_access = null
- req_one_access = null
-
-/obj/machinery/airalarm/syndicate //general syndicate access
- req_access = list(ACCESS_SYNDICATE)
-
-/obj/machinery/airalarm/directional/north //Pixel offsets get overwritten on New()
- dir = SOUTH
- pixel_y = 24
-
-/obj/machinery/airalarm/directional/south
- dir = NORTH
- pixel_y = -24
-
-/obj/machinery/airalarm/directional/east
- dir = WEST
- pixel_x = 24
-
-/obj/machinery/airalarm/directional/west
- dir = EAST
- pixel_x = -24
-
-//all air alarms in area are connected via magic
-/area
- var/list/air_vent_names = list()
- var/list/air_scrub_names = list()
- var/list/air_vent_info = list()
- var/list/air_scrub_info = list()
-
-/obj/machinery/airalarm/Initialize(mapload, ndir, nbuild)
- . = ..()
- wires = new /datum/wires/airalarm(src)
-
- if(ndir)
- setDir(ndir)
-
- if(nbuild)
- buildstage = 0
- panel_open = TRUE
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
-
- if(name == initial(name))
- name = "[get_area_name(src)] Air Alarm"
-
- power_change()
- set_frequency(frequency)
-
-/obj/machinery/airalarm/Destroy()
- SSradio.remove_object(src, frequency)
- qdel(wires)
- wires = null
- return ..()
-
-/obj/machinery/airalarm/examine(mob/user)
- . = ..()
- switch(buildstage)
- if(0)
- to_chat(user, "It is missing air alarm electronics.")
- if(1)
- to_chat(user, "It is missing wiring.")
- if(2)
- to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface.")
-
-/obj/machinery/airalarm/ui_status(mob/user)
- if(user.has_unlimited_silicon_privilege && aidisabled)
- to_chat(user, "AI control has been disabled.")
- else if(!shorted)
- return ..()
- return UI_CLOSE
-
-/obj/machinery/airalarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "airalarm", name, 440, 650, master_ui, state)
- ui.open()
-
-/obj/machinery/airalarm/ui_data(mob/user)
- var/data = list(
- "locked" = locked,
- "siliconUser" = user.has_unlimited_silicon_privilege,
- "emagged" = (obj_flags & EMAGGED ? 1 : 0),
- "danger_level" = danger_level,
- )
-
- var/area/A = get_area(src)
- data["atmos_alarm"] = A.atmosalm
- data["fire_alarm"] = A.fire
-
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/environment = T.return_air()
- var/datum/tlv/cur_tlv
-
- data["environment_data"] = list()
- var/pressure = environment.return_pressure()
- cur_tlv = TLV["pressure"]
- data["environment_data"] += list(list(
- "name" = "Pressure",
- "value" = pressure,
- "unit" = "kPa",
- "danger_level" = cur_tlv.get_danger_level(pressure)
- ))
- var/temperature = environment.temperature
- cur_tlv = TLV["temperature"]
- data["environment_data"] += list(list(
- "name" = "Temperature",
- "value" = temperature,
- "unit" = "K ([round(temperature - T0C, 0.1)]C)",
- "danger_level" = cur_tlv.get_danger_level(temperature)
- ))
- var/total_moles = environment.total_moles()
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
- for(var/gas_id in environment.gases)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- cur_tlv = TLV[gas_id]
- data["environment_data"] += list(list(
- "name" = GLOB.meta_gas_names[gas_id],
- "value" = environment.gases[gas_id] / total_moles * 100,
- "unit" = "%",
- "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
- ))
-
- if(!locked || user.has_unlimited_silicon_privilege)
- data["vents"] = list()
- for(var/id_tag in A.air_vent_names)
- var/long_name = A.air_vent_names[id_tag]
- var/list/info = A.air_vent_info[id_tag]
- if(!info || info["frequency"] != frequency)
- continue
- data["vents"] += list(list(
- "id_tag" = id_tag,
- "long_name" = sanitize(long_name),
- "power" = info["power"],
- "checks" = info["checks"],
- "excheck" = info["checks"]&1,
- "incheck" = info["checks"]&2,
- "direction" = info["direction"],
- "external" = info["external"],
- "internal" = info["internal"],
- "extdefault"= (info["external"] == ONE_ATMOSPHERE),
- "intdefault"= (info["internal"] == 0)
- ))
- data["scrubbers"] = list()
- for(var/id_tag in A.air_scrub_names)
- var/long_name = A.air_scrub_names[id_tag]
- var/list/info = A.air_scrub_info[id_tag]
- if(!info || info["frequency"] != frequency)
- continue
- data["scrubbers"] += list(list(
- "id_tag" = id_tag,
- "long_name" = sanitize(long_name),
- "power" = info["power"],
- "scrubbing" = info["scrubbing"],
- "widenet" = info["widenet"],
- "filter_types" = info["filter_types"]
- ))
- data["mode"] = mode
- data["modes"] = list()
- data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0))
- data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0))
- data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0))
- data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 1))
- data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1))
- data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1))
- data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1))
- data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0))
- if(obj_flags & EMAGGED)
- data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1))
-
- var/datum/tlv/selected
- var/list/thresholds = list()
-
- selected = TLV["pressure"]
- thresholds += list(list("name" = "Pressure", "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2))
-
- selected = TLV["temperature"]
- thresholds += list(list("name" = "Temperature", "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2))
-
- for(var/gas_id in GLOB.meta_gas_names)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- selected = TLV[gas_id]
- thresholds += list(list("name" = GLOB.meta_gas_names[gas_id], "settings" = list()))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1))
- thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2))
-
- data["thresholds"] = thresholds
- return data
-
-/obj/machinery/airalarm/ui_act(action, params)
- if(..() || buildstage != 2)
- return
- if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled))
- return
- var/device_id = params["id_tag"]
- switch(action)
- if("lock")
- if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN))
- locked = !locked
- . = TRUE
- if("power", "toggle_filter", "widenet", "scrubbing")
- send_signal(device_id, list("[action]" = params["val"]), usr)
- . = TRUE
- if("excheck")
- send_signal(device_id, list("checks" = text2num(params["val"])^1), usr)
- . = TRUE
- if("incheck")
- send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
- . = TRUE
- if("set_external_pressure", "set_internal_pressure")
- var/area/A = get_area(src)
- var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
- if(!isnull(target) && !..())
- send_signal(device_id, list("[action]" = target), usr)
- . = TRUE
- if("reset_external_pressure")
- send_signal(device_id, list("reset_external_pressure"), usr)
- . = TRUE
- if("reset_internal_pressure")
- send_signal(device_id, list("reset_internal_pressure"), usr)
- . = TRUE
- if("threshold")
- var/env = params["env"]
- if(text2path(env))
- env = text2path(env)
-
- var/name = params["var"]
- var/datum/tlv/tlv = TLV[env]
- if(isnull(tlv))
- return
- var/value = input("New [name] for [env]:", name, tlv.vars[name]) as num|null
- if(!isnull(value) && !..())
- if(value < 0)
- tlv.vars[name] = -1
- else
- tlv.vars[name] = round(value, 0.01)
- investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS)
- . = TRUE
- if("mode")
- mode = text2num(params["mode"])
- investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(usr)]",INVESTIGATE_ATMOS)
- apply_mode()
- . = TRUE
- if("alarm")
- var/area/A = get_area(src)
- if(A.atmosalert(2, src))
- post_alert(2)
- . = TRUE
- if("reset")
- var/area/A = get_area(src)
- if(A.atmosalert(0, src))
- post_alert(0)
- . = TRUE
- update_icon()
-
-/obj/machinery/airalarm/proc/reset(wire)
- switch(wire)
- if(WIRE_POWER)
- if(!wires.is_cut(WIRE_POWER))
- shorted = FALSE
- update_icon()
- if(WIRE_AI)
- if(!wires.is_cut(WIRE_AI))
- aidisabled = FALSE
-
-
-/obj/machinery/airalarm/proc/shock(mob/user, prb)
- if((stat & (NOPOWER))) // unpowered, no shock
- return 0
- if(!prob(prb))
- return 0 //you lucked out, no shock for you
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start() //sparks always.
- if (electrocute_mob(user, get_area(src), src, 1, TRUE))
- return 1
- else
- return 0
-
-/obj/machinery/airalarm/proc/refresh_all()
- var/area/A = get_area(src)
- for(var/id_tag in A.air_vent_names)
- var/list/I = A.air_vent_info[id_tag]
- if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
- continue
- send_signal(id_tag, list("status"))
- for(var/id_tag in A.air_scrub_names)
- var/list/I = A.air_scrub_info[id_tag]
- if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
- continue
- send_signal(id_tag, list("status"))
-
-/obj/machinery/airalarm/proc/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
-
-/obj/machinery/airalarm/proc/send_signal(target, list/command, mob/user)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new(command)
- signal.data["tag"] = target
- signal.data["sigtype"] = "command"
- signal.data["user"] = user
- radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
-
- return 1
-
-/obj/machinery/airalarm/proc/get_mode_name(mode_value)
- switch(mode_value)
- if(AALARM_MODE_SCRUBBING)
- return "Filtering"
- if(AALARM_MODE_CONTAMINATED)
- return "Contaminated"
- if(AALARM_MODE_VENTING)
- return "Draught"
- if(AALARM_MODE_REFILL)
- return "Refill"
- if(AALARM_MODE_PANIC)
- return "Panic Siphon"
- if(AALARM_MODE_REPLACEMENT)
- return "Cycle"
- if(AALARM_MODE_SIPHON)
- return "Siphon"
- if(AALARM_MODE_OFF)
- return "Off"
- if(AALARM_MODE_FLOOD)
- return "Flood"
-
-/obj/machinery/airalarm/proc/apply_mode()
- var/area/A = get_area(src)
- switch(mode)
- if(AALARM_MODE_SCRUBBING)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
- "scrubbing" = 1,
- "widenet" = 0,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE
- ))
- if(AALARM_MODE_CONTAMINATED)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(
- /datum/gas/carbon_dioxide,
- /datum/gas/miasma,
- /datum/gas/plasma,
- /datum/gas/water_vapor,
- /datum/gas/hypernoblium,
- /datum/gas/nitrous_oxide,
- /datum/gas/nitryl,
- /datum/gas/tritium,
- /datum/gas/bz,
- /datum/gas/stimulum,
- /datum/gas/pluoxium
- ),
- "scrubbing" = 1,
- "widenet" = 1,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE
- ))
- if(AALARM_MODE_VENTING)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 0,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE*2
- ))
- if(AALARM_MODE_REFILL)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
- "scrubbing" = 1,
- "widenet" = 0,
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 1,
- "set_external_pressure" = ONE_ATMOSPHERE * 3
- ))
- if(AALARM_MODE_PANIC,
- AALARM_MODE_REPLACEMENT)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 1,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- if(AALARM_MODE_SIPHON)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 1,
- "widenet" = 0,
- "scrubbing" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
-
- if(AALARM_MODE_OFF)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- if(AALARM_MODE_FLOOD)
- for(var/device_id in A.air_scrub_names)
- send_signal(device_id, list(
- "power" = 0
- ))
- for(var/device_id in A.air_vent_names)
- send_signal(device_id, list(
- "power" = 1,
- "checks" = 2,
- "set_internal_pressure" = 0
- ))
-
-/obj/machinery/airalarm/update_icon()
- set_light(0)
- cut_overlays()
- SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
- if(stat & NOPOWER)
- icon_state = "alarm0"
- return
-
- if(stat & BROKEN)
- icon_state = "alarmx"
- return
-
- if(panel_open)
- switch(buildstage)
- if(2)
- icon_state = "alarmx"
- if(1)
- icon_state = "alarm_b2"
- if(0)
- icon_state = "alarm_b1"
- return
-
- icon_state = "alarm1"
- var/overlay_state = AALARM_OVERLAY_OFF
- var/area/A = get_area(src)
- switch(max(danger_level, A.atmosalm))
- if(0)
- add_overlay(AALARM_OVERLAY_GREEN)
- overlay_state = AALARM_OVERLAY_GREEN
- light_color = LIGHT_COLOR_GREEN
- set_light(brightness_on)
- if(1)
- add_overlay(AALARM_OVERLAY_WARN)
- overlay_state = AALARM_OVERLAY_WARN
- light_color = LIGHT_COLOR_LAVA
- set_light(brightness_on)
- if(2)
- add_overlay(AALARM_OVERLAY_DANGER)
- overlay_state = AALARM_OVERLAY_DANGER
- light_color = LIGHT_COLOR_RED
- set_light(brightness_on)
-
- SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
- update_light()
-
-/obj/machinery/airalarm/process()
- if((stat & (NOPOWER|BROKEN)) || shorted)
- return
-
- var/turf/location = get_turf(src)
- if(!location)
- return
-
- var/datum/tlv/cur_tlv
-
- var/datum/gas_mixture/environment = location.return_air()
- var/list/env_gases = environment.gases
- var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
-
- cur_tlv = TLV["pressure"]
- var/environment_pressure = environment.return_pressure()
- var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
-
- cur_tlv = TLV["temperature"]
- var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
-
- var/gas_dangerlevel = 0
- for(var/gas_id in env_gases)
- if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
- continue
- cur_tlv = TLV[gas_id]
- gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
-
- GAS_GARBAGE_COLLECT(environment.gases)
-
- var/old_danger_level = danger_level
- danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
-
- if(old_danger_level != danger_level)
- apply_danger_level()
- if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
- mode = AALARM_MODE_SCRUBBING
- apply_mode()
-
- return
-
-
-/obj/machinery/airalarm/proc/post_alert(alert_level)
- var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
-
- if(!frequency)
- return
-
- var/datum/signal/alert_signal = new(list(
- "zone" = get_area_name(src),
- "type" = "Atmospheric"
- ))
- if(alert_level==2)
- alert_signal.data["alert"] = "severe"
- else if (alert_level==1)
- alert_signal.data["alert"] = "minor"
- else if (alert_level==0)
- alert_signal.data["alert"] = "clear"
-
- frequency.post_signal(src, alert_signal, range = -1)
-
-/obj/machinery/airalarm/proc/apply_danger_level()
- var/area/A = get_area(src)
-
- var/new_area_danger_level = 0
- for(var/obj/machinery/airalarm/AA in A)
- if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
- new_area_danger_level = max(new_area_danger_level,AA.danger_level)
- if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state
- post_alert(new_area_danger_level)
-
- update_icon()
-
-/obj/machinery/airalarm/attackby(obj/item/W, mob/user, params)
- switch(buildstage)
- if(2)
- if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut())
- W.play_tool_sound(src)
- to_chat(user, "You cut the final wires.")
- new /obj/item/stack/cable_coil(loc, 5)
- buildstage = 1
- update_icon()
- return
- else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up.
- W.play_tool_sound(src)
- panel_open = !panel_open
- to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].")
- update_icon()
- return
- else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card
- togglelock(user)
- else if(panel_open && is_wire_tool(W))
- wires.interact(user)
- return
- if(1)
- if(istype(W, /obj/item/crowbar))
- user.visible_message("[user.name] removes the electronics from [src.name].",\
- "You start prying out the circuit...")
- W.play_tool_sound(src)
- if (W.use_tool(src, user, 20))
- if (buildstage == 1)
- to_chat(user, "You remove the air alarm electronics.")
- new /obj/item/electronics/airalarm( src.loc )
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- buildstage = 0
- update_icon()
- return
-
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/cable = W
- if(cable.get_amount() < 5)
- to_chat(user, "You need five lengths of cable to wire the air alarm!")
- return
- user.visible_message("[user.name] wires the air alarm.", \
- "You start wiring the air alarm...")
- if (do_after(user, 20, target = src))
- if (cable.get_amount() >= 5 && buildstage == 1)
- cable.use(5)
- to_chat(user, "You wire the air alarm.")
- wires.repair()
- aidisabled = 0
- locked = FALSE
- mode = 1
- shorted = 0
- post_alert(0)
- buildstage = 2
- update_icon()
- return
- if(0)
- if(istype(W, /obj/item/electronics/airalarm))
- if(user.temporarilyRemoveItemFromInventory(W))
- to_chat(user, "You insert the circuit.")
- buildstage = 1
- update_icon()
- qdel(W)
- return
-
- if(istype(W, /obj/item/electroadaptive_pseudocircuit))
- var/obj/item/electroadaptive_pseudocircuit/P = W
- if(!P.adapt_circuit(user, 25))
- return
- user.visible_message("[user] fabricates a circuit and places it into [src].", \
- "You adapt an air alarm circuit and slot it into the assembly.")
- buildstage = 1
- update_icon()
- return
-
- if(istype(W, /obj/item/wrench))
- to_chat(user, "You detach \the [src] from the wall.")
- W.play_tool_sound(src)
- new /obj/item/wallframe/airalarm( user.loc )
- qdel(src)
- return
-
- return ..()
-
-/obj/machinery/airalarm/AltClick(mob/user)
- ..()
- if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
- return
- else
- togglelock(user)
-
-/obj/machinery/airalarm/proc/togglelock(mob/living/user)
- if(stat & (NOPOWER|BROKEN))
- to_chat(user, "It does nothing!")
- else
- if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
- locked = !locked
- updateUsrDialog()
- to_chat(user, "You [ locked ? "lock" : "unlock"] the air alarm interface.")
- else
- to_chat(user, "Access denied.")
- return
-
-/obj/machinery/airalarm/power_change()
- ..()
- if(stat & NOPOWER)
- set_light(0)
- update_icon()
-
-/obj/machinery/airalarm/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- visible_message("Sparks fly out of [src]!", "You emag [src], disabling its safeties.")
- playsound(src, "sparks", 50, 1)
-
-/obj/machinery/airalarm/obj_break(damage_flag)
- ..()
- update_icon()
- set_light(0)
-
-/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
- if(!(flags_1 & NODECONSTRUCT_1))
- new /obj/item/stack/sheet/metal(loc, 2)
- var/obj/item/I = new /obj/item/electronics/airalarm(loc)
- if(!disassembled)
- I.obj_integrity = I.max_integrity * 0.5
- new /obj/item/stack/cable_coil(loc, 3)
- qdel(src)
-
-#undef AALARM_MODE_SCRUBBING
-#undef AALARM_MODE_VENTING
-#undef AALARM_MODE_PANIC
-#undef AALARM_MODE_REPLACEMENT
-#undef AALARM_MODE_OFF
-#undef AALARM_MODE_FLOOD
-#undef AALARM_MODE_SIPHON
-#undef AALARM_MODE_CONTAMINATED
-#undef AALARM_MODE_REFILL
-#undef AALARM_REPORT_TIMEOUT
+/datum/tlv
+ var/min2
+ var/min1
+ var/max1
+ var/max2
+
+/datum/tlv/New(min2 as num, min1 as num, max1 as num, max2 as num)
+ if(min2) src.min2 = min2
+ if(min1) src.min1 = min1
+ if(max1) src.max1 = max1
+ if(max2) src.max2 = max2
+
+/datum/tlv/proc/get_danger_level(val as num)
+ if(max2 != -1 && val >= max2)
+ return 2
+ if(min2 != -1 && val <= min2)
+ return 2
+ if(max1 != -1 && val >= max1)
+ return 1
+ if(min1 != -1 && val <= min1)
+ return 1
+ return 0
+
+/datum/tlv/no_checks
+ min2 = -1
+ min1 = -1
+ max1 = -1
+ max2 = -1
+
+/datum/tlv/dangerous
+ min2 = -1
+ min1 = -1
+ max1 = 0.2
+ max2 = 0.5
+
+/obj/item/electronics/airalarm
+ name = "air alarm electronics"
+ icon_state = "airalarm_electronics"
+
+/obj/item/wallframe/airalarm
+ name = "air alarm frame"
+ desc = "Used for building Air Alarms."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "alarm_bitem"
+ result_path = /obj/machinery/airalarm
+
+#define AALARM_MODE_SCRUBBING 1
+#define AALARM_MODE_VENTING 2 //makes draught
+#define AALARM_MODE_PANIC 3 //like siphon, but stronger (enables widenet)
+#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing
+#define AALARM_MODE_OFF 5
+#define AALARM_MODE_FLOOD 6 //Emagged mode; turns off scrubbers and pressure checks on vents
+#define AALARM_MODE_SIPHON 7 //Scrubbers suck air
+#define AALARM_MODE_CONTAMINATED 8 //Turns on all filtering and widenet scrubbing.
+#define AALARM_MODE_REFILL 9 //just like normal, but with triple the air output
+
+#define AALARM_REPORT_TIMEOUT 100
+
+#define AALARM_OVERLAY_OFF "alarm_off"
+#define AALARM_OVERLAY_GREEN "alarm_green"
+#define AALARM_OVERLAY_WARN "alarm_amber"
+#define AALARM_OVERLAY_DANGER "alarm_red"
+
+/obj/machinery/airalarm
+ name = "air alarm"
+ desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous."
+ icon = 'icons/obj/monitors.dmi'
+ icon_state = "alarm0"
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 4
+ active_power_usage = 8
+ power_channel = ENVIRON
+ req_access = list(ACCESS_ATMOSPHERICS)
+ max_integrity = 250
+ integrity_failure = 80
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+
+ var/danger_level = 0
+ var/mode = AALARM_MODE_SCRUBBING
+
+ var/locked = TRUE
+ var/aidisabled = 0
+ var/shorted = 0
+ var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
+ var/brightness_on = 1
+
+ var/frequency = FREQ_ATMOS_CONTROL
+ var/alarm_frequency = FREQ_ATMOS_ALARMS
+ var/datum/radio_frequency/radio_connection
+
+ var/list/TLV = list( // Breathable air.
+ "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
+ "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66),
+ /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
+ /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
+ /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
+ /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
+ /datum/gas/plasma = new/datum/tlv/dangerous,
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
+ /datum/gas/nitryl = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
+ )
+
+/obj/machinery/airalarm/server // No checks here.
+ TLV = list(
+ "pressure" = new/datum/tlv/no_checks,
+ "temperature" = new/datum/tlv/no_checks,
+ /datum/gas/oxygen = new/datum/tlv/no_checks,
+ /datum/gas/nitrogen = new/datum/tlv/no_checks,
+ /datum/gas/carbon_dioxide = new/datum/tlv/no_checks,
+ /datum/gas/miasma = new/datum/tlv/no_checks,
+ /datum/gas/plasma = new/datum/tlv/no_checks,
+ /datum/gas/nitrous_oxide = new/datum/tlv/no_checks,
+ /datum/gas/bz = new/datum/tlv/no_checks,
+ /datum/gas/hypernoblium = new/datum/tlv/no_checks,
+ /datum/gas/water_vapor = new/datum/tlv/no_checks,
+ /datum/gas/tritium = new/datum/tlv/no_checks,
+ /datum/gas/stimulum = new/datum/tlv/no_checks,
+ /datum/gas/nitryl = new/datum/tlv/no_checks,
+ /datum/gas/pluoxium = new/datum/tlv/no_checks
+ )
+
+/obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures.
+ TLV = list(
+ "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa
+ "temperature" = new/datum/tlv(T0C-73.15, T0C-63.15, T0C, T0C+10),
+ /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa
+ /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000),
+ /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10),
+ /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5),
+ /datum/gas/plasma = new/datum/tlv/dangerous,
+ /datum/gas/nitrous_oxide = new/datum/tlv/dangerous,
+ /datum/gas/bz = new/datum/tlv/dangerous,
+ /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic
+ /datum/gas/water_vapor = new/datum/tlv/dangerous,
+ /datum/gas/tritium = new/datum/tlv/dangerous,
+ /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects
+ /datum/gas/nitryl = new/datum/tlv/dangerous,
+ /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000) // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
+ )
+
+/obj/machinery/airalarm/unlocked
+ locked = FALSE
+
+/obj/machinery/airalarm/engine
+ name = "engine air alarm"
+ locked = FALSE
+ req_access = null
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_ENGINE)
+
+/obj/machinery/airalarm/mixingchamber
+ name = "chamber air alarm"
+ locked = FALSE
+ req_access = null
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_TOX, ACCESS_TOX_STORAGE)
+
+/obj/machinery/airalarm/all_access
+ name = "all-access air alarm"
+ desc = "This particular atmos control unit appears to have no access restrictions."
+ locked = FALSE
+ req_access = null
+ req_one_access = null
+
+/obj/machinery/airalarm/syndicate //general syndicate access
+ req_access = list(ACCESS_SYNDICATE)
+
+/obj/machinery/airalarm/directional/north //Pixel offsets get overwritten on New()
+ dir = SOUTH
+ pixel_y = 24
+
+/obj/machinery/airalarm/directional/south
+ dir = NORTH
+ pixel_y = -24
+
+/obj/machinery/airalarm/directional/east
+ dir = WEST
+ pixel_x = 24
+
+/obj/machinery/airalarm/directional/west
+ dir = EAST
+ pixel_x = -24
+
+//all air alarms in area are connected via magic
+/area
+ var/list/air_vent_names = list()
+ var/list/air_scrub_names = list()
+ var/list/air_vent_info = list()
+ var/list/air_scrub_info = list()
+
+/obj/machinery/airalarm/Initialize(mapload, ndir, nbuild)
+ . = ..()
+ wires = new /datum/wires/airalarm(src)
+
+ if(ndir)
+ setDir(ndir)
+
+ if(nbuild)
+ buildstage = 0
+ panel_open = TRUE
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
+
+ if(name == initial(name))
+ name = "[get_area_name(src)] Air Alarm"
+
+ power_change()
+ set_frequency(frequency)
+
+/obj/machinery/airalarm/Destroy()
+ SSradio.remove_object(src, frequency)
+ qdel(wires)
+ wires = null
+ return ..()
+
+/obj/machinery/airalarm/examine(mob/user)
+ . = ..()
+ switch(buildstage)
+ if(0)
+ to_chat(user, "It is missing air alarm electronics.")
+ if(1)
+ to_chat(user, "It is missing wiring.")
+ if(2)
+ to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] the interface.")
+
+/obj/machinery/airalarm/ui_status(mob/user)
+ if(user.has_unlimited_silicon_privilege && aidisabled)
+ to_chat(user, "AI control has been disabled.")
+ else if(!shorted)
+ return ..()
+ return UI_CLOSE
+
+/obj/machinery/airalarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "airalarm", name, 440, 650, master_ui, state)
+ ui.open()
+
+/obj/machinery/airalarm/ui_data(mob/user)
+ var/data = list(
+ "locked" = locked,
+ "siliconUser" = user.has_unlimited_silicon_privilege,
+ "emagged" = (obj_flags & EMAGGED ? 1 : 0),
+ "danger_level" = danger_level,
+ )
+
+ var/area/A = get_area(src)
+ data["atmos_alarm"] = A.atmosalm
+ data["fire_alarm"] = A.fire
+
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/environment = T.return_air()
+ var/datum/tlv/cur_tlv
+
+ data["environment_data"] = list()
+ var/pressure = environment.return_pressure()
+ cur_tlv = TLV["pressure"]
+ data["environment_data"] += list(list(
+ "name" = "Pressure",
+ "value" = pressure,
+ "unit" = "kPa",
+ "danger_level" = cur_tlv.get_danger_level(pressure)
+ ))
+ var/temperature = environment.temperature
+ cur_tlv = TLV["temperature"]
+ data["environment_data"] += list(list(
+ "name" = "Temperature",
+ "value" = temperature,
+ "unit" = "K ([round(temperature - T0C, 0.1)]C)",
+ "danger_level" = cur_tlv.get_danger_level(temperature)
+ ))
+ var/total_moles = environment.total_moles()
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+ for(var/gas_id in environment.gases)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ cur_tlv = TLV[gas_id]
+ data["environment_data"] += list(list(
+ "name" = GLOB.meta_gas_names[gas_id],
+ "value" = environment.gases[gas_id] / total_moles * 100,
+ "unit" = "%",
+ "danger_level" = cur_tlv.get_danger_level(environment.gases[gas_id] * partial_pressure)
+ ))
+
+ if(!locked || user.has_unlimited_silicon_privilege)
+ data["vents"] = list()
+ for(var/id_tag in A.air_vent_names)
+ var/long_name = A.air_vent_names[id_tag]
+ var/list/info = A.air_vent_info[id_tag]
+ if(!info || info["frequency"] != frequency)
+ continue
+ data["vents"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "checks" = info["checks"],
+ "excheck" = info["checks"]&1,
+ "incheck" = info["checks"]&2,
+ "direction" = info["direction"],
+ "external" = info["external"],
+ "internal" = info["internal"],
+ "extdefault"= (info["external"] == ONE_ATMOSPHERE),
+ "intdefault"= (info["internal"] == 0)
+ ))
+ data["scrubbers"] = list()
+ for(var/id_tag in A.air_scrub_names)
+ var/long_name = A.air_scrub_names[id_tag]
+ var/list/info = A.air_scrub_info[id_tag]
+ if(!info || info["frequency"] != frequency)
+ continue
+ data["scrubbers"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "power" = info["power"],
+ "scrubbing" = info["scrubbing"],
+ "widenet" = info["widenet"],
+ "filter_types" = info["filter_types"]
+ ))
+ data["mode"] = mode
+ data["modes"] = list()
+ data["modes"] += list(list("name" = "Filtering - Scrubs out contaminants", "mode" = AALARM_MODE_SCRUBBING, "selected" = mode == AALARM_MODE_SCRUBBING, "danger" = 0))
+ data["modes"] += list(list("name" = "Contaminated - Scrubs out ALL contaminants quickly","mode" = AALARM_MODE_CONTAMINATED, "selected" = mode == AALARM_MODE_CONTAMINATED, "danger" = 0))
+ data["modes"] += list(list("name" = "Draught - Siphons out air while replacing", "mode" = AALARM_MODE_VENTING, "selected" = mode == AALARM_MODE_VENTING, "danger" = 0))
+ data["modes"] += list(list("name" = "Refill - Triple vent output", "mode" = AALARM_MODE_REFILL, "selected" = mode == AALARM_MODE_REFILL, "danger" = 1))
+ data["modes"] += list(list("name" = "Cycle - Siphons air before replacing", "mode" = AALARM_MODE_REPLACEMENT, "selected" = mode == AALARM_MODE_REPLACEMENT, "danger" = 1))
+ data["modes"] += list(list("name" = "Siphon - Siphons air out of the room", "mode" = AALARM_MODE_SIPHON, "selected" = mode == AALARM_MODE_SIPHON, "danger" = 1))
+ data["modes"] += list(list("name" = "Panic Siphon - Siphons air out of the room quickly","mode" = AALARM_MODE_PANIC, "selected" = mode == AALARM_MODE_PANIC, "danger" = 1))
+ data["modes"] += list(list("name" = "Off - Shuts off vents and scrubbers", "mode" = AALARM_MODE_OFF, "selected" = mode == AALARM_MODE_OFF, "danger" = 0))
+ if(obj_flags & EMAGGED)
+ data["modes"] += list(list("name" = "Flood - Shuts off scrubbers and opens vents", "mode" = AALARM_MODE_FLOOD, "selected" = mode == AALARM_MODE_FLOOD, "danger" = 1))
+
+ var/datum/tlv/selected
+ var/list/thresholds = list()
+
+ selected = TLV["pressure"]
+ thresholds += list(list("name" = "Pressure", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "pressure", "val" = "max2", "selected" = selected.max2))
+
+ selected = TLV["temperature"]
+ thresholds += list(list("name" = "Temperature", "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2))
+
+ for(var/gas_id in GLOB.meta_gas_names)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ selected = TLV[gas_id]
+ thresholds += list(list("name" = GLOB.meta_gas_names[gas_id], "settings" = list()))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1))
+ thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max2", "selected" = selected.max2))
+
+ data["thresholds"] = thresholds
+ return data
+
+/obj/machinery/airalarm/ui_act(action, params)
+ if(..() || buildstage != 2)
+ return
+ if((locked && !usr.has_unlimited_silicon_privilege) || (usr.has_unlimited_silicon_privilege && aidisabled))
+ return
+ var/device_id = params["id_tag"]
+ switch(action)
+ if("lock")
+ if(usr.has_unlimited_silicon_privilege && !wires.is_cut(WIRE_IDSCAN))
+ locked = !locked
+ . = TRUE
+ if("power", "toggle_filter", "widenet", "scrubbing")
+ send_signal(device_id, list("[action]" = params["val"]), usr)
+ . = TRUE
+ if("excheck")
+ send_signal(device_id, list("checks" = text2num(params["val"])^1), usr)
+ . = TRUE
+ if("incheck")
+ send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
+ . = TRUE
+ if("set_external_pressure", "set_internal_pressure")
+ var/area/A = get_area(src)
+ var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
+ if(!isnull(target) && !..())
+ send_signal(device_id, list("[action]" = target), usr)
+ . = TRUE
+ if("reset_external_pressure")
+ send_signal(device_id, list("reset_external_pressure"), usr)
+ . = TRUE
+ if("reset_internal_pressure")
+ send_signal(device_id, list("reset_internal_pressure"), usr)
+ . = TRUE
+ if("threshold")
+ var/env = params["env"]
+ if(text2path(env))
+ env = text2path(env)
+
+ var/name = params["var"]
+ var/datum/tlv/tlv = TLV[env]
+ if(isnull(tlv))
+ return
+ var/value = input("New [name] for [env]:", name, tlv.vars[name]) as num|null
+ if(!isnull(value) && !..())
+ if(value < 0)
+ tlv.vars[name] = -1
+ else
+ tlv.vars[name] = round(value, 0.01)
+ investigate_log(" treshold value for [env]:[name] was set to [value] by [key_name(usr)]",INVESTIGATE_ATMOS)
+ . = TRUE
+ if("mode")
+ mode = text2num(params["mode"])
+ investigate_log("was turned to [get_mode_name(mode)] mode by [key_name(usr)]",INVESTIGATE_ATMOS)
+ apply_mode()
+ . = TRUE
+ if("alarm")
+ var/area/A = get_area(src)
+ if(A.atmosalert(2, src))
+ post_alert(2)
+ . = TRUE
+ if("reset")
+ var/area/A = get_area(src)
+ if(A.atmosalert(0, src))
+ post_alert(0)
+ . = TRUE
+ update_icon()
+
+/obj/machinery/airalarm/proc/reset(wire)
+ switch(wire)
+ if(WIRE_POWER)
+ if(!wires.is_cut(WIRE_POWER))
+ shorted = FALSE
+ update_icon()
+ if(WIRE_AI)
+ if(!wires.is_cut(WIRE_AI))
+ aidisabled = FALSE
+
+
+/obj/machinery/airalarm/proc/shock(mob/user, prb)
+ if((stat & (NOPOWER))) // unpowered, no shock
+ return 0
+ if(!prob(prb))
+ return 0 //you lucked out, no shock for you
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, src)
+ s.start() //sparks always.
+ if (electrocute_mob(user, get_area(src), src, 1, TRUE))
+ return 1
+ else
+ return 0
+
+/obj/machinery/airalarm/proc/refresh_all()
+ var/area/A = get_area(src)
+ for(var/id_tag in A.air_vent_names)
+ var/list/I = A.air_vent_info[id_tag]
+ if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
+ continue
+ send_signal(id_tag, list("status"))
+ for(var/id_tag in A.air_scrub_names)
+ var/list/I = A.air_scrub_info[id_tag]
+ if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
+ continue
+ send_signal(id_tag, list("status"))
+
+/obj/machinery/airalarm/proc/set_frequency(new_frequency)
+ SSradio.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
+
+/obj/machinery/airalarm/proc/send_signal(target, list/command, mob/user)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new(command)
+ signal.data["tag"] = target
+ signal.data["sigtype"] = "command"
+ signal.data["user"] = user
+ radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
+
+ return 1
+
+/obj/machinery/airalarm/proc/get_mode_name(mode_value)
+ switch(mode_value)
+ if(AALARM_MODE_SCRUBBING)
+ return "Filtering"
+ if(AALARM_MODE_CONTAMINATED)
+ return "Contaminated"
+ if(AALARM_MODE_VENTING)
+ return "Draught"
+ if(AALARM_MODE_REFILL)
+ return "Refill"
+ if(AALARM_MODE_PANIC)
+ return "Panic Siphon"
+ if(AALARM_MODE_REPLACEMENT)
+ return "Cycle"
+ if(AALARM_MODE_SIPHON)
+ return "Siphon"
+ if(AALARM_MODE_OFF)
+ return "Off"
+ if(AALARM_MODE_FLOOD)
+ return "Flood"
+
+/obj/machinery/airalarm/proc/apply_mode()
+ var/area/A = get_area(src)
+ switch(mode)
+ if(AALARM_MODE_SCRUBBING)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
+ "scrubbing" = 1,
+ "widenet" = 0,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE
+ ))
+ if(AALARM_MODE_CONTAMINATED)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(
+ /datum/gas/carbon_dioxide,
+ /datum/gas/miasma,
+ /datum/gas/plasma,
+ /datum/gas/water_vapor,
+ /datum/gas/hypernoblium,
+ /datum/gas/nitrous_oxide,
+ /datum/gas/nitryl,
+ /datum/gas/tritium,
+ /datum/gas/bz,
+ /datum/gas/stimulum,
+ /datum/gas/pluoxium
+ ),
+ "scrubbing" = 1,
+ "widenet" = 1,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE
+ ))
+ if(AALARM_MODE_VENTING)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 0,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE*2
+ ))
+ if(AALARM_MODE_REFILL)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma),
+ "scrubbing" = 1,
+ "widenet" = 0,
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 1,
+ "set_external_pressure" = ONE_ATMOSPHERE * 3
+ ))
+ if(AALARM_MODE_PANIC,
+ AALARM_MODE_REPLACEMENT)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 1,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ if(AALARM_MODE_SIPHON)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "widenet" = 0,
+ "scrubbing" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+
+ if(AALARM_MODE_OFF)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ if(AALARM_MODE_FLOOD)
+ for(var/device_id in A.air_scrub_names)
+ send_signal(device_id, list(
+ "power" = 0
+ ))
+ for(var/device_id in A.air_vent_names)
+ send_signal(device_id, list(
+ "power" = 1,
+ "checks" = 2,
+ "set_internal_pressure" = 0
+ ))
+
+/obj/machinery/airalarm/update_icon()
+ set_light(0)
+ cut_overlays()
+ SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
+ if(stat & NOPOWER)
+ icon_state = "alarm0"
+ return
+
+ if(stat & BROKEN)
+ icon_state = "alarmx"
+ return
+
+ if(panel_open)
+ switch(buildstage)
+ if(2)
+ icon_state = "alarmx"
+ if(1)
+ icon_state = "alarm_b2"
+ if(0)
+ icon_state = "alarm_b1"
+ return
+
+ icon_state = "alarm1"
+ var/overlay_state = AALARM_OVERLAY_OFF
+ var/area/A = get_area(src)
+ switch(max(danger_level, A.atmosalm))
+ if(0)
+ add_overlay(AALARM_OVERLAY_GREEN)
+ overlay_state = AALARM_OVERLAY_GREEN
+ light_color = LIGHT_COLOR_GREEN
+ set_light(brightness_on)
+ if(1)
+ add_overlay(AALARM_OVERLAY_WARN)
+ overlay_state = AALARM_OVERLAY_WARN
+ light_color = LIGHT_COLOR_LAVA
+ set_light(brightness_on)
+ if(2)
+ add_overlay(AALARM_OVERLAY_DANGER)
+ overlay_state = AALARM_OVERLAY_DANGER
+ light_color = LIGHT_COLOR_RED
+ set_light(brightness_on)
+
+ SSvis_overlays.add_vis_overlay(src, icon, overlay_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE, dir)
+ update_light()
+
+/obj/machinery/airalarm/process()
+ if((stat & (NOPOWER|BROKEN)) || shorted)
+ return
+
+ var/turf/location = get_turf(src)
+ if(!location)
+ return
+
+ var/datum/tlv/cur_tlv
+
+ var/datum/gas_mixture/environment = location.return_air()
+ var/list/env_gases = environment.gases
+ var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature / environment.volume
+
+ cur_tlv = TLV["pressure"]
+ var/environment_pressure = environment.return_pressure()
+ var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
+
+ cur_tlv = TLV["temperature"]
+ var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature)
+
+ var/gas_dangerlevel = 0
+ for(var/gas_id in env_gases)
+ if(!(gas_id in TLV)) // We're not interested in this gas, it seems.
+ continue
+ cur_tlv = TLV[gas_id]
+ gas_dangerlevel = max(gas_dangerlevel, cur_tlv.get_danger_level(env_gases[gas_id] * partial_pressure))
+
+ GAS_GARBAGE_COLLECT(environment.gases)
+
+ var/old_danger_level = danger_level
+ danger_level = max(pressure_dangerlevel, temperature_dangerlevel, gas_dangerlevel)
+
+ if(old_danger_level != danger_level)
+ apply_danger_level()
+ if(mode == AALARM_MODE_REPLACEMENT && environment_pressure < ONE_ATMOSPHERE * 0.05)
+ mode = AALARM_MODE_SCRUBBING
+ apply_mode()
+
+ return
+
+
+/obj/machinery/airalarm/proc/post_alert(alert_level)
+ var/datum/radio_frequency/frequency = SSradio.return_frequency(alarm_frequency)
+
+ if(!frequency)
+ return
+
+ var/datum/signal/alert_signal = new(list(
+ "zone" = get_area_name(src),
+ "type" = "Atmospheric"
+ ))
+ if(alert_level==2)
+ alert_signal.data["alert"] = "severe"
+ else if (alert_level==1)
+ alert_signal.data["alert"] = "minor"
+ else if (alert_level==0)
+ alert_signal.data["alert"] = "clear"
+
+ frequency.post_signal(src, alert_signal, range = -1)
+
+/obj/machinery/airalarm/proc/apply_danger_level()
+ var/area/A = get_area(src)
+
+ var/new_area_danger_level = 0
+ for(var/obj/machinery/airalarm/AA in A)
+ if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
+ new_area_danger_level = max(new_area_danger_level,AA.danger_level)
+ if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state
+ post_alert(new_area_danger_level)
+
+ update_icon()
+
+/obj/machinery/airalarm/attackby(obj/item/W, mob/user, params)
+ switch(buildstage)
+ if(2)
+ if(istype(W, /obj/item/wirecutters) && panel_open && wires.is_all_cut())
+ W.play_tool_sound(src)
+ to_chat(user, "You cut the final wires.")
+ new /obj/item/stack/cable_coil(loc, 5)
+ buildstage = 1
+ update_icon()
+ return
+ else if(istype(W, /obj/item/screwdriver)) // Opening that Air Alarm up.
+ W.play_tool_sound(src)
+ panel_open = !panel_open
+ to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"].")
+ update_icon()
+ return
+ else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card
+ togglelock(user)
+ else if(panel_open && is_wire_tool(W))
+ wires.interact(user)
+ return
+ if(1)
+ if(istype(W, /obj/item/crowbar))
+ user.visible_message("[user.name] removes the electronics from [src.name].",\
+ "You start prying out the circuit...")
+ W.play_tool_sound(src)
+ if (W.use_tool(src, user, 20))
+ if (buildstage == 1)
+ to_chat(user, "You remove the air alarm electronics.")
+ new /obj/item/electronics/airalarm( src.loc )
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ buildstage = 0
+ update_icon()
+ return
+
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/cable = W
+ if(cable.get_amount() < 5)
+ to_chat(user, "You need five lengths of cable to wire the air alarm!")
+ return
+ user.visible_message("[user.name] wires the air alarm.", \
+ "You start wiring the air alarm...")
+ if (do_after(user, 20, target = src))
+ if (cable.get_amount() >= 5 && buildstage == 1)
+ cable.use(5)
+ to_chat(user, "You wire the air alarm.")
+ wires.repair()
+ aidisabled = 0
+ locked = FALSE
+ mode = 1
+ shorted = 0
+ post_alert(0)
+ buildstage = 2
+ update_icon()
+ return
+ if(0)
+ if(istype(W, /obj/item/electronics/airalarm))
+ if(user.temporarilyRemoveItemFromInventory(W))
+ to_chat(user, "You insert the circuit.")
+ buildstage = 1
+ update_icon()
+ qdel(W)
+ return
+
+ if(istype(W, /obj/item/electroadaptive_pseudocircuit))
+ var/obj/item/electroadaptive_pseudocircuit/P = W
+ if(!P.adapt_circuit(user, 25))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt an air alarm circuit and slot it into the assembly.")
+ buildstage = 1
+ update_icon()
+ return
+
+ if(istype(W, /obj/item/wrench))
+ to_chat(user, "You detach \the [src] from the wall.")
+ W.play_tool_sound(src)
+ new /obj/item/wallframe/airalarm( user.loc )
+ qdel(src)
+ return
+
+ return ..()
+
+/obj/machinery/airalarm/AltClick(mob/user)
+ ..()
+ if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
+ return
+ else
+ togglelock(user)
+
+/obj/machinery/airalarm/proc/togglelock(mob/living/user)
+ if(stat & (NOPOWER|BROKEN))
+ to_chat(user, "It does nothing!")
+ else
+ if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN))
+ locked = !locked
+ updateUsrDialog()
+ to_chat(user, "You [ locked ? "lock" : "unlock"] the air alarm interface.")
+ else
+ to_chat(user, "Access denied.")
+ return
+
+/obj/machinery/airalarm/power_change()
+ ..()
+ if(stat & NOPOWER)
+ set_light(0)
+ update_icon()
+
+/obj/machinery/airalarm/emag_act(mob/user)
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ visible_message("Sparks fly out of [src]!", "You emag [src], disabling its safeties.")
+ playsound(src, "sparks", 50, 1)
+ return TRUE
+
+/obj/machinery/airalarm/obj_break(damage_flag)
+ ..()
+ update_icon()
+ set_light(0)
+
+/obj/machinery/airalarm/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ new /obj/item/stack/sheet/metal(loc, 2)
+ var/obj/item/I = new /obj/item/electronics/airalarm(loc)
+ if(!disassembled)
+ I.obj_integrity = I.max_integrity * 0.5
+ new /obj/item/stack/cable_coil(loc, 3)
+ qdel(src)
+
+#undef AALARM_MODE_SCRUBBING
+#undef AALARM_MODE_VENTING
+#undef AALARM_MODE_PANIC
+#undef AALARM_MODE_REPLACEMENT
+#undef AALARM_MODE_OFF
+#undef AALARM_MODE_FLOOD
+#undef AALARM_MODE_SIPHON
+#undef AALARM_MODE_CONTAMINATED
+#undef AALARM_MODE_REFILL
+#undef AALARM_REPORT_TIMEOUT
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 552b9dbd64..35b30107d8 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -27,7 +27,7 @@
var/obj/item/radio/radio
var/radio_key = /obj/item/encryptionkey/headset_med
- var/radio_channel = "Medical"
+ var/radio_channel = RADIO_CHANNEL_MEDICAL
var/running_anim = FALSE
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index fcfdd7c455..84f08197b4 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -24,7 +24,6 @@
armour_penetration = 1000
resistance_flags = INDESTRUCTIBLE
anchored = TRUE
- item_flags = SLOWS_WHILE_IN_HAND
var/team = WHITE_TEAM
var/reset_cooldown = 0
var/anyonecanpickup = TRUE
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index e10d48f3bf..cf2cd7d93c 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -14,10 +14,10 @@
return FALSE
return T.air_contents.gases[gas_type] >= moles_required
-/datum/bounty/item/engineering/gas/nitryl_tank
- name = "Full Tank of Nitryl"
- description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
- gas_type = /datum/gas/nitryl
+//datum/bounty/item/engineering/gas/nitryl_tank
+// name = "Full Tank of Nitryl"
+// description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
+// gas_type = /datum/gas/nitryl
/datum/bounty/item/engineering/gas/tritium_tank
name = "Full Tank of Tritium"
@@ -37,6 +37,55 @@
required_count = 10 //easy to make
wanted_types = list(/obj/machinery/portable_atmospherics/canister)
+/datum/bounty/item/engineering/microwave
+ name = "Microwaves"
+ description = "Due to a shortage of microwaves, our chefs are incapable of keeping up with our sheer volume of orders. We need at least three microwaves to keep up with our crew's dietary habits."
+ reward = 2000
+ required_count = 3
+ wanted_types = list(/obj/machinery/microwave)
+
+/datum/bounty/item/engineering/hydroponicstrays
+ name = "Hydroponics Tray"
+ description = "The garden has become a hot spot of late, they need a few more hydroponics tray to grow more flowers."
+ reward = 2500
+ required_count = 5
+ wanted_types = list(/obj/machinery/hydroponics)
+
+/datum/bounty/item/engineering/rcd
+ name = "Spare RCD"
+ description = "Construction and repairs to are shuttles are going slowly. As it turns out, we're a little short on RCDs, can you send us a few?"
+ reward = 2500
+ required_count = 3
+ wanted_types = list(/obj/item/construction/rcd)
+
+/datum/bounty/item/engineering/rpd
+ name = "Spare RPD"
+ description = "Our Atmospheric Technicians are still living in the past, relying on stationary pipe dispensers to produce the pipes necessary to accomplish their strenuous tasks. They could use an upgrade. Could you send us some Rapid Pipe Dispensers?"
+ reward = 3000
+ required_count = 3
+ wanted_types = list(/obj/item/pipe_dispenser)
+
+/datum/bounty/item/engineering/heaters
+ name = "Space Heaters"
+ description = "The kitchen freezer was left open and now the whole place is frozen solid! We need a few space heaters to warm it back up before anyone gets hungry."
+ reward = 3000
+ required_count = 5
+ wanted_types = list(/obj/machinery/space_heater)
+
+/datum/bounty/item/engineering/arcadetrail
+ name = "Orion Trail Arcade Games"
+ description = "The staff have nothing to do when off-work. Can you send us some Orion Trail games to play?"
+ reward = 3000
+ required_count = 5
+ wanted_types = list(/obj/machinery/computer/arcade/orion_trail)
+
+/datum/bounty/item/engineering/arcadebattle
+ name = "Battle Arcade Games"
+ description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?"
+ reward = 3000
+ required_count = 5
+ wanted_types = list(/obj/machinery/computer/arcade/battle)
+
/datum/bounty/item/engineering/energy_ball
name = "Contained Tesla Ball"
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index b5b9a616d0..1a607b4b96 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -36,6 +36,7 @@
cat |= EXPORT_EMAG
/obj/machinery/computer/cargo/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
user.visible_message("[user] swipes a suspicious card through [src]!",
@@ -48,6 +49,8 @@
var/obj/item/circuitboard/computer/cargo/board = circuit
board.contraband = TRUE
board.obj_flags |= EMAGGED
+ req_access = list()
+ return TRUE
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm
index 02b060e0bf..d03f5a46ce 100644
--- a/code/modules/cargo/exports/manifest.dm
+++ b/code/modules/cargo/exports/manifest.dm
@@ -81,6 +81,7 @@
/datum/export/paperwork_correct
cost = 150
+ k_elasticity = 0
unit_name = "correct paperwork"
export_types = list(/obj/item/folder/paperwork_correct)
@@ -88,5 +89,6 @@
/datum/export/paperwork_incorrect
cost = -500 // Failed to meet NT standers
+ k_elasticity = 0
unit_name = "returned incorrect paperwork"
export_types = list(/obj/item/folder/paperwork)
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
index 5288c27ff6..0097346a34 100644
--- a/code/modules/cargo/expressconsole.dm
+++ b/code/modules/cargo/expressconsole.dm
@@ -54,6 +54,7 @@
..()
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(obj_flags & EMAGGED)
return
user.visible_message("[user] swipes a suspicious card through [src]!",
@@ -63,6 +64,8 @@
var/obj/item/circuitboard/computer/cargo/board = circuit
board.obj_flags |= EMAGGED
packin_up()
+ req_access = list()
+ return TRUE
/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
meme_pack_data = list() // sorry for what?
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 46cc1fa93c..1087f1ebb5 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -252,6 +252,17 @@
crate_name = "space suit crate"
crate_type = /obj/structure/closet/crate/secure
+/datum/supply_pack/emergency/spacejets
+ name = "Spare EVA Jetpacks"
+ desc = "Contains three EVA grade jectpaks. Requires EVA access to open."
+ cost = 2000
+ access = ACCESS_EVA
+ contains = list(/obj/item/tank/jetpack/carbondioxide/eva,
+ /obj/item/tank/jetpack/carbondioxide/eva,
+ /obj/item/tank/jetpack/carbondioxide/eva)
+ crate_name = "eva jetpacks crate"
+ crate_type = /obj/structure/closet/crate/secure
+
/datum/supply_pack/emergency/specialops
name = "Special Ops Supplies"
desc = "(*!&@#TOO CHEAP FOR THAT NULL_ENTRY, HUH OPERATIVE? WELL, THIS LITTLE ORDER CAN STILL HELP YOU OUT IN A PINCH. CONTAINS A BOX OF FIVE EMP GRENADES, THREE SMOKEBOMBS, AN INCENDIARY GRENADE, AND A \"SLEEPY PEN\" FULL OF NICE TOXINS!#@*$"
@@ -339,15 +350,6 @@
/obj/item/clothing/head/fedora/det_hat)
crate_name = "forensics crate"
-/datum/supply_pack/security/sechardsuit
- name = "Sec Hardsuit"
- desc = "One Sec Hardsuit with a small air tank and mask."
- cost = 3000 // half of SWAT gear for have the armor and half the gear
- contains = list(/obj/item/clothing/suit/space/hardsuit/security,
- /obj/item/tank/internals/air,
- /obj/item/clothing/mask/gas)
- crate_name = "sec hardsuit crate"
-
/datum/supply_pack/security/helmets
name = "Helmets Crate"
desc = "Contains three standard-issue brain buckets. Requires Security access to open."
@@ -366,6 +368,55 @@
/obj/item/gun/energy/laser)
crate_name = "laser crate"
+/datum/supply_pack/security/russianclothing
+ name = "Russian Surplus Clothing"
+ desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!"
+ contraband = TRUE
+ cost = 5000 // Its basicly sec suits, good boots/gloves
+ contains = list(/obj/item/clothing/suit/security/officer/russian,
+ /obj/item/clothing/suit/security/officer/russian,
+ /obj/item/clothing/shoes/combat,
+ /obj/item/clothing/shoes/combat,
+ /obj/item/clothing/head/ushanka,
+ /obj/item/clothing/head/ushanka,
+ /obj/item/clothing/suit/armor/bulletproof,
+ /obj/item/clothing/suit/armor/bulletproof,
+ /obj/item/clothing/head/helmet/alt,
+ /obj/item/clothing/head/helmet/alt,
+ /obj/item/clothing/gloves/combat,
+ /obj/item/clothing/gloves/combat,
+ /obj/item/clothing/mask/gas,
+ /obj/item/clothing/mask/gas)
+ crate_name = "surplus russian clothing"
+ crate_type = /obj/structure/closet/crate/internals
+
+/datum/supply_pack/security/russianmosin
+ name = "Russian Minutemen Gear"
+ desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip."
+ contraband = TRUE
+ access = FALSE
+ cost = 5000 //
+ contains = list(/obj/item/clothing/suit/security/officer/russian,
+ /obj/item/clothing/shoes/combat,
+ /obj/item/clothing/head/ushanka,
+ /obj/item/clothing/suit/armor/bulletproof,
+ /obj/item/clothing/head/helmet/alt,
+ /obj/item/clothing/gloves/combat,
+ /obj/item/clothing/mask/gas,
+ /obj/item/gun/ballistic/shotgun/boltaction,
+ /obj/item/ammo_box/a762)
+ crate_name = "surplus russian gear"
+ crate_type = /obj/structure/closet/crate/internals
+
+/datum/supply_pack/security/sechardsuit
+ name = "Sec Hardsuit"
+ desc = "One Sec Hardsuit with a small air tank and mask."
+ cost = 3000 // half of SWAT gear for have the armor and half the gear
+ contains = list(/obj/item/clothing/suit/space/hardsuit/security,
+ /obj/item/tank/internals/air,
+ /obj/item/clothing/mask/gas)
+ crate_name = "sec hardsuit crate"
+
/datum/supply_pack/security/securitybarriers
name = "Security Barrier Grenades"
desc = "Stem the tide with four Security Barrier grenades. Requires Security access to open."
@@ -430,28 +481,6 @@
/obj/item/melee/baton/loaded)
crate_name = "stun baton crate"
-/datum/supply_pack/security/russianclothing
- name = "Russian Surplus Clothing"
- desc = "An old russian crate full of surplus armor that they used to use! Has two sets of bulletproff armor, a few union suits and some warm hats!"
- contraband = TRUE
- cost = 5000 // Its basicly sec suits, good boots/gloves
- contains = list(/obj/item/clothing/suit/security/officer/russian,
- /obj/item/clothing/suit/security/officer/russian,
- /obj/item/clothing/shoes/combat,
- /obj/item/clothing/shoes/combat,
- /obj/item/clothing/head/ushanka,
- /obj/item/clothing/head/ushanka,
- /obj/item/clothing/suit/armor/bulletproof,
- /obj/item/clothing/suit/armor/bulletproof,
- /obj/item/clothing/head/helmet/alt,
- /obj/item/clothing/head/helmet/alt,
- /obj/item/clothing/gloves/combat,
- /obj/item/clothing/gloves/combat,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas)
- crate_name = "surplus russian clothing"
- crate_type = /obj/structure/closet/crate/internals
-
/datum/supply_pack/security/taser
name = "Taser Crate"
desc = "From the depths of stunbased combat, this order rises above, supreme. Contains three hybrid tasers, capable of firing both electrodes and disabling shots. Requires Security access to open."
@@ -665,6 +694,15 @@
/obj/item/gun/energy/e_gun/stun)
crate_name = "swat taser crate"
+/datum/supply_pack/security/armory/woodstock
+ name = "Classic WoodStock Shotguns Crate"
+ desc = "Contains three rustic, pumpaction shotguns. Requires Armory access to open."
+ cost = 3500
+ contains = list(/obj/item/gun/ballistic/shotgun,
+ /obj/item/gun/ballistic/shotgun,
+ /obj/item/gun/ballistic/shotgun)
+ crate_name = "woodstock shotguns crate"
+
/datum/supply_pack/security/armory/wt550
name = "WT-550 Semi-Auto Rifle Crate"
desc = "Contains two high-powered, semiautomatic rifles chambered in 4.6x30mm. Requires Armory access to open."
@@ -1633,7 +1671,7 @@
/obj/item/caution,
/obj/item/storage/bag/trash,
/obj/item/reagent_containers/spray/cleaner,
- /obj/item/reagent_containers/glass/rag,
+ /obj/item/reagent_containers/rag,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
/obj/item/grenade/chem_grenade/cleaner,
@@ -1661,17 +1699,28 @@
/datum/supply_pack/service/janitor/janpremium
name = "Janitor Premium Supplies"
desc = "Do to the union for better supplies, we have desided to make a deal for you, In this crate you can get a brand new chem, Drying Angent this stuff is the work of slimes or magic! This crate also contains a rag to test out the Drying Angent magic, three wet floor signs, and some spare bottles of ammonia."
- cost = 3000
+ cost = 1750
access = ACCESS_JANITOR
contains = list(/obj/item/caution,
/obj/item/caution,
/obj/item/caution,
- /obj/item/reagent_containers/glass/rag,
+ /obj/item/reagent_containers/rag,
+ /obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/glass/bottle/ammonia,
/obj/item/reagent_containers/spray/drying_agent)
crate_name = "janitor backpack crate"
+/datum/supply_pack/service/janitor/janpimp
+ name = "Custodial Cruiser"
+ desc = "Clown steal your ride? Assistant lock it in the dorms? Order a new one and get back to cleaning in style!"
+ cost = 3000
+ access = ACCESS_JANITOR
+ contains = list(/obj/vehicle/ridden/janicart,
+ /obj/item/key/janitor)
+ crate_name = "janitor ride crate"
+ crate_type = /obj/structure/closet/crate/large
+
/datum/supply_pack/service/mule
name = "MULEbot Crate"
desc = "Pink-haired Quartermaster not doing her job? Replace her with this tireless worker, today!"
@@ -1968,7 +2017,8 @@
/obj/item/storage/box/mre/menu1/safe,
/obj/item/storage/box/mre/menu2/safe,
/obj/item/storage/box/mre/menu2/safe,
- /obj/item/storage/box/mre/menu3)
+ /obj/item/storage/box/mre/menu3,
+ /obj/item/storage/box/mre/menu4/safe)
crate_name = "MRE crate (emergency rations)"
/datum/supply_pack/organic/pizza
@@ -2195,6 +2245,12 @@
/obj/item/clothing/neck/petcollar)
crate_name = "pug crate"
+/datum/supply_pack/organic/critter/kiwi
+ name = "Space kiwi Crate"
+ cost = 2000
+ contains = list( /mob/living/simple_animal/kiwi)
+ crate_name = "space kiwi crate"
+
/datum/supply_pack/critter/snake
name = "Snake Crate"
desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? Then this isn't the crate for you. Contains three poisonous snakes."
@@ -2204,6 +2260,17 @@
/mob/living/simple_animal/hostile/retaliate/poison/snake)
crate_name = "snake crate"
+/datum/supply_pack/critter/secbat
+ name = "Security Bat Crate"
+ desc = "Contains five security bats, perfect to Bat-up any security officer."
+ cost = 2500
+ contains = list(/mob/living/simple_animal/hostile/retaliate/bat/secbat,
+ /mob/living/simple_animal/hostile/retaliate/bat/secbat,
+ /mob/living/simple_animal/hostile/retaliate/bat/secbat,
+ /mob/living/simple_animal/hostile/retaliate/bat/secbat,
+ /mob/living/simple_animal/hostile/retaliate/bat/secbat)
+ crate_name = "security bat crate"
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Costumes & Toys /////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -2561,6 +2628,13 @@
/obj/item/vending_refill/wardrobe/law_wardrobe)
crate_name = "security department supply crate"
+/datum/supply_pack/costumes_toys/kinkmate
+ name = "Kinkmate construction kit"
+ cost = 2000
+ contraband = TRUE
+ contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
+ crate_name = "Kinkmate construction kit"
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Miscellaneous ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -2674,6 +2748,26 @@
crate_type = /obj/structure/closet/crate/wooden
crate_name = "festive wrapping paper crate"
+/datum/supply_pack/misc/paper_work
+ name = "Freelance Paper work"
+ desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
+ cost = 700 // Net of 0 credits
+ contains = list(/obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/folder/paperwork,
+ /obj/item/pen/fountain,
+ /obj/item/pen/fountain,
+ /obj/item/pen/fountain,
+ /obj/item/pen/fountain,
+ /obj/item/pen/fountain)
+ crate_name = "Paperwork"
/datum/supply_pack/misc/funeral
name = "Funeral Supply crate"
@@ -2686,18 +2780,11 @@
crate_name = "coffin"
crate_type = /obj/structure/closet/crate/coffin
-/datum/supply_pack/misc/religious_supplies
- name = "Religious Supplies Crate"
- desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
- cost = 4000 // it costs so much because the Space Church is ran by Space Jews
- contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
- /obj/item/reagent_containers/food/drinks/bottle/holywater,
- /obj/item/storage/book/bible/booze,
- /obj/item/storage/book/bible/booze,
- /obj/item/clothing/suit/hooded/chaplain_hoodie,
- /obj/item/clothing/suit/hooded/chaplain_hoodie
- )
- crate_name = "religious supplies crate"
+/datum/supply_pack/misc/jukebox
+ name = "Jukebox"
+ cost = 35000
+ contains = list(/obj/machinery/jukebox)
+ crate_name = "Jukebox"
/datum/supply_pack/misc/lewd
name = "Lewd Crate" // OwO
@@ -2730,26 +2817,18 @@
crate_name = "deluxe keg"
crate_type = /obj/structure/closet/crate
-/datum/supply_pack/misc/paper_work
- name = "Freelance Paper work"
- desc = "The Nanotrasen Primary Bureaucratic Database Intelligence (PDBI) reports that the station has not completed its funding and grant paperwork this solar cycle. In order to gain further funding, your station is required to fill out (10) ten of these forms or no additional capital will be disbursed. We have sent you ten copies of the following form and we expect every one to be up to Nanotrasen Standards." // Disbursement. It's not a typo, look it up.
- cost = 400 // Net of 0 credits
- contains = list(/obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/folder/paperwork,
- /obj/item/pen/fountain,
- /obj/item/pen/fountain,
- /obj/item/pen/fountain,
- /obj/item/pen/fountain,
- /obj/item/pen/fountain)
- crate_name = "Paperwork"
+/datum/supply_pack/misc/religious_supplies
+ name = "Religious Supplies Crate"
+ desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
+ cost = 4000 // it costs so much because the Space Church is ran by Space Jews
+ contains = list(/obj/item/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/storage/book/bible/booze,
+ /obj/item/storage/book/bible/booze,
+ /obj/item/clothing/suit/hooded/chaplain_hoodie,
+ /obj/item/clothing/suit/hooded/chaplain_hoodie
+ )
+ crate_name = "religious supplies crate"
/datum/supply_pack/misc/randomised/promiscuous
name = "Promiscuous Organs"
@@ -2775,4 +2854,3 @@
/obj/item/toner,
/obj/item/toner)
crate_name = "toner crate"
-
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 06f23574e1..5442fcb932 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -817,6 +817,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
var/file = GLOB.vox_sounds[name]
Export("##action=load_rsc", file)
stoplag()
+ for (var/name in GLOB.vox_sounds_male)
+ var/file = GLOB.vox_sounds_male[name]
+ Export("##action=load_rsc", file)
+ stoplag()
#endif
diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm
new file mode 100644
index 0000000000..9e8d136b3b
--- /dev/null
+++ b/code/modules/client/darkmode.dm
@@ -0,0 +1,117 @@
+//Darkmode preference by Kmc2000//
+
+/*
+This lets you switch chat themes by using winset and CSS loading, you must relog to see this change (or rebuild your browseroutput datum)
+Things to note:
+If you change ANYTHING in interface/skin.dmf you need to change it here:
+Format:
+winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
+How this works:
+I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
+This then swaps the window theme automatically
+Thanks to spacemaniac and mcdonald for help with the JS side of this.
+*/
+
+/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
+ //Main windows
+ winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
+ winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
+ //Buttons
+ winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
+ winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
+ winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
+ winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
+ winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
+ winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]")
+ winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ //Status and verb tabs
+ winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
+ winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
+ winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
+ //Etc.
+ winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
+ winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+ winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
+ winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
+
+/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
+ //Main windows
+ winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
+ winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
+ winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ //Buttons
+ winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
+ winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]")
+ winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ //Status and verb tabs
+ winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
+ winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
+ winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
+ //Etc.
+ winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+ winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
+ winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
+
+
+/datum/asset/simple/goonchat
+ verify = FALSE
+ assets = list(
+ "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
+ "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
+ "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
+ "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot',
+ "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg',
+ "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf',
+ "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
+ "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
+ "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
+ "browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
+ )
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ffd21e0191..d487b873b1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -29,7 +29,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
- var/ooccolor = null
+ var/ooccolor = "#c43b23"
+ var/aooccolor = "#ce254f"
var/enable_tips = TRUE
var/tip_delay = 500 //tip delay in milliseconds
@@ -71,12 +72,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/underwear = "Nude" //underwear type
- var/undie_color = "#FFFFFF"
+ var/undie_color = "FFF"
var/undershirt = "Nude" //undershirt type
- var/shirt_color = "#FFFFFF"
+ var/shirt_color = "FFF"
var/socks = "Nude" //socks type
- var/socks_color = "#FFFFFF"
+ var/socks_color = "FFF"
var/backbag = DBACKPACK //backpack type
+ var/jumpsuit_style = PREF_SUIT //suit/skirt
var/hair_style = "Bald" //Hair type
var/hair_color = "000" //Hair color
var/facial_hair_style = "Shaved" //Face hair type
@@ -142,6 +144,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"breasts_size" = "C",
"breasts_shape" = "Pair",
"breasts_fluid" = "milk",
+ "breasts_producing" = FALSE,
"has_vag" = FALSE,
"vag_shape" = "Human",
"vag_color" = "fff",
@@ -686,6 +689,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(UNDIE_COLORABLE(GLOB.socks_list[socks]))
dat += "Socks Color:[socks_color]"
dat += "Backpack:[backbag]"
+ dat += "Jumpsuit:
[jumpsuit_style]
"
dat += "Uplink Location:[uplink_spawn_loc]"
dat += ""
@@ -740,6 +744,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " Change
"
dat += "Cup Size:[features["breasts_size"]]"
dat += "Breast Shape:[features["breasts_shape"]]"
+ dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]"
dat += ""
dat += ""
dat += ""
@@ -774,6 +779,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
"
if(unlock_content || check_rights_for(user.client, R_ADMIN))
dat += "OOC Color: Change
"
+ dat += "Antag OOC Color: Change
"
+
dat += ""
if(user.client.holder)
dat +=""
@@ -912,11 +919,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " | Description | "
for(var/j in GLOB.loadout_items[gear_tab])
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
- var/donoritem
- if(gear.ckeywhitelist && gear.ckeywhitelist.len)
- donoritem = TRUE
- if(!(user.ckey in gear.ckeywhitelist))
- continue
+ var/donoritem = gear.donoritem
+ if(donoritem && !gear.donator_ckey_check(user.ckey))
+ continue
var/class_link = ""
if(gear.type in chosen_gear)
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
@@ -1408,19 +1413,21 @@ GLOBAL_LIST_EMPTY(preferences_datums)
facial_hair_style = random_facial_hair_style(gender)
if("underwear")
underwear = random_underwear(gender)
- undie_color = random_color()
+ undie_color = random_short_color()
if("undershirt")
undershirt = random_undershirt(gender)
- shirt_color = random_color()
+ shirt_color = random_short_color()
if("socks")
socks = random_socks()
- socks_color = random_color()
+ socks_color = random_short_color()
if(BODY_ZONE_PRECISE_EYES)
eye_color = random_eye_color()
if("s_tone")
skin_tone = random_skin_tone()
if("bag")
backbag = pick(GLOB.backbaglist)
+ if("suit")
+ jumpsuit_style = pick(GLOB.jumpsuitlist)
if("all")
random_character()
@@ -1527,7 +1534,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("undie_color")
var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", undie_color) as color|null
if(n_undie_color)
- undie_color = n_undie_color
+ undie_color = sanitize_hexcolor(n_undie_color)
if("undershirt")
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list
@@ -1537,7 +1544,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("shirt_color")
var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", shirt_color) as color|null
if(n_shirt_color)
- shirt_color = n_shirt_color
+ shirt_color = sanitize_hexcolor(n_shirt_color)
if("socks")
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list
@@ -1547,7 +1554,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("socks_color")
var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", socks_color) as color|null
if(n_socks_color)
- socks_color = n_socks_color
+ socks_color = sanitize_hexcolor(n_socks_color)
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
@@ -1952,11 +1959,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_ooccolor)
ooccolor = new_ooccolor
+ if("aooccolor")
+ var/new_aooccolor = input(user, "Choose your Antag OOC colour:", "Game Preference",ooccolor) as color|null
+ if(new_aooccolor)
+ aooccolor = new_aooccolor
+
if("bag")
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in GLOB.backbaglist
if(new_backbag)
backbag = new_backbag
+ if("suit")
+ if(jumpsuit_style == PREF_SUIT)
+ jumpsuit_style = PREF_SKIRT
+ else
+ jumpsuit_style = PREF_SUIT
+
+
if("uplink_loc")
var/new_loc = input(user, "Choose your character's traitor uplink spawn location:", "Character Preference") as null|anything in GLOB.uplink_spawn_loc_list
if(new_loc)
@@ -2037,6 +2056,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["eggsack_internal"] = !features["eggsack_internal"]
if("has_breasts")
features["has_breasts"] = !features["has_breasts"]
+ if(features["has_breasts"] == FALSE)
+ features["breasts_producing"] = FALSE
+ if("breasts_producing")
+ features["breasts_producing"] = !features["breasts_producing"]
if("has_vag")
features["has_vag"] = !features["has_vag"]
if(features["has_vag"] == FALSE)
@@ -2220,7 +2243,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!is_loadout_slot_available(G.category))
to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!")
return
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(user.ckey))
to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.")
return
if(gear_points >= initial(G.cost))
@@ -2279,6 +2302,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.backbag = backbag
+ character.jumpsuit_style = jumpsuit_style
var/datum/species/chosen_species
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 00f8ea7e6b..7911d92495 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -274,6 +274,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["socks"] >> socks
S["socks_color"] >> socks_color
S["backbag"] >> backbag
+ S["jumpsuit_style"] >> jumpsuit_style
S["uplink_loc"] >> uplink_spawn_loc
S["feature_mcolor"] >> features["mcolor"]
S["feature_lizard_tail"] >> features["tail_lizard"]
@@ -348,6 +349,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_breasts_shape"] >> features["breasts_shape"]
S["feature_breasts_color"] >> features["breasts_color"]
S["feature_breasts_fluid"] >> features["breasts_fluid"]
+ S["feature_breasts_producing"] >> features["breasts_producing"]
//vagina features
S["feature_has_vag"] >> features["has_vag"]
S["feature_vag_shape"] >> features["vag_shape"]
@@ -408,6 +410,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
+ jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
@@ -476,7 +479,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["shirt_color"] , shirt_color)
WRITE_FILE(S["socks"] , socks)
WRITE_FILE(S["socks_color"] , socks_color)
- WRITE_FILE(S["backbag"] , backbag)
+ WRITE_FILE(S["backbag"] , backbag)
+ WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
WRITE_FILE(S["species"] , pref_species.id)
WRITE_FILE(S["feature_mcolor"] , features["mcolor"])
diff --git a/code/modules/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm
index 893501a852..311c22955d 100644
--- a/code/modules/client/verbs/aooc.dm
+++ b/code/modules/client/verbs/aooc.dm
@@ -1,3 +1,6 @@
+GLOBAL_VAR_INIT(AOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
+GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f")
+
/client/verb/aooc(msg as text)
set name = "AOOC"
set desc = "An OOC channel exclusive to antagonists."
@@ -50,7 +53,7 @@
var/keyname = key
if(prefs.unlock_content)
if(prefs.toggles & MEMBER_PUBLIC)
- keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]"
+ keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]"
//The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url
var/antaglisting = list()
@@ -74,23 +77,27 @@
else
to_chat(C, "Antag OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]")
else
- to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
+ if(GLOB.AOOC_COLOR)
+ to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
+ else
+ to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
else if(!(key in C.prefs.ignoring))
- to_chat(C, "Antag OOC: [keyname]: [msg]")
-
-GLOBAL_VAR_INIT(antag_ooc_colour, AOOC_COLOR)
+ if(GLOB.AOOC_COLOR)
+ to_chat(C, "Antag OOC: [keyname]: [msg]")
+ else
+ to_chat(C, "Antag OOC: [keyname]: [msg]")
/client/proc/set_aooc(newColor as color)
set name = "Set Antag OOC Color"
set desc = "Modifies antag OOC Color"
set category = "Fun"
- GLOB.antag_ooc_colour = sanitize_ooccolor(newColor)
+ GLOB.AOOC_COLOR = sanitize_ooccolor(newColor)
/client/proc/reset_aooc()
set name = "Reset Antag OOC Color"
set desc = "Returns antag OOC Color to default"
set category = "Fun"
- GLOB.antag_ooc_colour = AOOC_COLOR
+ GLOB.AOOC_COLOR = null
/proc/toggle_aooc(toggle = null)
if(toggle != null) //if we're specifically en/disabling ooc
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 5df13a1ffe..8a233025a1 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -1,3 +1,6 @@
+GLOBAL_VAR_INIT(OOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
+GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
+
/client/verb/ooc(msg as text)
set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite
set category = "OOC"
@@ -66,9 +69,15 @@
else
to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]")
else
- to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
+ if(GLOB.OOC_COLOR)
+ to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
+ else
+ to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]")
else if(!(key in C.prefs.ignoring))
- to_chat(C, "OOC: [keyname]: [msg]")
+ if(GLOB.OOC_COLOR)
+ to_chat(C, "OOC: [keyname]: [msg]")
+ else
+ to_chat(C, "OOC: [keyname]: [msg]")
/proc/toggle_ooc(toggle = null)
if(toggle != null) //if we're specifically en/disabling ooc
@@ -99,19 +108,17 @@
else
GLOB.dooc_allowed = !GLOB.dooc_allowed
-GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR)
-
/client/proc/set_ooc(newColor as color)
set name = "Set Player OOC Color"
set desc = "Modifies player OOC Color"
set category = "Fun"
- GLOB.normal_ooc_colour = sanitize_ooccolor(newColor)
+ GLOB.OOC_COLOR = sanitize_ooccolor(newColor)
/client/proc/reset_ooc()
set name = "Reset Player OOC Color"
set desc = "Returns player OOC Color to default"
set category = "Fun"
- GLOB.normal_ooc_colour = OOC_COLOR
+ GLOB.OOC_COLOR = null
/client/verb/colorooc()
set name = "Set Your OOC Color"
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 04a8e17b7b..33a83487fc 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -437,7 +437,7 @@
item_state = "gas_alt"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -630,3 +630,27 @@
/obj/item/stamp/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
+
+/obj/item/clothing/neck/cloak/chameleon
+ name = "black tie"
+ desc = "A neosilk clip-on tie."
+ icon_state = "blacktie"
+ item_color = "blacktie"
+ resistance_flags = NONE
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+
+/obj/item/clothing/neck/cloak/chameleon
+ var/datum/action/item_action/chameleon/change/chameleon_action
+
+/obj/item/clothing/neck/cloak/chameleon/Initialize()
+ . = ..()
+ chameleon_action = new(src)
+ chameleon_action.chameleon_type = /obj/item/clothing/neck
+ chameleon_action.chameleon_name = "Cloak"
+ chameleon_action.initialize_disguises()
+
+/obj/item/clothing/neck/cloak/chameleon/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ chameleon_action.emp_randomise()
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index a87e95e28c..387aa65d20 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -24,11 +24,13 @@
desc = "[desc] The display is flickering slightly."
/obj/item/clothing/glasses/hud/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "PZZTTPFFFT")
desc = "[desc] The display is flickering slightly."
+ return TRUE
/obj/item/clothing/glasses/hud/health
name = "health scanner HUD"
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 817fe59dcd..f0c1eeb833 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -8,6 +8,7 @@
slot_flags = ITEM_SLOT_GLOVES
attack_verb = list("challenged")
var/transfer_prints = FALSE
+ var/transfer_blood = 0
strip_delay = 20
equip_delay_other = 40
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index bc36353ac5..cc6d65b74d 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -65,6 +65,9 @@
var/warcry = "AT"
/obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE)
+ if(!istype(target))
+ return
+
var/mob/living/M = loc
if(M.a_intent == INTENT_HARM)
@@ -72,9 +75,33 @@
M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click.
if(warcry)
M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
+
.= FALSE
+
/obj/item/clothing/gloves/rapid/attack_self(mob/user)
var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
if(input)
warcry = input
+
+/obj/item/clothing/gloves/rapid/hug
+ name = "Hugs of the North Star"
+ desc = "Just looking at these fills you with an urge to hug the shit out of people"
+ warcry = "owo" //Shouldn't ever come into play
+
+/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
+ if(!istype(target))
+ return
+
+ var/mob/living/M = loc
+
+ if(M.a_intent == INTENT_HELP)
+ if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead
+ if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
+ return
+ else
+ M.changeNext_move(CLICK_CD_RAPID)
+ . = FALSE
+
+/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user)
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm
index bbae5b261f..a5fb04d393 100644
--- a/code/modules/clothing/head/beanie.dm
+++ b/code/modules/clothing/head/beanie.dm
@@ -74,4 +74,13 @@
icon_state = "beaniestripedgreen"
item_color = "beaniestripedgreen"
+/obj/item/clothing/head/beanie/durathread
+ name = "durathread beanie"
+ desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer."
+ icon_state = "beaniedurathread"
+ item_color = null
+ armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
+
+
+
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
\ No newline at end of file
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index f4b4e4a96d..be6e270e45 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -336,3 +336,11 @@
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
+
+
+/obj/item/clothing/head/helmet/durathread
+ name = "makeshift helmet"
+ desc = "A hardhat with strips of leather and durathread for additional blunt protection."
+ icon_state = "durathread"
+ item_state = "durathread"
+ armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 23e1825c3d..298510564c 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -279,6 +279,13 @@
desc = "This headwear shows off your Cargonian leadership"
icon_state = "qmberet"
+/obj/item/clothing/head/beret/durathread
+ name = "durathread beret"
+ desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
+ icon_state = "beretdurathread"
+ item_color = null
+ armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50)
+
#undef DRILL_DEFAULT
#undef DRILL_SHOUTING
#undef DRILL_YELLING
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 73fde5d50f..041f0ba012 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -312,8 +312,8 @@
/obj/item/clothing/head/pharaoh
name = "pharaoh hat"
desc = "Walk like an Egyptian."
- icon_state = "pharoah_hat"
- icon_state = "pharoah_hat"
+ icon_state = "pharaoh_hat"
+ icon_state = "pharaoh_hat"
/obj/item/clothing/head/jester/alt
name = "jester hat"
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index ed0ef27174..947aa048c4 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -4,8 +4,8 @@
icon_state = "breath"
item_state = "m_mask"
body_parts_covered = 0
- clothing_flags = MASKINTERNALS
- visor_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
+ visor_flags = ALLOWINTERNALS
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.1
permeability_coefficient = 0.5
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index bcf3064c49..c613d1a91e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -2,7 +2,7 @@
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
@@ -59,7 +59,7 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
@@ -91,7 +91,7 @@
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
@@ -100,7 +100,7 @@
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
@@ -132,7 +132,7 @@
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
@@ -141,7 +141,7 @@
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
@@ -162,7 +162,7 @@
name = "owl mask"
desc = "Twoooo!"
icon_state = "owl"
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
flags_cover = MASKCOVERSEYES
resistance_flags = FLAMMABLE
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 8860650fbc..086d47e8bf 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -7,10 +7,10 @@
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
icon_state = "sechailer"
item_state = "sechailer"
- clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
flags_inv = HIDEFACIALHAIR|HIDEFACE
w_class = WEIGHT_CLASS_SMALL
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
visor_flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
@@ -69,12 +69,14 @@
/obj/item/clothing/mask/gas/sechailer/attack_self()
halt()
-/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob)
- if(safety)
- safety = FALSE
- to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.")
- else
+
+/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user)
+ . = ..()
+ if(!safety)
return
+ safety = FALSE
+ to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.")
+ return TRUE
/obj/item/clothing/mask/gas/sechailer/verb/halt()
set category = "Object"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 5dfa7d6047..4b8f16a77f 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -313,3 +313,9 @@
message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]")
message = replacetextEx(message,regex(key,"g"), "[value]")
speech_args[SPEECH_MESSAGE] = trim(message)
+
+/obj/item/clothing/mask/bandana/durathread
+ name = "durathread bandana"
+ desc = "A bandana made from durathread, you wish it would provide some protection to its wearer, but it's far too thin..."
+ icon_state = "banddurathread"
+
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index b4310a7f42..523ed55aa4 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -45,16 +45,23 @@
R.recalculateChannels()
/datum/outfit/ert/commander/alert
- name = "ERT Commander - High Alert"
+ name = "ERT Commander - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
- /obj/item/gun/energy/pulse/pistol/loyalpin=1)
+ /obj/item/gun/energy/e_gun=1)
l_pocket = /obj/item/melee/transforming/energy/sword/saber
+/datum/outfit/ert/commander/alert/red
+ name = "ERT Commander - Red Alert"
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/pulse/pistol/loyalpin=1)
+
/datum/outfit/ert/security
name = "ERT Security"
@@ -80,15 +87,22 @@
R.recalculateChannels()
/datum/outfit/ert/security/alert
- name = "ERT Security - High Alert"
+ name = "ERT Security - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/melee/baton/loaded=1,\
- /obj/item/gun/energy/pulse/carbine/loyalpin=1)
+ /obj/item/gun/energy/e_gun/stun=1)
+/datum/outfit/ert/security/alert/red
+ name = "ERT Security - Red Alert"
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/storage/box/handcuffs=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/gun/energy/pulse/carbine/loyalpin=1)
/datum/outfit/ert/medic
name = "ERT Medic"
@@ -117,9 +131,18 @@
R.recalculateChannels()
/datum/outfit/ert/medic/alert
- name = "ERT Medic - High Alert"
+ name = "ERT Medic - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/e_gun=1,\
+ /obj/item/reagent_containers/hypospray/combat/nanites=1,\
+ /obj/item/gun/medbeam=1)
+
+/datum/outfit/ert/medic/alert/red
+ name = "ERT Medic - Red Alert"
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
@@ -154,15 +177,51 @@
R.recalculateChannels()
/datum/outfit/ert/engineer/alert
- name = "ERT Engineer - High Alert"
+ name = "ERT Engineer - Amber Alert"
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi
+ backpack_contents = list(/obj/item/storage/box/engineer=1,\
+ /obj/item/melee/baton/loaded=1,\
+ /obj/item/clothing/mask/gas/sechailer/swat=1,\
+ /obj/item/gun/energy/e_gun=1,\
+ /obj/item/construction/rcd/combat=1)
+
+/datum/outfit/ert/engineer/alert/red
+ name = "ERT Engineer - Red Alert"
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/gun/energy/pulse/pistol/loyalpin=1,\
/obj/item/construction/rcd/combat=1)
+/datum/outfit/ert/greybois
+ name = "Emergency Assistant"
+
+ uniform = /obj/item/clothing/under/color/grey/glorf
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ gloves = /obj/item/clothing/gloves/color/fyellow
+ ears = /obj/item/radio/headset
+ head = /obj/item/clothing/head/soft/grey
+ belt = /obj/item/storage/belt/utility/full
+ back = /obj/item/storage/backpack
+ mask = /obj/item/clothing/mask/gas
+ l_pocket = /obj/item/tank/internals/emergency_oxygen
+ l_hand = /obj/item/storage/toolbox/emergency/old
+ id = /obj/item/card/id
+
+/datum/outfit/ert/greybois/greygod
+ suit = /obj/item/clothing/suit/hazardvest
+ l_hand = /obj/item/storage/toolbox/plastitanium
+ gloves = /obj/item/clothing/gloves/color/yellow
+
+/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ if(visualsOnly)
+ return
+ var/obj/item/card/id/W = H.wear_id
+ W.registered_name = H.real_name
+ W.assignment = "Assistant"
+ W.access = list(ACCESS_MAINT_TUNNELS,ACCESS_CENT_GENERAL)
+ W.update_label(W.registered_name, W.assignment)
/datum/outfit/centcom_official
name = "CentCom Official"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index e6554f6125..4659de3e6a 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -219,17 +219,13 @@
var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction
- if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end)))
- jumping = TRUE
+ if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE))
playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1)
+ recharging_time = world.time + recharging_rate
user.visible_message("[usr] dashes forward into the air!")
else
to_chat(user, "Something prevents you from dashing forward!")
-/obj/item/clothing/shoes/bhop/proc/hop_end()
- jumping = FALSE
- recharging_time = world.time + recharging_rate
-
/obj/item/clothing/shoes/singery
name = "yellow performer's boots"
desc = "These boots were made for dancing."
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index 9d3918ed84..662a91c80c 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -4,7 +4,7 @@
name = "space helmet"
icon_state = "spaceold"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
- clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
+ clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
item_state = "spaceold"
permeability_coefficient = 0.01
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 85503c720a..2694497579 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -624,19 +624,19 @@
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
slowdown = 6 //Slow
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
name = "M.A.S.O.N RIG helmet"
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
item_color = "ancient"
brightness_on = 16
scan_reagents = TRUE
@@ -644,7 +644,7 @@
tint = 1
var/obj/machinery/doppler_array/integrated/bomb_radar
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
. = ..()
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 7346dc9ea9..cf411ef367 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -28,7 +28,6 @@
H.update_inv_wear_suit()
else if(adjusted == ALT_STYLE)
adjusted = NORMAL_STYLE
- H.update_inv_wear_suit()
if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
if(H.dna.features["taur"] in list("Naga", "Tentacle"))
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 5eec159462..0840288eee 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -238,3 +238,14 @@
/obj/item/clothing/suit/armor/riot/knight/red
icon_state = "knight_red"
item_state = "knight_red"
+
+/obj/item/clothing/suit/armor/vest/durathread
+ name = "makeshift vest"
+ desc = "A vest made of durathread with strips of leather acting as trauma plates."
+ icon_state = "durathread"
+ item_state = "durathread"
+ strip_delay = 60
+ equip_delay_other = 40
+ max_integrity = 200
+ resistance_flags = FLAMMABLE
+ armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index bf11d40caf..3c3c8f0e9d 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -177,3 +177,23 @@
armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
cold_protection = CHEST|ARMS
heat_protection = CHEST|ARMS
+
+
+//Robotocist
+
+/obj/item/clothing/suit/hooded/techpriest
+ name = "techpriest robes"
+ desc = "For those who REALLY love their toasters."
+ icon_state = "techpriest"
+ item_state = "techpriest"
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
+ hoodtype = /obj/item/clothing/head/hooded/techpriest
+ mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/head/hooded/techpriest
+ name = "techpriest's hood"
+ desc = "A hood for those who REALLY love their toasters."
+ icon_state = "techpriesthood"
+ item_state = "techpriesthood"
+ body_parts_covered = HEAD
+ flags_inv = HIDEHAIR|HIDEEARS
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index dc1b2b6dc3..8a3dbbf274 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -468,11 +468,11 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
allowed = list(/obj/item/clothing/mask/facehugger/toy)
-/obj/item/clothing/suit/nemes
- name = "pharoah tunic"
+/obj/item/clothing/suit/pharaoh
+ name = "pharaoh tunic"
desc = "Lavish space tomb not included."
- icon_state = "pharoah"
- icon_state = "pharoah"
+ icon_state = "pharaoh"
+ icon_state = "pharaoh"
body_parts_covered = CHEST|GROIN
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 396bcb4766..6535e40d0d 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -354,3 +354,28 @@
item_color = "skull"
above_suit = TRUE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
+
+/////////////////////
+//Synda Accessories//
+/////////////////////
+
+/obj/item/clothing/accessory/padding
+ name = "soft padding"
+ desc = "Some long sheets of padding to help soften the blows of a physical attacks."
+ icon_state = "padding"
+ item_color = "nothing"
+ armor = list("melee" = 15, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45)
+
+/obj/item/clothing/accessory/kevlar
+ name = "kevlar sheets"
+ desc = "Long thin sheets of kevlar to help resist bullets and some physical attacks.."
+ icon_state = "padding"
+ item_color = "nothing"
+ armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25)
+
+/obj/item/clothing/accessory/plastics
+ name = "underling plastic sheet"
+ desc = "A full body sheet of white plastic to help defuse lasers and energy based weapons."
+ icon_state = "plastics"
+ item_color = "nothing"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40)
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index c239f48b05..54264ef9d4 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -1,12 +1,18 @@
/obj/item/clothing/under/color
desc = "A standard issue colored jumpsuit. Variety is the spice of life!"
+/obj/item/clothing/under/skirt/color
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/color/random
icon_state = "random_jumpsuit"
/obj/item/clothing/under/color/random/Initialize()
..()
- var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
+ var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
+
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere...
@@ -14,6 +20,20 @@
new C(loc)
return INITIALIZE_HINT_QDEL
+/obj/item/clothing/under/skirt/color/random
+ icon_state = "random_jumpsuit" //Skirt variant needed
+
+/obj/item/clothing/under/skirt/color/random/Initialize()
+ ..()
+ var/obj/item/clothing/under/skirt/color/C = pick(subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/skirt/color/random)
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
+ H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM)
+ else
+ new C(loc)
+ return INITIALIZE_HINT_QDEL
+
+
/obj/item/clothing/under/color/black
name = "black jumpsuit"
icon_state = "black"
@@ -21,6 +41,12 @@
item_color = "black"
resistance_flags = NONE
+/obj/item/clothing/under/skirt/color/black
+ name = "black jumpskirt"
+ icon_state = "black_skirt"
+ item_state = "bl_suit"
+ item_color = "black_skirt"
+
/obj/item/clothing/under/color/black/ghost
item_flags = DROPDEL
@@ -28,6 +54,9 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
+/obj/item/clothing/under/color/black/ghost/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, DROPDEL)
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
@@ -35,6 +64,13 @@
item_state = "gy_suit"
item_color = "grey"
+/obj/item/clothing/under/skirt/color/grey
+ name = "grey jumpskirt"
+ desc = "A tasteful grey jumpskirt that reminds you of the good old days."
+ icon_state = "grey_skirt"
+ item_state = "gy_suit"
+ item_color = "grey_skirt"
+
/obj/item/clothing/under/color/grey/glorf
name = "ancient jumpsuit"
desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade."
@@ -49,12 +85,24 @@
item_state = "b_suit"
item_color = "blue"
+/obj/item/clothing/under/skirt/color/blue
+ name = "blue jumpskirt"
+ icon_state = "blue_skirt"
+ item_state = "b_suit"
+ item_color = "blue_skirt"
+
/obj/item/clothing/under/color/green
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
item_color = "green"
+/obj/item/clothing/under/skirt/color/green
+ name = "green jumpskirt"
+ icon_state = "green_skirt"
+ item_state = "g_suit"
+ item_color = "green_skirt"
+
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
desc = "Don't wear this near paranoid security officers."
@@ -62,6 +110,12 @@
item_state = "o_suit"
item_color = "orange"
+/obj/item/clothing/under/skirt/color/orange
+ name = "orange jumpskirt"
+ icon_state = "orange_skirt"
+ item_state = "o_suit"
+ item_color = "orange_skirt"
+
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
icon_state = "pink"
@@ -69,66 +123,133 @@
item_state = "p_suit"
item_color = "pink"
+/obj/item/clothing/under/skirt/color/pink
+ name = "pink jumpskirt"
+ icon_state = "pink_skirt"
+ item_state = "p_suit"
+ item_color = "pink_skirt"
+
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
item_color = "red"
+/obj/item/clothing/under/skirt/color/red
+ name = "red jumpskirt"
+ icon_state = "red_skirt"
+ item_state = "r_suit"
+ item_color = "red_skirt"
+
/obj/item/clothing/under/color/white
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
item_color = "white"
+/obj/item/clothing/under/skirt/color/white
+ name = "white jumpskirt"
+ icon_state = "white_skirt"
+ item_state = "w_suit"
+ item_color = "white_skirt"
+
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
item_color = "yellow"
+/obj/item/clothing/under/skirt/color/yellow
+ name = "yellow jumpskirt"
+ icon_state = "yellow_skirt"
+ item_state = "y_suit"
+ item_color = "yellow_skirt"
+
/obj/item/clothing/under/color/darkblue
name = "darkblue jumpsuit"
icon_state = "darkblue"
item_state = "b_suit"
item_color = "darkblue"
+/obj/item/clothing/under/skirt/color/darkblue
+ name = "darkblue jumpskirt"
+ icon_state = "darkblue_skirt"
+ item_state = "b_suit"
+ item_color = "darkblue_skirt"
+
/obj/item/clothing/under/color/teal
name = "teal jumpsuit"
icon_state = "teal"
item_state = "b_suit"
item_color = "teal"
+/obj/item/clothing/under/skirt/color/teal
+ name = "teal jumpskirt"
+ icon_state = "teal_skirt"
+ item_state = "b_suit"
+ item_color = "teal_skirt"
+
+
/obj/item/clothing/under/color/lightpurple
name = "purple jumpsuit"
icon_state = "lightpurple"
item_state = "p_suit"
item_color = "lightpurple"
+/obj/item/clothing/under/skirt/color/lightpurple
+ name = "lightpurple jumpskirt"
+ icon_state = "lightpurple_skirt"
+ item_state = "p_suit"
+ item_color = "lightpurple_skirt"
+
/obj/item/clothing/under/color/darkgreen
name = "darkgreen jumpsuit"
icon_state = "darkgreen"
item_state = "g_suit"
item_color = "darkgreen"
+/obj/item/clothing/under/skirt/color/darkgreen
+ name = "darkgreen jumpskirt"
+ icon_state = "darkgreen_skirt"
+ item_state = "g_suit"
+ item_color = "darkgreen_skirt"
+
/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
icon_state = "lightbrown"
item_state = "lb_suit"
item_color = "lightbrown"
+/obj/item/clothing/under/skirt/color/lightbrown
+ name = "lightbrown jumpskirt"
+ icon_state = "lightbrown_skirt"
+ item_state = "lb_suit"
+ item_color = "lightbrown_skirt"
+
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
icon_state = "brown"
item_state = "lb_suit"
item_color = "brown"
+/obj/item/clothing/under/skirt/color/brown
+ name = "brown jumpskirt"
+ icon_state = "brown_skirt"
+ item_state = "lb_suit"
+ item_color = "brown_skirt"
+
/obj/item/clothing/under/color/maroon
name = "maroon jumpsuit"
icon_state = "maroon"
item_state = "r_suit"
item_color = "maroon"
+/obj/item/clothing/under/skirt/color/maroon
+ name = "maroon jumpskirt"
+ icon_state = "maroon_skirt"
+ item_state = "r_suit"
+ item_color = "maroon_skirt"
+
/obj/item/clothing/under/color/rainbow
name = "rainbow jumpsuit"
desc = "A multi-colored jumpsuit!"
@@ -136,3 +257,11 @@
item_state = "rainbow"
item_color = "rainbow"
can_adjust = FALSE
+
+/obj/item/clothing/under/skirt/color/rainbow
+ name = "rainbow jumpskirt"
+ desc = "A multi-colored jumpskirt!"
+ icon_state = "rainbow_skirt"
+ item_state = "rainbow"
+ item_color = "rainbow_skirt"
+ can_adjust = FALSE
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 2288c98b34..c6796d64c9 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -16,6 +16,16 @@
item_color = "purplebartender"
can_adjust = FALSE
+/obj/item/clothing/under/rank/bartender/skirt
+ name = "bartender's skirt"
+ desc = "It looks like it could use some more flair."
+ icon_state = "barman_skirt"
+ item_state = "bar_suit"
+ item_color = "barman_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
name = "captain's jumpsuit"
@@ -25,6 +35,16 @@
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+/obj/item/clothing/under/rank/captain/skirt
+ name = "captain's jumpskirt"
+ desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"."
+ icon_state = "captain_skirt"
+ item_state = "b_suit"
+ item_color = "captain_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/cargo
name = "quartermaster's jumpsuit"
desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
@@ -32,6 +52,16 @@
item_state = "lb_suit"
item_color = "qm"
+/obj/item/clothing/under/rank/cargo/skirt
+ name = "quartermaster's jumpskirt"
+ desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
+ icon_state = "qm_skirt"
+ item_state = "lb_suit"
+ item_color = "qm_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/cargotech
name = "cargo technician's jumpsuit"
desc = "Shooooorts! They're comfy and easy to wear!"
@@ -42,6 +72,15 @@
mutantrace_variation = MUTANTRACE_VARIATION
alt_covers_chest = TRUE
+/obj/item/clothing/under/rank/cargotech/skirt
+ name = "cargo technician's jumpskirt"
+ desc = "Skiiiiirts! They're comfy and easy to wear"
+ icon_state = "cargo_skirt"
+ item_state = "lb_suit"
+ item_color = "cargo_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
/obj/item/clothing/under/rank/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
@@ -51,6 +90,16 @@
item_color = "chapblack"
can_adjust = FALSE
+/obj/item/clothing/under/rank/chaplain/skirt
+ name = "chaplain's jumpskirt"
+ desc = "It's a black jumpskirt, often worn by religious folk."
+ icon_state = "chapblack_skirt"
+ item_state = "bl_suit"
+ item_color = "chapblack_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/chef
name = "cook's suit"
desc = "A suit which is given only to the most hardcore cooks in space."
@@ -58,6 +107,15 @@
item_color = "chef"
alt_covers_chest = TRUE
+/obj/item/clothing/under/rank/chef/skirt
+ name = "cook's skirt"
+ desc = "A skirt which is given only to the most hardcore cooks in space."
+ icon_state = "chef_skirt"
+ item_color = "chef_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/clown
name = "clown suit"
desc = "'HONK!'"
@@ -66,7 +124,6 @@
item_color = "clown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/rank/blueclown
name = "blue clown suit"
desc = "'BLUE HONK!'"
@@ -130,7 +187,6 @@
/obj/item/clothing/under/rank/clown/Initialize()
. = ..()
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
-
/obj/item/clothing/under/rank/head_of_personnel
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
name = "head of personnel's jumpsuit"
@@ -139,6 +195,16 @@
item_color = "hop"
can_adjust = FALSE
+/obj/item/clothing/under/rank/head_of_personnel/skirt
+ name = "head of personnel's jumpskirt"
+ desc = "It's a jumpskirt worn by someone who works in the position of \"Head of Personnel\"."
+ icon_state = "hop_skirt"
+ item_state = "b_suit"
+ item_color = "hop_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/hydroponics
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
name = "botanist's jumpsuit"
@@ -147,6 +213,16 @@
item_color = "hydroponics"
permeability_coefficient = 0.5
+/obj/item/clothing/under/rank/hydroponics/skirt
+ name = "botanist's jumpskirt"
+ desc = "It's a jumpskirt designed to protect against minor plant-related hazards."
+ icon_state = "hydroponics_skirt"
+ item_state = "g_suit"
+ item_color = "hydroponics_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
@@ -154,49 +230,108 @@
item_color = "janitor"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+/obj/item/clothing/under/rank/janitor/skirt
+ name = "janitor's jumpskirt"
+ desc = "It's the official skirt of the station's janitor. It has minor protection from biohazards."
+ icon_state = "janitor_skirt"
+ item_color = "janitor_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer
desc = "Slick threads."
name = "Lawyer suit"
can_adjust = FALSE
-
/obj/item/clothing/under/lawyer/black
+ name = "lawyer black suit"
icon_state = "lawyer_black"
item_state = "lawyer_black"
item_color = "lawyer_black"
+/obj/item/clothing/under/lawyer/black/skirt
+ name = "lawyer black suitskirt"
+ icon_state = "lawyer_black_skirt"
+ item_state = "lawyer_black"
+ item_color = "lawyer_black_skirt"
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer/female
+ name = "female black suit"
icon_state = "black_suit_fem"
- item_state = "black_suit_fem"
+ item_state = "bl_suit"
item_color = "black_suit_fem"
/obj/item/clothing/under/lawyer/red
+ name = "lawyer red suit"
icon_state = "lawyer_red"
item_state = "lawyer_red"
item_color = "lawyer_red"
+/obj/item/clothing/under/lawyer/female/skirt
+ name = "female black suitskirt"
+ icon_state = "black_suit_fem_skirt"
+ item_state = "bl_suit"
+ item_color = "black_suit_fem_skirt"
+ fitted = FEMALE_UNIFORM_TOP
+
+/obj/item/clothing/under/lawyer/red/skirt
+ name = "lawyer red suitskirt"
+ icon_state = "lawyer_red_skirt"
+ item_state = "lawyer_red"
+ item_color = "lawyer_red_skirt"
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer/blue
+ name = "lawyer blue suit"
icon_state = "lawyer_blue"
item_state = "lawyer_blue"
item_color = "lawyer_blue"
+/obj/item/clothing/under/lawyer/blue/skirt
+ name = "lawyer blue suitskirt"
+ icon_state = "lawyer_blue_skirt"
+ item_state = "lawyer_blue"
+ item_color = "lawyer_blue_skirt"
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer/bluesuit
name = "blue suit"
desc = "A classy suit and tie."
icon_state = "bluesuit"
- item_state = "bluesuit"
+ item_state = "b_suit"
item_color = "bluesuit"
can_adjust = TRUE
alt_covers_chest = TRUE
+/obj/item/clothing/under/lawyer/bluesuit/skirt
+ name = "blue suitskirt"
+ desc = "A classy suitskirt and tie."
+ icon_state = "bluesuit_skirt"
+ item_state = "b_suit"
+ item_color = "bluesuit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer/purpsuit
name = "purple suit"
icon_state = "lawyer_purp"
- item_state = "lawyer_purp"
+ item_state = "p_suit"
item_color = "lawyer_purp"
fitted = NO_FEMALE_UNIFORM
can_adjust = TRUE
alt_covers_chest = TRUE
+/obj/item/clothing/under/lawyer/purpsuit/skirt
+ name = "purple suitskirt"
+ icon_state = "lawyer_purp_skirt"
+ item_state = "p_suit"
+ item_color = "lawyer_purp_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/lawyer/blacksuit
name = "black suit"
desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
@@ -206,6 +341,16 @@
can_adjust = TRUE
alt_covers_chest = TRUE
+/obj/item/clothing/under/lawyer/blacksuit/skirt
+ name = "black suitskirt"
+ desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
+ icon_state = "blacksuit_skirt"
+ item_state = "bar_suit"
+ item_color = "blacksuit_skirt"
+ can_adjust = FALSE
+ alt_covers_chest = TRUE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/curator
name = "sensible suit"
desc = "It's very... sensible."
@@ -214,6 +359,33 @@
item_color = "red_suit"
can_adjust = FALSE
+/obj/item/clothing/under/lawyer/really_black
+ name = "executive suit"
+ desc = "A formal black suit and red tie, intended for the station's finest."
+ icon_state = "really_black_suit"
+ item_state = "bl_suit"
+ item_color = "really_black_suit"
+
+/obj/item/clothing/under/lawyer/really_black/skirt
+ name = "executive suitskirt"
+ desc = "A formal black suitskirt and red tie, intended for the station's finest."
+ icon_state = "really_black_suit_skirt"
+ item_state = "bl_suit"
+ item_color = "really_black_suit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
+/obj/item/clothing/under/rank/curator/skirt
+ name = "sensible suitskirt"
+ desc = "It's very... sensible."
+ icon_state = "red_suit_skirt"
+ item_state = "red_suit"
+ item_color = "red_suit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/curator/treasure_hunter
name = "treasure hunter uniform"
desc = "A rugged uniform suitable for treasure hunting."
@@ -228,13 +400,22 @@
item_state = "mime"
item_color = "mime"
+/obj/item/clothing/under/rank/mime/skirt
+ name = "mime's skirt"
+ desc = "It's not very colourful."
+ icon_state = "mime_skirt"
+ item_state = "mime"
+ item_color = "mime_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/miner
desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty."
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
item_color = "miner"
-
/obj/item/clothing/under/rank/miner/lavaland
desc = "A green uniform for operating in hazardous environments."
name = "shaft miner's jumpsuit"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 4ee0963a64..f65b05c280 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -8,6 +8,16 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 80, "acid" = 40)
resistance_flags = NONE
+/obj/item/clothing/under/rank/chief_engineer/skirt
+ name = "chief engineer's jumpskirt"
+ desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has minor radiation shielding."
+ icon_state = "chief_skirt"
+ item_state = "gy_suit"
+ item_color = "chief_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
name = "atmospheric technician's jumpsuit"
@@ -16,6 +26,16 @@
item_color = "atmos"
resistance_flags = NONE
+/obj/item/clothing/under/rank/atmospheric_technician/skirt
+ name = "atmospheric technician's jumpskirt"
+ desc = "It's a jumpskirt worn by atmospheric technicians."
+ icon_state = "atmos_skirt"
+ item_state = "atmos_suit"
+ item_color = "atmos_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
name = "engineer's jumpsuit"
@@ -24,6 +44,23 @@
item_color = "engine"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 60, "acid" = 20)
resistance_flags = NONE
+/obj/item/clothing/under/rank/engineer/hazard
+ name = "engineer's hazard jumpsuit"
+ desc = "A high visibility jumpsuit made from heat and radiation resistant materials."
+ icon_state = "hazard"
+ item_state = "suit-orange"
+ item_color = "hazard"
+ alt_covers_chest = TRUE
+
+/obj/item/clothing/under/rank/engineer/skirt
+ name = "engineer's jumpskirt"
+ desc = "It's an orange high visibility jumpskirt worn by engineers."
+ icon_state = "engine_skirt"
+ item_state = "engi_suit"
+ item_color = "engine_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
@@ -31,4 +68,14 @@
icon_state = "robotics"
item_state = "robotics"
item_color = "robotics"
- resistance_flags = NONE
\ No newline at end of file
+ resistance_flags = NONE
+
+/obj/item/clothing/under/rank/roboticist/skirt
+ name = "roboticist's jumpskirt"
+ desc = "It's a slimming black with reinforced seams; great for industrial work."
+ icon_state = "robotics_skirt"
+ item_state = "robotics"
+ item_color = "robotics_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index f0980cae4d..7b7a205021 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -10,6 +10,16 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 35)
can_adjust = FALSE
+/obj/item/clothing/under/rank/research_director/skirt
+ name = "research director's vest suitskirt"
+ desc = "It's a suitskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
+ icon_state = "director_skirt"
+ item_state = "lb_suit"
+ item_color = "director_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/research_director/alt
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
name = "research director's tan suit"
@@ -20,6 +30,16 @@
can_adjust = TRUE
alt_covers_chest = TRUE
+/obj/item/clothing/under/rank/research_director/alt/skirt
+ name = "research director's tan suitskirt"
+ desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
+ icon_state = "rdwhimsy_skirt"
+ item_state = "rdwhimsy"
+ item_color = "rdwhimsy_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/research_director/turtleneck
desc = "A dark purple turtleneck and tan khakis, for a director with a superior sense of style."
name = "research director's turtleneck"
@@ -30,6 +50,16 @@
can_adjust = TRUE
alt_covers_chest = TRUE
+/obj/item/clothing/under/rank/research_director/turtleneck/skirt
+ name = "research director's turtleneck skirt"
+ desc = "A dark purple turtleneck and tan khaki skirt, for a director with a superior sense of style."
+ icon_state = "rdturtle_skirt"
+ item_state = "p_suit"
+ item_color = "rdturtle_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/scientist
desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
name = "scientist's jumpsuit"
@@ -39,6 +69,15 @@
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+/obj/item/clothing/under/rank/scientist/skirt
+ name = "scientist's jumpskirt"
+ desc = "It's made of a special fiber that provides minor protection against explosives. It has markings that denote the wearer as a scientist."
+ icon_state = "toxinswhite_skirt"
+ item_state = "w_suit"
+ item_color = "toxinswhite_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
@@ -49,6 +88,16 @@
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 50, "acid" = 65)
+/obj/item/clothing/under/rank/chemist/skirt
+ name = "chemist's jumpskirt"
+ desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
+ icon_state = "chemistrywhite_skirt"
+ item_state = "w_suit"
+ item_color = "chemistrywhite_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/*
* Medical
*/
@@ -61,6 +110,16 @@
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+/obj/item/clothing/under/rank/chief_medical_officer/skirt
+ name = "chief medical officer's jumpskirt"
+ desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
+ icon_state = "cmo_skirt"
+ item_state = "w_suit"
+ item_color = "cmo_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
name = "geneticist's jumpsuit"
@@ -70,6 +129,16 @@
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+/obj/item/clothing/under/rank/geneticist/skirt
+ name = "geneticist's jumpskirt"
+ desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
+ icon_state = "geneticswhite_skirt"
+ item_state = "w_suit"
+ item_color = "geneticswhite_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
name = "virologist's jumpsuit"
@@ -79,6 +148,16 @@
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+/obj/item/clothing/under/rank/virologist/skirt
+ name = "virologist's jumpskirt"
+ desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
+ icon_state = "virologywhite_skirt"
+ item_state = "w_suit"
+ item_color = "virologywhite_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
name = "nurse's suit"
@@ -90,7 +169,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
-
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
name = "medical doctor's jumpsuit"
@@ -99,24 +177,31 @@
item_color = "medical"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
-
/obj/item/clothing/under/rank/medical/blue
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_color = "scrubsblue"
can_adjust = FALSE
-
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
item_color = "scrubsgreen"
can_adjust = FALSE
-
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
item_color = "scrubspurple"
can_adjust = FALSE
+
+/obj/item/clothing/under/rank/medical/skirt
+ name = "medical doctor's jumpskirt"
+ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
+ icon_state = "medical_skirt"
+ item_state = "w_suit"
+ item_color = "medical_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 6f9e77b09f..6c00d6969c 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -4,11 +4,9 @@
* Detective
* Navy uniforms
*/
-
/*
* Security
*/
-
/obj/item/clothing/under/rank/security
name = "security jumpsuit"
desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle."
@@ -20,14 +18,12 @@
alt_covers_chest = TRUE
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
-
/obj/item/clothing/under/rank/security/grey
name = "grey security jumpsuit"
desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
icon_state = "security"
item_state = "gy_suit"
item_color = "security"
-
/obj/item/clothing/under/rank/security/skirt
name = "security jumpskirt"
desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt."
@@ -36,6 +32,7 @@
item_color = "secskirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE //you know now that i think of it if you adjust the skirt and the sprite disappears isn't that just like flashing everyone
+ fitted = FEMALE_UNIFORM_TOP
/obj/item/clothing/under/rank/warden
@@ -49,7 +46,6 @@
alt_covers_chest = TRUE
sensor_mode = 3
random_sensor = FALSE
-
/obj/item/clothing/under/rank/warden/grey
name = "grey security suit"
desc = "A formal relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
@@ -57,6 +53,16 @@
item_state = "gy_suit"
item_color = "warden"
+/obj/item/clothing/under/rank/warden/skirt
+ name = "warden's suitskirt"
+ desc = "A formal security suitskirt for officers complete with Nanotrasen belt buckle."
+ icon_state = "rwarden_skirt"
+ item_state = "r_suit"
+ item_color = "rwarden_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/*
* Detective
*/
@@ -72,6 +78,16 @@
sensor_mode = 3
random_sensor = FALSE
+/obj/item/clothing/under/rank/det/skirt
+ name = "detective's suitskirt"
+ desc = "Someone who wears this means business."
+ icon_state = "detective_skirt"
+ item_state = "det"
+ item_color = "detective_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/det/grey
name = "noir suit"
desc = "A hard-boiled private investigator's grey suit, complete with tie clip."
@@ -80,6 +96,16 @@
item_color = "greydet"
alt_covers_chest = TRUE
+/obj/item/clothing/under/rank/det/grey/skirt
+ name = "noir suitskirt"
+ desc = "A hard-boiled private investigator's grey suitskirt, complete with tie clip."
+ icon_state = "greydet_skirt"
+ item_state = "greydet"
+ item_color = "greydet_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/*
* Head of Security
*/
@@ -95,13 +121,22 @@
sensor_mode = 3
random_sensor = FALSE
+/obj/item/clothing/under/rank/head_of_security/skirt
+ name = "head of security's jumpskirt"
+ desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Head of Security."
+ icon_state = "rhos_skirt"
+ item_state = "r_suit"
+ item_color = "rhos_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/head_of_security/grey
name = "head of security's grey jumpsuit"
desc = "There are old men, and there are bold men, but there are very few old, bold men."
icon_state = "hos"
item_state = "gy_suit"
item_color = "hos"
-
/obj/item/clothing/under/rank/head_of_security/alt
name = "head of security's turtleneck"
desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants."
@@ -109,10 +144,19 @@
item_state = "bl_suit"
item_color = "hosalt"
+/obj/item/clothing/under/rank/head_of_security/alt/skirt
+ name = "head of security's turtleneck skirt"
+ desc = "A stylish alternative to the normal head of security jumpsuit, complete with a tactical skirt."
+ icon_state = "hosalt_skirt"
+ item_state = "bl_suit"
+ item_color = "hosalt_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/*
* Navy uniforms
*/
-
/obj/item/clothing/under/rank/security/navyblue
name = "security officer's formal uniform"
desc = "The latest in fashionable security outfits."
@@ -120,7 +164,6 @@
item_state = "officerblueclothes"
item_color = "officerblueclothes"
alt_covers_chest = TRUE
-
/obj/item/clothing/under/rank/head_of_security/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security."
name = "head of security's formal uniform"
@@ -128,7 +171,6 @@
item_state = "hosblueclothes"
item_color = "hosblueclothes"
alt_covers_chest = TRUE
-
/obj/item/clothing/under/rank/warden/navyblue
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
name = "warden's formal uniform"
@@ -136,11 +178,9 @@
item_state = "wardenblueclothes"
item_color = "wardenblueclothes"
alt_covers_chest = TRUE
-
/*
*Blueshirt
*/
-
/obj/item/clothing/under/rank/security/blueshirt
name = "blue shirt and tie"
desc = "I'm a little busy right now, Calhoun."
@@ -148,3 +188,13 @@
item_state = "blueshift"
item_color = "blueshift"
can_adjust = FALSE
+/*
+ *Spacepol
+ */
+/obj/item/clothing/under/rank/security/spacepol
+ name = "police uniform"
+ desc = "Space not controlled by megacorporations, planets, or pirates is under the jurisdiction of Spacepol."
+ icon_state = "spacepol"
+ item_state = "spacepol"
+ item_color = "spacepol"
+ can_adjust = FALSE
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 16848e393a..616c00b6c1 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -5,7 +5,6 @@
item_color = "red_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
-
/obj/item/clothing/under/pj/blue
name = "blue pj's"
desc = "Sleepwear."
@@ -13,7 +12,6 @@
item_color = "blue_pyjamas"
item_state = "w_suit"
can_adjust = FALSE
-
/obj/item/clothing/under/patriotsuit
name = "Patriotic Suit"
desc = "Motorcycle not included."
@@ -21,7 +19,6 @@
item_state = "ek"
item_color = "ek"
can_adjust = FALSE
-
/obj/item/clothing/under/scratch
name = "white suit"
desc = "A white suit, suitable for an excellent host."
@@ -30,13 +27,22 @@
item_color = "scratch"
can_adjust = FALSE
+/obj/item/clothing/under/scratch/skirt
+ name = "white suitskirt"
+ desc = "A white suitskirt, suitable for an excellent host."
+ icon_state = "white_suit_skirt"
+ item_state = "scratch"
+ item_color = "white_suit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/sl_suit
desc = "It's a very amish looking suit."
name = "amish suit"
icon_state = "sl_suit"
item_color = "sl_suit"
can_adjust = FALSE
-
/obj/item/clothing/under/roman
name = "\improper Roman armor"
desc = "Ancient Roman armor. Made of metallic and leather straps."
@@ -46,7 +52,6 @@
can_adjust = FALSE
strip_delay = 100
resistance_flags = NONE
-
/obj/item/clothing/under/waiter
name = "waiter's outfit"
desc = "It's a very smart uniform with a special pocket for tip."
@@ -54,7 +59,6 @@
item_state = "waiter"
item_color = "waiter"
can_adjust = FALSE
-
/obj/item/clothing/under/rank/prisoner
name = "prison jumpsuit"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
@@ -65,20 +69,28 @@
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+/obj/item/clothing/under/rank/prisoner/skirt
+ name = "prison jumpskirt"
+ desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
+ icon_state = "prisoner_skirt"
+ item_state = "o_suit"
+ item_color = "prisoner_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/rank/mailman
name = "mailman's jumpsuit"
desc = "'Special delivery!'"
icon_state = "mailman"
item_state = "b_suit"
item_color = "mailman"
-
/obj/item/clothing/under/rank/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
item_state = "p_suit"
item_color = "psyche"
-
/obj/item/clothing/under/rank/clown/sexy
name = "sexy-clown suit"
desc = "It makes you look HONKable!"
@@ -86,7 +98,6 @@
item_state = "sexyclown"
item_color = "sexyclown"
can_adjust = FALSE
-
/obj/item/clothing/under/jabroni
name = "Jabroni Outfit"
desc = "The leather club is two sectors down."
@@ -94,7 +105,6 @@
item_state = "darkholme"
item_color = "darkholme"
can_adjust = FALSE
-
/obj/item/clothing/under/rank/vice
name = "vice officer's jumpsuit"
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
@@ -102,7 +112,6 @@
item_state = "gy_suit"
item_color = "vice"
can_adjust = FALSE
-
/obj/item/clothing/under/rank/centcom_officer
desc = "It's a jumpsuit worn by CentCom Officers."
name = "\improper CentCom officer's jumpsuit"
@@ -110,14 +119,12 @@
item_state = "g_suit"
item_color = "officer"
alt_covers_chest = TRUE
-
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders."
name = "\improper CentCom officer's jumpsuit"
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
-
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -134,7 +141,6 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = NONE
-
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
icon_state = "syndicate"
@@ -151,28 +157,24 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
-
/obj/item/clothing/under/owl
name = "owl uniform"
desc = "A soft brown jumpsuit made of synthetic feathers and strong conviction."
icon_state = "owl"
item_color = "owl"
can_adjust = FALSE
-
/obj/item/clothing/under/griffin
name = "griffon uniform"
desc = "A soft brown jumpsuit with a white feather collar made of synthetic feathers and a lust for mayhem."
icon_state = "griffin"
item_color = "griffin"
can_adjust = FALSE
-
/obj/item/clothing/under/cloud
name = "cloud"
desc = "cloud"
icon_state = "cloud"
item_color = "cloud"
can_adjust = FALSE
-
/obj/item/clothing/under/gimmick/rank/captain/suit
name = "captain's suit"
desc = "A green suit and yellow necktie. Exemplifies authority."
@@ -181,6 +183,16 @@
item_color = "green_suit"
can_adjust = FALSE
+/obj/item/clothing/under/gimmick/rank/captain/suit/skirt
+ name = "green suitskirt"
+ desc = "A green suitskirt and yellow necktie. Exemplifies authority."
+ icon_state = "green_suit_skirt"
+ item_state = "dg_suit"
+ item_color = "green_suit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit
name = "head of personnel's suit"
desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble."
@@ -189,6 +201,16 @@
item_color = "teal_suit"
can_adjust = FALSE
+/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt
+ name = "teal suitskirt"
+ desc = "A teal suitskirt and yellow necktie. An authoritative yet tacky ensemble."
+ icon_state = "teal_suit_skirt"
+ item_state = "g_suit"
+ item_color = "teal_suit_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/suit_jacket
name = "black suit"
desc = "A black suit and red tie. Very formal."
@@ -196,21 +218,18 @@
item_state = "bl_suit"
item_color = "black_suit"
can_adjust = FALSE
-
/obj/item/clothing/under/suit_jacket/really_black
name = "executive suit"
desc = "A formal black suit and red tie, intended for the station's finest."
icon_state = "really_black_suit"
item_state = "bl_suit"
- item_color = "black_suit"
-
+ item_color = "really_black_suit"
/obj/item/clothing/under/suit_jacket/female
name = "executive suit"
desc = "A formal trouser suit for women, intended for the station's finest."
icon_state = "black_suit_fem"
item_state = "black_suit_fem"
item_color = "black_suit_fem"
-
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
@@ -218,56 +237,48 @@
item_state = "dg_suit"
item_color = "green_suit"
can_adjust = FALSE
-
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
icon_state = "red_suit"
item_state = "r_suit"
item_color = "red_suit"
-
/obj/item/clothing/under/suit_jacket/charcoal
name = "charcoal suit"
desc = "A charcoal suit and red tie. Very professional."
icon_state = "charcoal_suit"
item_state = "charcoal_suit"
item_color = "charcoal_suit"
-
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
desc = "A navy suit and red tie, intended for the station's finest."
icon_state = "navy_suit"
item_state = "navy_suit"
item_color = "navy_suit"
-
/obj/item/clothing/under/suit_jacket/burgundy
name = "burgundy suit"
desc = "A burgundy suit and black tie. Somewhat formal."
icon_state = "burgundy_suit"
item_state = "burgundy_suit"
item_color = "burgundy_suit"
-
/obj/item/clothing/under/suit_jacket/checkered
name = "checkered suit"
desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
icon_state = "checkered_suit"
item_state = "checkered_suit"
item_color = "checkered_suit"
-
/obj/item/clothing/under/suit_jacket/tan
name = "tan suit"
desc = "A tan suit with a yellow tie. Smart, but casual."
icon_state = "tan_suit"
item_state = "tan_suit"
item_color = "tan_suit"
-
/obj/item/clothing/under/suit_jacket/white
name = "white suit"
desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!"
icon_state = "white_suit"
item_state = "white_suit"
item_color = "white_suit"
-
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
@@ -275,7 +286,6 @@
item_state = "burial"
item_color = "burial"
has_sensor = NO_SENSORS
-
/obj/item/clothing/under/skirt/black
name = "black skirt"
desc = "A black skirt, very fancy!"
@@ -284,7 +294,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/skirt/blue
name = "blue skirt"
desc = "A blue, casual skirt."
@@ -294,7 +303,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/skirt/red
name = "red skirt"
desc = "A red, casual skirt."
@@ -304,7 +312,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/skirt/purple
name = "purple skirt"
desc = "A purple, casual skirt."
@@ -314,8 +321,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
-
/obj/item/clothing/under/schoolgirl
name = "blue schoolgirl uniform"
desc = "It's just like one of my Japanese animes!"
@@ -325,25 +330,21 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/schoolgirl/red
name = "red schoolgirl uniform"
icon_state = "schoolgirlred"
item_state = "schoolgirlred"
item_color = "schoolgirlred"
-
/obj/item/clothing/under/schoolgirl/green
name = "green schoolgirl uniform"
icon_state = "schoolgirlgreen"
item_state = "schoolgirlgreen"
item_color = "schoolgirlgreen"
-
/obj/item/clothing/under/schoolgirl/orange
name = "orange schoolgirl uniform"
icon_state = "schoolgirlorange"
item_state = "schoolgirlorange"
item_color = "schoolgirlorange"
-
/obj/item/clothing/under/overalls
name = "laborer's overalls"
desc = "A set of durable overalls for getting the job done."
@@ -351,7 +352,6 @@
item_state = "lb_suit"
item_color = "overalls"
can_adjust = FALSE
-
/obj/item/clothing/under/pirate
name = "pirate outfit"
desc = "Yarr."
@@ -359,7 +359,6 @@
item_state = "pirate"
item_color = "pirate"
can_adjust = FALSE
-
/obj/item/clothing/under/soviet
name = "soviet uniform"
desc = "For the Motherland!"
@@ -367,7 +366,6 @@
item_state = "soviet"
item_color = "soviet"
can_adjust = FALSE
-
/obj/item/clothing/under/redcoat
name = "redcoat uniform"
desc = "Looks old."
@@ -375,7 +373,6 @@
item_state = "redcoat"
item_color = "redcoat"
can_adjust = FALSE
-
/obj/item/clothing/under/kilt
name = "kilt"
desc = "Includes shoes and plaid."
@@ -385,7 +382,6 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/kilt/highlander
desc = "You're the only one worthy of this kilt."
@@ -402,7 +398,6 @@
body_parts_covered = CHEST|GROIN|LEGS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/gladiator
name = "gladiator uniform"
desc = "Are you not entertained? Is that not why you are here?"
@@ -413,11 +408,9 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
-
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = NO_SENSORS
-
/obj/item/clothing/under/sundress
name = "sundress"
desc = "Makes you want to frolic in a field of daisies."
@@ -427,7 +420,6 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/captainparade
name = "captain's parade uniform"
desc = "A captain's luxury-wear, for special occasions."
@@ -435,7 +427,6 @@
item_state = "by_suit"
item_color = "captain_parade"
can_adjust = FALSE
-
/obj/item/clothing/under/hosparademale
name = "head of security's parade uniform"
desc = "A male head of security's luxury-wear, for special occasions."
@@ -443,7 +434,6 @@
item_state = "r_suit"
item_color = "hos_parade_male"
can_adjust = FALSE
-
/obj/item/clothing/under/hosparadefem
name = "head of security's parade uniform"
desc = "A female head of security's luxury-wear, for special occasions."
@@ -452,7 +442,6 @@
item_color = "hos_parade_fem"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/assistantformal
name = "assistant's formal uniform"
desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
@@ -460,7 +449,6 @@
item_state = "gy_suit"
item_color = "assistant_formal"
can_adjust = FALSE
-
/obj/item/clothing/under/blacktango
name = "black tango dress"
desc = "Filled with Latin fire."
@@ -469,8 +457,6 @@
item_color = "black_tango"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
- body_parts_covered = CHEST|GROIN
-
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
@@ -480,7 +466,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_FULL
can_adjust = FALSE
-
/obj/item/clothing/under/sailordress
name = "sailor dress"
desc = "Formal wear for a leading lady."
@@ -490,7 +475,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
@@ -499,7 +483,6 @@
item_color = "red_evening_gown"
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/maid
name = "maid costume"
desc = "Maid in China."
@@ -509,12 +492,10 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/maid/Initialize()
. = ..()
var/obj/item/clothing/accessory/maidapron/A = new (src)
attach_accessory(A)
-
/obj/item/clothing/under/janimaid
name = "maid uniform"
desc = "A simple maid uniform for housekeeping."
@@ -524,7 +505,6 @@
body_parts_covered = CHEST|GROIN
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/plaid_skirt
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
@@ -534,7 +514,6 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
-
/obj/item/clothing/under/plaid_skirt/blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
@@ -544,7 +523,6 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
-
/obj/item/clothing/under/plaid_skirt/purple
name = "purple plaid skirt"
desc = "A preppy purple skirt with a white blouse."
@@ -554,7 +532,6 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
-
/obj/item/clothing/under/singery
name = "yellow performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -565,7 +542,6 @@
fitted = NO_FEMALE_UNIFORM
alternate_worn_layer = ABOVE_SHOES_LAYER
can_adjust = FALSE
-
/obj/item/clothing/under/singerb
name = "blue performer's outfit"
desc = "Just looking at this makes you want to sing."
@@ -576,7 +552,6 @@
alternate_worn_layer = ABOVE_SHOES_LAYER
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
-
/obj/item/clothing/under/plaid_skirt/green
name = "green plaid skirt"
desc = "A preppy green skirt with a white blouse."
@@ -586,17 +561,14 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = TRUE
alt_covers_chest = TRUE
-
/obj/item/clothing/under/jester
name = "jester suit"
desc = "A jolly dress, well suited to entertain your master, nuncle."
icon_state = "jester"
item_color = "jester"
can_adjust = FALSE
-
/obj/item/clothing/under/jester/alt
icon_state = "jester2"
-
/obj/item/clothing/under/geisha
name = "geisha suit"
desc = "Cute space ninja senpai not included."
@@ -604,14 +576,12 @@
item_color = "geisha"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
-
/obj/item/clothing/under/villain
name = "villain suit"
desc = "A change of wardrobe is necessary if you ever want to catch a real superhero."
icon_state = "villain"
item_color = "villain"
can_adjust = FALSE
-
/obj/item/clothing/under/sailor
name = "sailor suit"
desc = "Skipper's in the wardroom drinkin gin'."
@@ -619,7 +589,6 @@
item_state = "b_suit"
item_color = "sailor"
can_adjust = FALSE
-
/obj/item/clothing/under/plasmaman
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
@@ -633,17 +602,12 @@
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 5
-
-
/obj/item/clothing/under/plasmaman/examine(mob/user)
..()
to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit.")
-
-
/obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
-
if(H.on_fire)
if(extinguishes_left)
if(next_extinguish > world.time)
@@ -654,7 +618,6 @@
H.ExtinguishMob()
new /obj/effect/particle_effect/water(get_turf(H))
return 0
-
/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params)
..()
if (istype(E, /obj/item/extinguisher_refill))
@@ -668,20 +631,17 @@
return
return
return
-
/obj/item/extinguisher_refill
name = "envirosuit extinguisher cartridge"
desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits."
icon_state = "plasmarefill"
icon = 'icons/obj/device.dmi'
-
/obj/item/clothing/under/rank/security/navyblue/russian
name = "\improper Russian officer's uniform"
desc = "The latest in fashionable russian outfits."
icon_state = "hostanclothes"
item_state = "hostanclothes"
item_color = "hostanclothes"
-
/obj/item/clothing/under/mummy
name = "mummy wrapping"
desc = "Return the slab or suffer my stale references."
@@ -692,7 +652,6 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
-
/obj/item/clothing/under/scarecrow
name = "scarecrow clothes"
desc = "Perfect camouflage for hiding in botany."
@@ -703,7 +662,6 @@
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
resistance_flags = NONE
-
/obj/item/clothing/under/draculass
name = "draculass coat"
desc = "A dress inspired by the ancient \"Victorian\" era."
@@ -713,8 +671,6 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
- mutantrace_variation = NO_MUTANTRACE_VARIATION
-
/obj/item/clothing/under/drfreeze
name = "doctor freeze's jumpsuit"
desc = "A modified scientist jumpsuit to look extra cool."
@@ -722,8 +678,6 @@
item_state = "drfreeze"
item_color = "drfreeze"
can_adjust = FALSE
- mutantrace_variation = NO_MUTANTRACE_VARIATION
-
/obj/item/clothing/under/lobster
name = "foam lobster suit"
desc = "Who beheaded the college mascot?"
@@ -732,8 +686,6 @@
item_color = "lobster"
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
- mutantrace_variation = NO_MUTANTRACE_VARIATION
-
/obj/item/clothing/under/gondola
name = "gondola hide suit"
desc = "Now you're cooking."
@@ -741,7 +693,6 @@
item_state = "lb_suit"
item_color = "gondola"
can_adjust = FALSE
-
/obj/item/clothing/under/skeleton
name = "skeleton jumpsuit"
desc = "A black jumpsuit with a white bone pattern printed on it. Spooky!"
@@ -758,4 +709,23 @@
desc = "A simple, inconspicuous harness replacement for a jumpsuit."
icon_state = "gear_harness"
item_state = "gear_harness" //We dont use golem do to being a item, item without faces making it default to error suit sprites.
- body_parts_covered = CHEST|GROIN
\ No newline at end of file
+ body_parts_covered = CHEST|GROIN
+
+/obj/item/clothing/under/durathread
+ name = "durathread jumpsuit"
+ desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
+ icon_state = "durathread"
+ item_state = "durathread"
+ item_color = "durathread"
+ can_adjust = TRUE
+ armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
+
+/obj/item/clothing/under/duraskirt
+ name = "durathread jumpskirt"
+ desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer. Being a short skirt, it naturally doesn't protect the legs."
+ icon_state = "duraskirt"
+ item_state = "duraskirt"
+ item_color = "durathread"
+ can_adjust = FALSE
+ body_parts_covered = CHEST|GROIN|ARMS
+ armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5)
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index 83cab9d992..9893edf248 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -8,6 +8,17 @@
armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
alt_covers_chest = TRUE
+/obj/item/clothing/under/syndicate/skirt
+ name = "tactical skirtleneck"
+ desc = "A non-descript and slightly suspicious looking skirtleneck."
+ icon_state = "syndicate_skirt"
+ item_state = "bl_suit"
+ item_color = "syndicate_skirt"
+ has_sensor = NO_SENSORS
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ alt_covers_chest = TRUE
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
@@ -16,6 +27,15 @@
item_color = "tactifool"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+/obj/item/clothing/under/syndicate/tacticool/skirt
+ name = "tacticool skirtleneck"
+ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
+ icon_state = "tactifool_skirt"
+ item_state = "bl_suit"
+ item_color = "tactifool_skirt"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40)
+ fitted = FEMALE_UNIFORM_TOP
+
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
desc = "A double seamed tactical turtleneck disguised as a civilian grade silk suit. Intended for the most formal operator. The collar is really sharp."
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 3e96512bb8..0fb46c3e46 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -317,6 +317,8 @@
var/list/cant_craft = list()
for(var/rec in GLOB.crafting_recipes)
var/datum/crafting_recipe/R = rec
+ if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this.
+ continue
if((R.category != cur_category) || (R.subcategory != cur_subcategory))
continue
if(check_contents(R, surroundings))
@@ -431,3 +433,10 @@
data["tool_text"] = tool_text
return data
+
+//Mind helpers
+
+/datum/mind/proc/teach_crafting_recipe(R)
+ if(!learned_recipes)
+ learned_recipes = list()
+ learned_recipes |= R
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm
index 3fa4247f57..6cdfe58cd3 100644
--- a/code/modules/hydroponics/grown/cotton.dm
+++ b/code/modules/hydroponics/grown/cotton.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/obj/item/seeds/cotton
name = "pack of cotton seeds"
desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
@@ -76,4 +77,84 @@
throw_range = 3
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
cotton_type = /obj/item/stack/sheet/cotton/durathread
+=======
+/obj/item/seeds/cotton
+ name = "pack of cotton seeds"
+ desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
+ icon_state = "seed-cotton"
+ species = "cotton"
+ plantname = "Cotton"
+ icon_harvest = "cotton-harvest"
+ product = /obj/item/grown/cotton
+ lifespan = 35
+ endurance = 25
+ maturation = 15
+ production = 1
+ yield = 2
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ icon_dead = "cotton-dead"
+ mutatelist = list(/obj/item/seeds/cotton/durathread)
+
+/obj/item/grown/cotton
+ seed = /obj/item/seeds/cotton
+ name = "cotton bundle"
+ desc = "A fluffy bundle of cotton."
+ icon_state = "cotton"
+ force = 0
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 2
+ throw_range = 3
+ attack_verb = list("pomfed")
+ var/cotton_type = /obj/item/stack/sheet/cotton
+ var/cotton_name = "raw cotton"
+
+/obj/item/grown/cotton/attack_self(mob/user)
+ user.show_message("You pull some [cotton_name] out of the [name]!", 1)
+ var/seed_modifier = 0
+ if(seed)
+ seed_modifier = round(seed.potency / 25)
+ var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
+ var/old_cotton_amount = cotton.amount
+ for(var/obj/item/stack/ST in user.loc)
+ if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
+ ST.attackby(cotton, user)
+ if(cotton.amount > old_cotton_amount)
+ to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].")
+ qdel(src)
+
+//reinforced mutated variant
+/obj/item/seeds/cotton/durathread
+ name = "pack of durathread seeds"
+ desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
+ icon_state = "seed-durathread"
+ species = "durathread"
+ plantname = "Durathread"
+ icon_harvest = "durathread-harvest"
+ product = /obj/item/grown/cotton/durathread
+ lifespan = 80
+ endurance = 50
+ maturation = 15
+ production = 1
+ yield = 2
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ icon_dead = "cotton-dead"
+
+/obj/item/grown/cotton/durathread
+ seed = /obj/item/seeds/cotton/durathread
+ name = "durathread bundle"
+ desc = "A tough bundle of durathread, good luck unraveling this."
+ icon_state = "durathread"
+ force = 5
+ throwforce = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 2
+ throw_range = 3
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ cotton_type = /obj/item/stack/sheet/cotton/durathread
+>>>>>>> upstream/master
cotton_name = "raw durathread"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index 8b815e9459..9c64b214c1 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -69,11 +69,7 @@
L.Insert(C)
to_chat(C, "You feel your lungs reform in your chest.")
holder.remove_reagent(src.id, "10")
-
-<<<<<<< HEAD
-=======
C.adjustOxyLoss(-3)
->>>>>>> upstream/master
..()
/datum/reagent/fermi/yamerol/reaction_mob(var/mob/living/L)