diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm
index e15eda336c..e9f314cd1a 100644
--- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm
+++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm
@@ -2718,7 +2718,7 @@ wt
av
kA
qo
-EL
+MP
MP
MP
Cb
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index e6eddb2777..75af28d174 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -8268,6 +8268,9 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"apf" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -37512,12 +37515,12 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bvb" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 8
- },
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel/dark/corner,
/area/hallway/primary/starboard)
"bvc" = (
@@ -37581,10 +37584,10 @@
/turf/open/floor/circuit/green,
/area/ai_monitored/turret_protected/ai)
"bvg" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/effect/landmark/blobstart,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"bvh" = (
@@ -38444,33 +38447,36 @@
dir = 4;
pixel_x = -23
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/hallway/primary/starboard)
"bxa" = (
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bxb" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
- },
/obj/machinery/light{
dir = 4
},
@@ -38498,8 +38504,8 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bxf" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
},
/turf/closed/wall,
/area/engine/atmos)
@@ -39190,6 +39196,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39198,6 +39207,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner,
/area/hallway/primary/starboard)
"byR" = (
@@ -39205,21 +39217,19 @@
name = "Station Intercom (General)";
pixel_x = -30
},
-/obj/item/crowbar/red,
-/obj/item/wrench,
-/obj/item/clothing/mask/gas,
/obj/machinery/airalarm{
pixel_y = 23
},
-/obj/structure/table,
-/obj/item/storage/box,
-/obj/item/storage/box,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/computer/atmos_alert,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39231,10 +39241,13 @@
/obj/machinery/light{
dir = 1
},
-/obj/machinery/computer/atmos_alert,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/computer/station_alert,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39248,10 +39261,13 @@
/obj/machinery/camera{
c_tag = "Atmospherics - Control Room"
},
-/obj/machinery/computer/station_alert,
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -39265,54 +39281,44 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/structure/closet/secure_closet/atmospherics,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/engine/atmos)
"byV" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/firealarm{
+ pixel_y = 24
+ },
+/obj/machinery/computer/atmos_control,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/checker,
+/area/engine/atmos)
+"byW" = (
/obj/structure/sign/plaques/atmos{
pixel_y = 32
},
-/obj/item/phone{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/cigbutt/cigarbutt{
- pixel_x = 5;
- pixel_y = -1
- },
-/obj/structure/table,
/obj/machinery/light_switch{
pixel_x = 26
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/computer/atmos_control,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/checker,
/area/engine/atmos)
-"byW" = (
-/obj/structure/table,
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/clothing/head/welding{
- pixel_x = -5;
- pixel_y = 3
- },
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/light_switch{
- pixel_x = -26
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
"byX" = (
/obj/machinery/power/apc/highcap/ten_k{
areastring = "/area/engine/atmos";
@@ -39323,8 +39329,12 @@
/obj/structure/cable/yellow{
icon_state = "0-2"
},
-/obj/machinery/camera{
- c_tag = "Atmospherics - Entrance"
+/obj/machinery/light_switch{
+ pixel_x = -26
+ },
+/obj/machinery/pipedispenser/disposal/transit_tube,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -39333,16 +39343,27 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"byZ" = (
-/obj/machinery/space_heater,
/obj/machinery/firealarm{
pixel_y = 24
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/machinery/pipedispenser,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/camera{
+ c_tag = "Atmospherics - Entrance";
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bza" = (
@@ -40077,42 +40098,24 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAE" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark/corner,
+/area/engine/atmos)
+"bAF" = (
/obj/structure/chair/office/dark{
dir = 4
},
/obj/effect/landmark/start/atmospheric_technician,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bAF" = (
-/obj/machinery/computer/atmos_control{
- dir = 8
- },
-/obj/machinery/requests_console{
- department = "Atmospherics";
- departmentType = 4;
- name = "Atmos RC";
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
"bAG" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/table,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/grenade/chem_grenade/smart_metal_foam,
-/obj/item/grenade/chem_grenade/smart_metal_foam,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics Monitoring";
+ req_access_txt = "24"
},
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bAH" = (
/obj/structure/cable/yellow{
@@ -40131,10 +40134,11 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAJ" = (
-/obj/machinery/space_heater,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/machinery/pipedispenser/disposal,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAK" = (
@@ -40172,9 +40176,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAQ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAR" = (
@@ -40841,12 +40843,12 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bCj" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
/obj/structure/cable/yellow{
icon_state = "2-8"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bCk" = (
@@ -40856,39 +40858,50 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bCl" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/computer/atmos_control{
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
dir = 8
},
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/turf/open/floor/plasteel/dark/corner,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "atmos";
+ name = "Atmospherics Lockdown";
+ pixel_x = 26;
+ pixel_y = -26;
+ req_access_txt = "24"
+ },
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bCm" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
-"bCn" = (
-/obj/structure/table,
-/obj/item/storage/belt/utility,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
-/obj/item/t_scanner,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/turf_decal/tile/yellow{
- dir = 8
+ dir = 4
},
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
+/obj/machinery/requests_console{
+ department = "Atmospherics";
+ departmentType = 4;
+ name = "Atmos RC";
+ pixel_x = 30
},
+/obj/machinery/vending/wardrobe/atmos_wardrobe,
+/turf/open/floor/plasteel/dark/corner,
+/area/engine/atmos)
+"bCn" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/atmos,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bCo" = (
/obj/structure/cable/yellow{
@@ -40897,25 +40910,27 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bCp" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics Monitoring";
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bCq" = (
-/obj/machinery/space_heater,
-/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/obj/effect/turf_decal/stripes/line{
dir = 10
},
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
/area/engine/atmos)
"bCr" = (
/obj/machinery/atmospherics/components/binary/pump/on{
@@ -40965,7 +40980,8 @@
/area/engine/atmos)
"bCy" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
/turf/open/floor/plating,
@@ -41608,35 +41624,22 @@
/area/engine/atmos)
"bDP" = (
/obj/machinery/holopad,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/cable/yellow{
icon_state = "1-4"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
"bDQ" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bDR" = (
-/obj/machinery/door/airlock/atmos/glass{
- name = "Atmospherics Monitoring";
- req_access_txt = "24"
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bDS" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -41658,6 +41661,9 @@
"bDV" = (
/obj/structure/closet/crate,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/camera{
+ c_tag = "Atmospherics - Entrance"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bDW" = (
@@ -42622,6 +42628,9 @@
name = "Atmospherics Blast Door"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/door/window/westleft{
+ req_access_txt = "24"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFG" = (
@@ -42640,51 +42649,17 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFI" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/closed/wall,
/area/engine/atmos)
"bFJ" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bFK" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -24
- },
-/obj/machinery/button/door{
- id = "atmos";
- name = "Atmospherics Lockdown";
- pixel_x = 26;
- pixel_y = -26;
- req_access_txt = "24"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner,
-/area/engine/atmos)
-"bFL" = (
-/obj/machinery/holopad,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
+/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bFM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
@@ -42717,6 +42692,7 @@
name = "Distribution Loop";
req_access_txt = "24"
},
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFQ" = (
@@ -42777,6 +42753,7 @@
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"bFY" = (
@@ -43320,52 +43297,33 @@
/turf/open/floor/plasteel/dark/corner,
/area/hallway/primary/starboard)
"bHp" = (
-/obj/machinery/portable_atmospherics/canister/air,
/obj/machinery/light/small{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bHq" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bHr" = (
-/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden,
/turf/open/floor/plasteel,
-/area/engine/atmos)
+/area/hallway/primary/starboard)
"bHs" = (
-/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
-/obj/machinery/light/small{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bHt" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bHu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
@@ -43418,8 +43376,8 @@
/area/engine/atmos)
"bHB" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
},
/turf/open/floor/plating,
/area/engine/atmos)
@@ -43991,13 +43949,13 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bIH" = (
@@ -44034,8 +43992,10 @@
/area/engine/atmos)
"bIK" = (
/obj/machinery/portable_atmospherics/canister/nitrogen,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIL" = (
@@ -44046,53 +44006,27 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bIM" = (
+"bIN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/closed/wall/r_wall,
+/obj/machinery/suit_storage_unit/atmos,
+/turf/open/floor/plasteel,
/area/engine/atmos)
-"bIN" = (
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/rods/fifty,
-/obj/item/stack/rods/fifty,
+"bIO" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel{
- dir = 1
- },
-/area/engine/atmos)
-"bIO" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 8;
- name = "Air to External Air Ports"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bIP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bIQ" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 8;
+ name = "Air to External Air Ports"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -44100,13 +44034,16 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIS" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
+/obj/item/beacon,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIT" = (
@@ -44155,20 +44092,12 @@
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"bIZ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "N2O to Pure"
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
-"bJa" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/atmos)
"bJb" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
@@ -44846,7 +44775,6 @@
/area/storage/tcom)
"bKt" = (
/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock/engineering{
name = "Telecomms Storage";
req_access_txt = "61"
@@ -44858,69 +44786,43 @@
/turf/open/floor/plasteel,
/area/storage/tcom)
"bKu" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
+/obj/effect/turf_decal/bot,
/turf/closed/wall/r_wall,
/area/engine/atmos)
-"bKv" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "External Waste Ports to Filter"
- },
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
-/area/engine/atmos)
"bKw" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bKx" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKy" = (
-/obj/item/beacon,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bKz" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 10
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bKA" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Air to Ports"
- },
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/closed/wall,
/area/engine/atmos)
"bKB" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Ports"
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10
},
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bKC" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Pure to Ports"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKD" = (
@@ -44935,17 +44837,21 @@
/obj/machinery/computer/atmos_control/tank/nitrous_tank{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/structure/window/reinforced{
dir = 4
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 5
+ },
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"bKG" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 10
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bKH" = (
@@ -45556,6 +45462,9 @@
/area/crew_quarters/theatre)
"bLS" = (
/obj/machinery/vending/autodrobe,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"bLT" = (
@@ -45573,14 +45482,19 @@
c_tag = "Telecomms - Storage";
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/storage/tcom)
"bLV" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/holopad,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel/dark,
/area/storage/tcom)
"bLW" = (
@@ -45608,9 +45522,6 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bMa" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
/obj/machinery/portable_atmospherics/pump,
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -45621,82 +45532,62 @@
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"bMb" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 1
- },
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 0;
+ name = "External to Filter"
+ },
/turf/open/floor/plasteel/white/corner{
dir = 1
},
/area/engine/atmos)
-"bMc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bMd" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMe" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = -26
- },
-/obj/machinery/camera{
- c_tag = "Atmospherics - Central";
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plasteel,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/turf/open/floor/plating,
/area/engine/atmos)
"bMf" = (
-/obj/structure/rack,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "Mix to External"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMg" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
},
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bMh" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/crew_quarters/theatre)
"bMi" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/storage/tcom)
"bMj" = (
/obj/machinery/holopad,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bMk" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
- dir = 1
- },
/obj/structure/window/reinforced{
dir = 4
},
@@ -45707,13 +45598,16 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 10
+ },
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"bMl" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bMm" = (
@@ -46538,57 +46432,41 @@
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/turf/open/floor/plating,
/area/maintenance/starboard)
-"bNP" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
+"bNQ" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bNR" = (
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
+"bNS" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel/white/corner{
dir = 1
},
/area/engine/atmos)
-"bNQ" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = 27
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bNR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
-/area/engine/atmos)
-"bNS" = (
-/obj/structure/extinguisher_cabinet{
- pixel_x = -27
- },
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port Mix to West Ports"
- },
-/obj/machinery/light/small{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bNU" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port Mix to East Ports"
- },
-/obj/item/crowbar,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bNV" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/machinery/door/window/northleft{
dir = 8;
name = "Inner Pipe Access";
req_access_txt = "24"
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bNW" = (
@@ -47227,9 +47105,6 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bPo" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
/obj/machinery/portable_atmospherics/scrubber,
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -47244,12 +47119,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel/white/corner{
dir = 1
},
@@ -47258,57 +47128,41 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPr" = (
-/obj/structure/closet/secure_closet/atmospherics,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
+ dir = 1
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bPs" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
},
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel{
- dir = 1
- },
-/area/engine/atmos)
+/turf/closed/wall,
+/area/maintenance/starboard)
"bPt" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
+/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
+ dir = 1
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bPu" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
- },
-/obj/machinery/portable_atmospherics/canister,
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel{
- dir = 1
- },
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bPv" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "O2 to Airmix"
},
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bPw" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/structure/window/reinforced{
dir = 4
},
@@ -47326,8 +47180,8 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -47921,33 +47775,40 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bQS" = (
-/obj/machinery/suit_storage_unit/atmos,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bQT" = (
-/obj/structure/sign/warning/nosmoking,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 5
+ },
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bQU" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bQV" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 4
},
-/obj/machinery/meter,
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bQW" = (
/obj/machinery/computer/atmos_control/tank/toxin_tank{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/structure/window/reinforced{
dir = 4
},
@@ -47961,6 +47822,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bQX" = (
@@ -48571,38 +48433,24 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/engine/atmos)
"bSh" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 4
- },
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/effect/turf_decal/bot{
- dir = 1
- },
-/turf/open/floor/plasteel{
- dir = 1
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 9
},
+/turf/open/floor/plating,
/area/engine/atmos)
"bSi" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/obj/machinery/meter,
-/obj/item/wrench,
-/turf/open/floor/plasteel,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/layer_manifold,
+/turf/open/floor/plating,
/area/engine/atmos)
"bSj" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{
- dir = 1
- },
/obj/structure/window/reinforced{
dir = 4
},
@@ -48617,6 +48465,8 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/space_heater,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bSk" = (
@@ -48634,15 +48484,15 @@
/area/engine/atmos)
"bSn" = (
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
/obj/structure/cable/yellow{
icon_state = "1-2"
},
/obj/structure/cable/yellow{
icon_state = "1-4"
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/maintenance/port)
"bSo" = (
@@ -49026,6 +48876,9 @@
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/spawner/lootdrop/maintenance,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"bTe" = (
@@ -49059,41 +48912,18 @@
/obj/machinery/vending/wardrobe/atmos_wardrobe,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
-"bTj" = (
-/obj/machinery/requests_console{
- department = "Atmospherics";
- departmentType = 4;
- name = "Atmos RC";
- pixel_x = 30
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/shower{
- dir = 8;
- name = "emergency shower"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bTk" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Filter"
- },
-/obj/machinery/light/small{
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
dir = 8
},
-/obj/machinery/camera{
- c_tag = "Atmospherics - Starboard";
- dir = 4
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"bTl" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bTm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -49720,61 +49550,19 @@
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bUA" = (
-/obj/machinery/pipedispenser,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
},
-/turf/open/floor/plasteel,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bUB" = (
-/obj/machinery/light{
+/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{
dir = 1
},
-/obj/machinery/light_switch{
- pixel_y = 28
- },
-/obj/machinery/pipedispenser/disposal,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUC" = (
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_y = 28
- },
-/obj/machinery/pipedispenser/disposal/transit_tube,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUD" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Port to Filter"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUE" = (
-/obj/item/cigbutt,
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUF" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bUG" = (
-/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
-/turf/open/floor/plasteel,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
/area/engine/atmos)
"bUH" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/structure/window/reinforced{
dir = 4
},
@@ -49792,8 +49580,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
@@ -50227,7 +50015,6 @@
/turf/closed/wall,
/area/hallway/secondary/service)
"bVA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/airlock{
name = "Service Hall";
req_access_txt = "null";
@@ -50290,17 +50077,20 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/engine/atmos)
"bVG" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 1
- },
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -50318,38 +50108,15 @@
},
/area/engine/atmos)
"bVI" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/engine/atmos)
-"bVJ" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
-/obj/machinery/meter,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bVL" = (
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Port to Fuel Pipe"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bVM" = (
/obj/machinery/computer/atmos_control/tank/carbon_tank{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/structure/window/reinforced{
dir = 4
},
@@ -50363,6 +50130,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bVN" = (
@@ -51030,6 +50798,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard)
"bXe" = (
@@ -51076,9 +50845,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXh" = (
@@ -51088,76 +50854,15 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Fuel Pipe to Filter"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXi" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/dark/visible{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXj" = (
/obj/structure/cable/yellow{
icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXk" = (
-/obj/effect/landmark/start/atmospheric_technician,
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXl" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXm" = (
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXn" = (
-/obj/machinery/atmospherics/pipe/manifold/dark/visible,
-/obj/machinery/meter{
- color = ""
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXo" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Pure to Fuel Pipe"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bXp" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXq" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{
- dir = 1
- },
/obj/structure/window/reinforced{
dir = 4
},
@@ -51172,6 +50877,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/space_heater,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bXr" = (
@@ -51626,8 +51333,8 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"bYt" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -51638,6 +51345,9 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/maintenance/starboard)
"bYv" = (
@@ -51664,36 +51374,11 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bYx" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 6
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYy" = (
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 4;
- name = "N2 to Airmix"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYz" = (
-/obj/machinery/atmospherics/components/trinary/mixer/airmix{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"bYA" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bYB" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/light{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"bYC" = (
@@ -52199,9 +51884,6 @@
/turf/closed/wall,
/area/maintenance/disposal/incinerator)
"bZF" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
/obj/item/radio/intercom{
name = "Station Intercom (General)";
pixel_x = -30
@@ -52209,20 +51891,14 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
/area/engine/atmos)
-"bZG" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bZH" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "N2 to Pure"
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 6
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -52232,13 +51908,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"bZJ" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"bZK" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 1
@@ -52247,7 +51916,7 @@
/area/engine/atmos)
"bZL" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
- dir = 4
+ dir = 1
},
/obj/machinery/meter,
/turf/open/floor/plasteel,
@@ -52257,7 +51926,6 @@
dir = 4
},
/obj/structure/table,
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/item/paper_bin{
pixel_x = -2;
pixel_y = 8
@@ -52269,6 +51937,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark/corner,
/area/engine/atmos)
"bZN" = (
@@ -53039,6 +52710,9 @@
name = "Inner Pipe Access";
req_access_txt = "24"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"cbc" = (
@@ -53048,15 +52722,12 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 10
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"cbd" = (
-/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
- dir = 4
- },
/obj/structure/window/reinforced,
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -53068,6 +52739,7 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/reagent_dispensers/watertank/high,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbe" = (
@@ -53075,9 +52747,6 @@
/obj/machinery/computer/atmos_control/tank/nitrogen_tank{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/dark/visible,
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -53093,13 +52762,6 @@
/area/engine/atmos)
"cbf" = (
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Nitrogen Outlet"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -53110,6 +52772,10 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 6
+ },
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbg" = (
@@ -53123,16 +52789,14 @@
name = "Inner Pipe Access";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"cbh" = (
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -53143,6 +52807,10 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbi" = (
@@ -53150,9 +52818,6 @@
/obj/machinery/computer/atmos_control/tank/oxygen_tank{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -53163,17 +52828,13 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbj" = (
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "O2 to Airmix"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 1
},
@@ -53184,6 +52845,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/components/trinary/mixer/airmix{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbk" = (
@@ -53197,41 +52861,35 @@
name = "Inner Pipe Access";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"cbl" = (
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 10
+ },
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"cbn" = (
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Air to Pure"
- },
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"cbo" = (
@@ -53239,15 +52897,21 @@
dir = 4
},
/obj/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 9
- },
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/structure/rack,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/mask/gas,
/turf/open/floor/plasteel/cafeteria,
/area/engine/atmos)
"cbp" = (
@@ -54005,64 +53669,81 @@
/area/maintenance/disposal/incinerator)
"ccL" = (
/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
+ dir = 10
},
/turf/closed/wall/r_wall,
/area/engine/atmos)
"ccM" = (
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/valve/digital{
+ name = "Waste Release"
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ccN" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
+/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ccO" = (
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Fuel Pipe"
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ccP" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"ccQ" = (
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"ccR" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"ccS" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"ccT" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "Nitrogen Outlet"
},
-/turf/open/floor/plasteel/dark,
-/area/engine/atmos)
-"ccU" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
-"ccV" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 9
+"ccQ" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
},
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "N2 to Pure"
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/atmos)
+"ccR" = (
+/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/atmos)
+"ccS" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/atmos)
+"ccT" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "Air to Pure"
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/atmos)
+"ccV" = (
/obj/machinery/camera{
c_tag = "Atmospherics - Starboard Aft";
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ccW" = (
@@ -54072,6 +53753,7 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"ccX" = (
@@ -55339,11 +55021,6 @@
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/space,
/area/space/nearstation)
-"cfv" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/space,
-/area/space/nearstation)
"cfw" = (
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
@@ -76309,11 +75986,8 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"cUR" = (
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/components/binary/valve/digital{
- name = "Waste Release"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 5
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
@@ -76424,16 +76098,11 @@
/turf/open/space/basic,
/area/space)
"cVy" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/atmos)
-"cVz" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 4
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
+/turf/open/floor/plating,
/area/engine/atmos)
"cVC" = (
/mob/living/simple_animal/sloth/citrus,
@@ -76449,9 +76118,6 @@
/obj/machinery/computer/atmos_control/tank/air_tank{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/green/visible{
- dir = 4
- },
/obj/effect/turf_decal/tile/blue{
dir = 4
},
@@ -79116,43 +78782,24 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/space,
/area/space/nearstation)
-"dhe" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhg" = (
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
-"dhh" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"dhi" = (
-/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/machinery/door/window/northleft{
dir = 8;
name = "Inner Pipe Access";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "Mix to Engine"
},
+/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"dhj" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"dhk" = (
@@ -79160,6 +78807,7 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plating,
/area/engine/atmos)
"dhl" = (
@@ -79737,12 +79385,12 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 10
- },
/obj/structure/sign/poster/contraband/clown{
pixel_x = 32
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"din" = (
@@ -80972,15 +80620,14 @@
/turf/open/floor/plating,
/area/engine/atmos)
"dBM" = (
+/obj/machinery/door/airlock/atmos/glass{
+ name = "Atmospherics Monitoring";
+ req_access_txt = "24"
+ },
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/open/floor/plasteel/dark/corner{
- dir = 1
- },
+/turf/open/floor/plasteel,
/area/engine/atmos)
"dBN" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -81429,13 +81076,6 @@
},
/turf/open/floor/plasteel,
/area/hydroponics)
-"dDm" = (
-/obj/machinery/atmospherics/pipe/simple/dark/visible{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"dDo" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel/white,
@@ -81663,6 +81303,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
+"dOR" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/maintenance/starboard)
"dYu" = (
/obj/machinery/door/airlock/external{
name = "Auxiliary Airlock"
@@ -81737,10 +81383,10 @@
/turf/open/floor/plating,
/area/crew_quarters/cryopod)
"eJq" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
- name = "CO2 to Pure"
+ name = "CO2 Outlet Pump"
},
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
@@ -81998,6 +81644,14 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"jsc" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible,
+/obj/machinery/camera{
+ c_tag = "Atmospherics - Aft";
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/atmos)
"jwW" = (
/turf/closed/wall/mineral/plastitanium,
/area/crew_quarters/fitness/recreation)
@@ -82136,6 +81790,9 @@
dir = 1;
name = "O2 to Pure"
},
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"kOt" = (
@@ -82362,11 +82019,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"njd" = (
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "Plasma to Pure"
},
+/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"nnK" = (
@@ -82419,6 +82076,15 @@
},
/turf/open/floor/plasteel,
/area/construction/storage/wing)
+"nLT" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"nWb" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -121521,7 +121187,7 @@ bFA
byN
byN
byN
-byN
+bMh
byN
bPf
byN
@@ -121769,7 +121435,7 @@ bpc
dhQ
btw
buX
-bwY
+nLT
bGp
btw
dCV
@@ -122026,7 +121692,7 @@ alq
alq
alq
buY
-alq
+dOR
alq
alq
alq
@@ -122035,7 +121701,7 @@ alq
alq
alq
bKr
-bKr
+bMi
bKr
bKr
bKr
@@ -122541,7 +122207,7 @@ bry
bry
bva
bxa
-bry
+bHr
bAy
bAy
bDN
@@ -123055,7 +122721,7 @@ bhT
bhT
bvc
bxc
-bxc
+bHs
bAA
bCg
dBK
@@ -123329,7 +122995,7 @@ bTh
bUx
aut
bXc
-apc
+bZz
bZE
caZ
ccJ
@@ -123584,7 +123250,7 @@ apc
aqq
apc
bUy
-alq
+bPs
bXd
apf
bZE
@@ -123830,8 +123496,8 @@ byT
bAD
bCj
bDP
-bFI
-bHr
+bFH
+bHq
bIK
bBt
atm
@@ -123841,13 +123507,13 @@ apc
bSf
apc
bxc
-bxc
+bxg
bXe
bxc
bxc
bxc
ccL
-bxl
+bQT
cft
pOP
pOP
@@ -124082,13 +123748,13 @@ bph
brD
bep
bvg
-bxd
+bFI
byU
-bAE
-bCk
-dBJ
+bDU
+bKC
+bMd
bFJ
-bHs
+bHq
bIL
cVD
atm
@@ -124104,8 +123770,8 @@ bYv
bZF
cbb
ccM
-bxc
-aaf
+bQU
+bUB
aaf
aaf
aaf
@@ -124342,11 +124008,11 @@ bvh
bxd
byV
bAF
-bCl
-bDQ
-bFK
-bxk
-bIM
+bCk
+dBJ
+bFH
+bHq
+bCk
bKu
bxc
bxc
@@ -124358,11 +124024,11 @@ bxc
bVG
bXg
bAO
-bZG
+bCi
cbc
cUR
cVy
-cVz
+aaf
bAR
bAR
bAR
@@ -124597,14 +124263,14 @@ brF
bep
bvi
bxc
-bxc
-bxc
+byW
+bAE
bCm
-bDR
-bza
-bxl
+dBJ
+bCl
+bCn
bIN
-bxg
+bDQ
bMa
bMa
bPo
@@ -124618,7 +124284,7 @@ bCi
bCi
cbd
ccN
-ceg
+bQV
cfu
cgA
chN
@@ -124854,28 +124520,28 @@ brG
bep
bep
bxc
-byW
+bKy
bAG
-bCn
+bxg
dBM
-bFL
-bHt
+bza
+bxl
bIO
-bKv
+bMg
bMb
-bNP
+bNS
bPp
bPp
bSg
bDS
bDS
bVI
-bXi
-bYw
+dBJ
+bCi
bYw
cbe
ccO
-bza
+bSh
aaf
gJs
chO
@@ -125119,21 +124785,21 @@ bFM
bHu
bIP
bKw
-bMc
+bKw
bNQ
bPq
bPq
-bHu
-bTj
-bHu
-bVJ
+bPq
+bPq
+bPq
+bPq
bXj
-bYx
-bMg
+bCi
+bCi
cbf
ccP
ceh
-cfv
+cfw
cgA
chP
cje
@@ -125374,23 +125040,23 @@ bCp
bDU
bFN
bAO
-bIQ
-bKx
-bMd
-bxd
-bPr
-bQS
-bPr
-bxd
-bUA
-bVK
-bXk
-bYy
+bIS
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bKD
+bCi
bZH
cbg
ccQ
-bza
-aaf
+bSi
+cfx
bAR
bAR
bAR
@@ -125632,17 +125298,17 @@ bDV
bFO
bHv
bIR
-bKy
-bMe
-bNR
-bNR
-bQT
-bNR
-bNR
-bUB
-bFO
-bXl
-bIS
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
bZI
cbh
ccR
@@ -125882,24 +125548,24 @@ bhT
bhT
bvm
bxg
-bza
-bza
-bza
-bza
-bFP
-bza
-bIS
bKz
+bKA
+bKA
+bMe
+bFP
+bMe
bMf
-bxd
-bPs
-bPs
-bSh
-bxd
-bUC
-bVK
-bXm
-bIS
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
bZI
cbi
ccS
@@ -126146,20 +125812,20 @@ bDW
bFQ
bHw
bIT
-bKA
-bMg
-bNS
-bPt
-bQU
-bSi
-bTk
-bDW
-bFQ
-bXm
-bYz
-bZJ
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bZI
cbj
-ccP
+bPv
ceh
cfw
cgA
@@ -126403,21 +126069,21 @@ bDX
bFR
bHx
bIU
-bKB
-bMh
+bCi
+bCi
bCi
bCi
bKD
bCi
bCi
-bUD
bCi
-dDm
-bIS
+bCi
+dCY
+bCi
bZK
cbk
kJW
-ceh
+bSi
cfx
bAR
bAR
@@ -126660,20 +126326,20 @@ bDY
bFS
bHy
bIV
-bKC
-bMi
-bNU
-bMg
-bQV
-bMg
-bMg
-bUE
-bVL
-bXn
-bYA
-bZJ
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bZI
cbl
-bKG
+bQS
cei
cfy
cgB
@@ -126918,19 +126584,19 @@ bFT
bHz
bIW
bKD
-dhe
-dhg
-bPu
-bPu
-bPu
-bTl
-bUF
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
bKD
-bXo
+bCi
bMj
bZI
cVJ
-ccQ
+ccS
bza
aaf
gJs
@@ -127175,20 +126841,20 @@ bFU
bHy
bIX
bKE
-bKE
-dhh
-bPv
-bKE
-bKE
-bKE
-bUG
-bKE
-bXp
-bKE
+bNR
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
+bCi
bZL
cbn
ccT
-cei
+bTk
cfy
cgC
chV
@@ -127444,8 +127110,8 @@ bXq
bNV
bZM
cbo
-ccU
-bxc
+ccS
+bTl
aaf
bAR
bAR
@@ -127692,17 +127358,17 @@ bKG
bMl
dhj
njd
-bKG
-bMl
-bKG
+jsc
+bPr
+bNU
eJq
-bKG
-bMl
+bNU
+bPt
bYB
-bKG
-bKG
+bNU
+bNU
ccV
-bxc
+bTl
aaf
aaf
aaf
@@ -127939,27 +127605,27 @@ aaa
aaf
bxc
bxc
-bxc
+bKB
bCy
-bza
+cei
bFX
-bza
-bJa
-bza
+cei
+bCy
+cei
bFX
dhk
-bJa
-bza
+bCy
+cei
bFX
-bza
-bJa
-bza
+cei
+bCy
+cei
bFX
-bxc
-bxc
-bxc
+bPu
+bPu
+bPu
ccW
-bxc
+bUA
aaf
aaa
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 64d4bd344a..4a14660e57 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -46,13 +46,13 @@
/area/engine/engineering)
"aag" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
/obj/machinery/door/poddoor/shutters/radiation/preopen{
id = "engsm";
name = "Radiation Chamber Shutters"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"aah" = (
@@ -4719,9 +4719,13 @@
/area/security/warden)
"aml" = (
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "0-8"
},
-/turf/closed/wall/r_wall,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
/area/security/warden)
"amm" = (
/obj/structure/cable{
@@ -5124,14 +5128,25 @@
dir = 8;
pixel_x = 28
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/security/warden)
-"ana" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/closed/wall/r_wall,
+/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"ana" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"anb" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -5333,19 +5348,19 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/security/brig)
-"anB" = (
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/turf/open/floor/plasteel,
+/area/security/brig)
+"anB" = (
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
/turf/open/floor/plating,
/area/security/warden)
"anC" = (
@@ -5394,17 +5409,22 @@
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"anK" = (
/obj/structure/cable{
icon_state = "0-2"
},
-/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plating,
/area/security/warden)
"anL" = (
@@ -5671,6 +5691,9 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aop" = (
@@ -5896,11 +5919,10 @@
/turf/open/floor/plasteel/dark,
/area/security/brig)
"aoQ" = (
-/obj/structure/cable,
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plating,
/area/security/warden)
"aoR" = (
@@ -5958,6 +5980,9 @@
/obj/item/crowbar,
/obj/item/wrench,
/obj/item/laser_pointer/red,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"aoY" = (
@@ -5965,14 +5990,17 @@
/obj/machinery/light_switch{
pixel_y = -22
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"aoZ" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/structure/cable,
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/turf/open/floor/plating,
/area/security/warden)
"apa" = (
@@ -6266,32 +6294,22 @@
/turf/open/floor/plasteel,
/area/security/brig)
"apI" = (
+/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-2"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/closed/wall/r_wall,
+/obj/structure/cable,
+/turf/open/floor/plating,
/area/security/warden)
"apJ" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/security/warden)
"apK" = (
/obj/structure/table/reinforced,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/machinery/door/window/brigdoor{
dir = 1;
name = "Armory Desk";
@@ -6311,14 +6329,11 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apL" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/security/warden)
"apM" = (
@@ -6326,26 +6341,44 @@
name = "Brig Control";
req_access_txt = "3"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"apN" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/closed/wall/r_wall,
-/area/security/warden)
-"apO" = (
/obj/structure/cable{
icon_state = "1-8"
},
-/turf/closed/wall/r_wall,
-/area/security/warden)
+/turf/open/floor/plasteel,
+/area/security/brig)
+"apO" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"apP" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/security{
@@ -6501,12 +6534,12 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqo" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
@@ -6519,6 +6552,12 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqp" = (
@@ -6546,12 +6585,21 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqr" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqs" = (
@@ -6562,6 +6610,12 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqt" = (
@@ -6574,6 +6628,12 @@
/obj/effect/turf_decal/tile/red{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqu" = (
@@ -6582,6 +6642,9 @@
},
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aqv" = (
@@ -7533,6 +7596,9 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"asx" = (
@@ -7552,6 +7618,12 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"asy" = (
@@ -7577,10 +7649,16 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"asA" = (
/obj/machinery/atmospherics/pipe/manifold/cyan/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"asB" = (
@@ -7597,6 +7675,9 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"asC" = (
@@ -7994,31 +8075,34 @@
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/security/brig)
"aty" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
/obj/structure/cable{
- icon_state = "1-8"
+ icon_state = "2-8"
},
-/turf/closed/wall,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
/area/security/brig)
"atz" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/security/brig)
"atA" = (
@@ -8026,9 +8110,6 @@
id = "Cell 2";
name = "Cell 2"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -8036,19 +8117,19 @@
/turf/open/floor/plasteel,
/area/security/brig)
"atB" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/closed/wall,
+/turf/open/floor/plasteel,
/area/security/brig)
"atC" = (
/obj/machinery/door/window/brigdoor/security/cell{
id = "Cell 3";
name = "Cell 3"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -8056,14 +8137,12 @@
/turf/open/floor/plasteel,
/area/security/brig)
"atD" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
/turf/open/floor/plating,
/area/security/brig)
"atE" = (
@@ -8073,9 +8152,6 @@
name = "Brig";
req_access_txt = "63"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/red{
@@ -8087,13 +8163,11 @@
/turf/open/floor/plasteel,
/area/security/brig)
"atF" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/structure/cable{
icon_state = "0-2"
},
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/security/brig)
"atG" = (
@@ -8507,6 +8581,9 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"auA" = (
@@ -8964,6 +9041,9 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"avv" = (
@@ -8995,6 +9075,9 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"avy" = (
@@ -9026,6 +9109,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"avB" = (
@@ -9605,18 +9691,21 @@
/turf/open/floor/plating,
/area/security/brig)
"awK" = (
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
},
/obj/structure/cable{
- icon_state = "0-8"
+ icon_state = "2-4"
},
-/obj/machinery/door/poddoor/preopen{
- id = "Secure Gate";
- name = "brig shutters"
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel,
/area/security/brig)
"awL" = (
/obj/machinery/door/firedoor,
@@ -9628,9 +9717,6 @@
name = "Brig";
req_access_txt = "63"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -9641,9 +9727,6 @@
/turf/open/floor/plasteel,
/area/security/brig)
"awM" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
/obj/structure/cable,
/obj/machinery/door/poddoor/preopen{
id = "Secure Gate";
@@ -55550,6 +55633,23 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"jen" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"jeq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55703,6 +55803,20 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"jxK" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"jzz" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/vacuum/external,
@@ -57681,6 +57795,7 @@
/area/maintenance/department/science)
"odM" = (
/obj/effect/landmark/barthpot,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/carpet,
/area/library/lounge)
"oep" = (
@@ -59082,6 +59197,22 @@
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
+"rdB" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"reH" = (
/obj/item/reagent_containers/food/drinks/bottle/vodka,
/obj/structure/disposalpipe/segment{
@@ -59148,6 +59279,18 @@
},
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
+"rjF" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "Secure Gate";
+ name = "brig shutters"
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/security/brig)
"rmC" = (
/turf/open/space/basic,
/area/space/station_ruins)
@@ -60137,6 +60280,19 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"tTZ" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/red,
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/security/brig)
"tXn" = (
/obj/structure/sink{
dir = 4;
@@ -83186,7 +83342,7 @@ amf
amR
anA
aoo
-aoo
+ana
aoo
aqn
arl
@@ -83194,7 +83350,7 @@ asw
atx
auz
avu
-awJ
+rjF
axG
ayH
aAe
@@ -83442,16 +83598,16 @@ alx
amg
amg
anB
-ana
+amg
aoQ
-apI
+amg
aqo
alv
asx
-aty
ajM
ajM
-atB
+ajM
+akA
axH
ayI
aAf
@@ -83702,13 +83858,13 @@ anC
aop
aoR
apJ
-aqp
+apN
aon
-asy
+aty
atz
aux
avv
-awK
+awI
axG
ayL
aAi
@@ -83961,7 +84117,7 @@ aoS
apJ
aqq
aon
-asv
+atB
atA
auA
avw
@@ -84218,11 +84374,11 @@ aoT
apK
aqr
arl
-asw
-atx
+awK
+atD
auz
avx
-awJ
+rjF
axG
ayJ
aAg
@@ -84476,10 +84632,10 @@ apL
aqs
aon
asz
-atB
ajM
ajM
-atB
+ajM
+akA
axI
ayL
aAh
@@ -84732,11 +84888,11 @@ aoV
apJ
aqt
arm
-asy
+rdB
atz
aux
avy
-awK
+awI
axG
ayL
aAi
@@ -85243,14 +85399,14 @@ amY
anI
aor
aoX
-apJ
-aqt
+apI
+apO
aro
-asw
+jen
atD
auz
avA
-awJ
+rjF
axG
ayL
aAi
@@ -85495,19 +85651,19 @@ ajj
ajT
akP
alA
-amj
+aml
amZ
anJ
amX
aoY
-apN
+amg
sBA
arp
asB
-atB
ajM
ajM
-atB
+ajM
+akA
axJ
ayL
aAi
@@ -85752,15 +85908,15 @@ ahL
ahL
ahL
ahL
-aml
-ana
+amg
+amg
anK
aos
aoZ
-apO
+amg
aqv
aro
-asw
+jxK
atE
auB
avB
@@ -86017,7 +86173,7 @@ apa
agP
aqw
arp
-asC
+tTZ
atF
alv
alv
@@ -86535,7 +86691,7 @@ asE
ajM
auD
avC
-ajM
+akA
axJ
axG
aAm
@@ -87563,7 +87719,7 @@ asG
ajM
auH
avG
-auH
+awR
axM
ayR
aAo
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 5c054c0bb4..d015547ac4 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -16752,7 +16752,7 @@
},
/area/centcom/holding)
"Nf" = (
-/obj/machinery/autoylathe,
+/obj/machinery/autolathe/toy,
/turf/open/indestructible/hotelwood,
/area/centcom/holding)
"Ni" = (
diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm
index 3210341cc3..59c0c58b8d 100644
--- a/code/__DEFINES/dcs/flags.dm
+++ b/code/__DEFINES/dcs/flags.dm
@@ -40,6 +40,7 @@
#define CALTROP_BYPASS_SHOES 1
#define CALTROP_IGNORE_WALKERS 2
+// Spellcasting
#define SPELL_SKIP_ALL_REQS (1<<0)
#define SPELL_SKIP_CENTCOM (1<<1)
#define SPELL_SKIP_STAT (1<<2)
@@ -53,3 +54,24 @@
#define SPELL_CULT_ARMOR (1<<10)
#define SPELL_WIZARD_GARB (SPELL_WIZARD_HAT|SPELL_WIZARD_ROBE)
#define SPELL_CULT_GARB (SPELL_CULT_HELMET|SPELL_CULT_ARMOR)
+
+//// Identification ////
+// /datum/component/identification/identification_flags
+/// Delete on successful broad identification (so the main way we "uncover" how an object works, since this won't be on it to obfuscate it)
+#define ID_COMPONENT_DEL_ON_IDENTIFY (1<<0)
+/// We've already been successfully deepscanned by a deconstructive analyzer
+#define ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED (1<<1)
+
+// /datum/component/identification/identification_effect_flags
+/// Block user from getting actions if they don't know how to use this. Triggered on equip.
+#define ID_COMPONENT_EFFECT_NO_ACTIONS (1<<0)
+
+// /datum/component/identification/identification_method_flags
+/// Can be identified in a deconstructive analyzer
+#define ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR (1<<0)
+
+// Return values for /datum/component/deitnfication/check_knowledge()
+/// Has no knowledge, default
+#define ID_COMPONENT_KNOWLEDGE_NONE 0
+/// Has full knowledge
+#define ID_COMPONENT_KNOWLEDGE_FULL 1
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 725b19ef1d..ce4505265f 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -30,7 +30,7 @@
#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
-#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob)
+#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text)
#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides)
//Positions for overrides list
#define EXAMINE_POSITION_ARTICLE 1
@@ -242,6 +242,8 @@
#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params)
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
+ // Do not grant actions on equip.
+ #define COMPONENT_NO_GRANT_ACTIONS 1
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
// relocated, tell inventory procs if those called this that the item isn't available anymore.
#define COMPONENT_DROPPED_RELOCATION 1
@@ -254,6 +256,9 @@
// THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm!
#define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
#define COMSIG_ITEM_RUN_BLOCK "run_block" //from base of obj/item/run_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+#define COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN "deconstructor_deepscan" //Called by deconstructive analyzers deepscanning an item: (obj/machinery/rnd/destructive_analyzer/analyzer_machine, mob/user, list/information_list)
+ // Uncovered information
+ #define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index aabe4f117f..f4a30cd482 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -8,6 +8,10 @@
#define PLANE_SPACE_PARALLAX -90
#define PLANE_SPACE_PARALLAX_RENDER_TARGET "PLANE_SPACE_PARALLAX"
+#define OPENSPACE_LAYER 17 //Openspace layer over all
+#define OPENSPACE_PLANE -4 //Openspace plane below all turfs
+#define OPENSPACE_BACKDROP_PLANE -3 //Black square just over openspace plane to guaranteed cover all in openspace turf
+
#define FLOOR_PLANE -2
#define FLOOR_PLANE_RENDER_TARGET "FLOOR_PLANE"
#define GAME_PLANE -1
@@ -105,10 +109,6 @@
#define ABOVE_LIGHTING_LAYER 16
#define ABOVE_LIGHTING_RENDER_TARGET "ABOVE_LIGHTING_PLANE"
-#define FLOOR_OPENSPACE_PLANE 17
-#define OPENSPACE_LAYER 17
-#define OPENSPACE_RENDER_TARGET "OPENSPACE_PLANE"
-
#define BYOND_LIGHTING_PLANE 18
#define BYOND_LIGHTING_LAYER 18
#define BYOND_LIGHTING_RENDER_TARGET "BYOND_LIGHTING_PLANE"
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index eee0676dec..5a26feb624 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -22,14 +22,14 @@
//used in design to specify which machine can build it
#define IMPRINTER (1<<0) //For circuits. Uses glass/chemicals.
-#define PROTOLATHE (1<<1) //New stuff. Uses glass/metal/chemicals
-#define AUTOLATHE (1<<2) //Uses glass/metal only.
-#define CRAFTLATHE (1<<3) //Uses fuck if I know. For use eventually.
-#define MECHFAB (1<<4) //Remember, objects utilising this flag should have construction_time and construction_cost vars.
-#define BIOGENERATOR (1<<5) //Uses biomass
-#define LIMBGROWER (1<<6) //Uses synthetic flesh
-#define SMELTER (1<<7) //uses various minerals
-#define AUTOYLATHE (1<<8) // CITADEL ADD
+#define PROTOLATHE (1<<1) //New stuff. Uses materials/chemicals
+#define AUTOLATHE (1<<2) //Uses materials only.
+#define TOYLATHE (1<<3) //Glass/metal/plastic. Meant for toys.
+#define NO_PUBLIC_LATHE (1<<4) //prevents the design from being auto-unlocked by public auto(y)lathes.
+#define MECHFAB (1<<5) //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define BIOGENERATOR (1<<6) //Uses biomass
+#define LIMBGROWER (1<<7) //Uses synthetic flesh
+#define SMELTER (1<<8) //uses various minerals
#define NANITE_COMPILER (1<<9) //Prints nanite disks
#define AUTOBOTTLER (1<<10) //Uses booze, for printing
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 37633ae52f..8bc8c8bebe 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -515,3 +515,17 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define NIGHTSHIFT_AREA_NONE 4 //default/highest.
#define UNTIL(X) while(!(X)) stoplag()
+
+
+//Scavenging element defines for special loot "events".
+#define SCAVENGING_FOUND_NOTHING "found_nothing"
+#define SCAVENGING_SPAWN_MOUSE "spawn_mouse"
+#define SCAVENGING_SPAWN_MICE "spawn_mice"
+#define SCAVENGING_SPAWN_TOM "spawn_tom_the_mouse"
+
+//Scavenging element defines for ckey/mind restrictions.
+#define NO_LOOT_RESTRICTION 0
+#define LOOT_RESTRICTION_MIND 1
+#define LOOT_RESTRICTION_CKEY 2
+#define LOOT_RESTRICTION_MIND_PILE 3 //limited to the current pile.
+#define LOOT_RESTRICTION_CKEY_PILE 4 //Idem
diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm
index 9feb5f40c5..60effc7265 100644
--- a/code/__DEFINES/research.dm
+++ b/code/__DEFINES/research.dm
@@ -60,7 +60,8 @@
#define DESIGN_ID_IGNORE "IGNORE_THIS_DESIGN"
-#define RESEARCH_MATERIAL_RECLAMATION_ID "__materials"
+#define RESEARCH_MATERIAL_RECLAMATION_ID "__materials"
+#define RESEARCH_DEEP_SCAN_ID "__deepscan"
//When adding new types, update the list below!
#define TECHWEB_POINT_TYPE_GENERIC "General Research"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index d93a89a179..e69052ad8d 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -317,7 +317,7 @@ GLOBAL_LIST_EMPTY(species_list)
else
return "unknown"
-/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = 0)
+/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = FALSE, resume_time = 0 SECONDS)
if(!user || !target)
return 0
var/user_loc = user.loc
@@ -336,10 +336,10 @@ GLOBAL_LIST_EMPTY(species_list)
var/endtime = world.time+time
var/starttime = world.time
. = 1
- while (world.time < endtime)
+ while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
- progbar.update(world.time - starttime)
+ progbar.update(world.time - starttime + resume_time)
if(QDELETED(user) || QDELETED(target))
. = 0
break
@@ -371,7 +371,7 @@ GLOBAL_LIST_EMPTY(species_list)
checked_health["health"] = health
return ..()
-/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE))
+/proc/do_after(mob/user, var/delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null, required_mobility_flags = (MOBILITY_USE|MOBILITY_MOVE), resume_time = 0 SECONDS)
if(!user)
return 0
var/atom/Tloc = null
@@ -400,10 +400,10 @@ GLOBAL_LIST_EMPTY(species_list)
var/starttime = world.time
. = 1
var/mob/living/L = isliving(user) && user //evals to last thing eval'd
- while (world.time < endtime)
+ while (world.time + resume_time < endtime)
stoplag(1)
if (progress)
- progbar.update(world.time - starttime)
+ progbar.update(world.time - starttime + resume_time)
if(drifting && !user.inertia_dir)
drifting = 0
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 7cbfbd040a..aa388d7413 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -563,7 +563,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- objective_parts += "Objective #[count]: [objective.explanation_text] Success!"
+ objective_parts += "Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
objective_parts += "Objective #[count]: [objective.explanation_text] Fail."
else
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index c1ca671044..c4ed2d9266 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -265,5 +265,15 @@ GLOBAL_LIST_INIT(bitfields, list(
"STORAGE_LIMIT_MAX_W_CLASS" = STORAGE_LIMIT_MAX_W_CLASS,
"STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS,
"STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME
+ ),
+ "vis_flags" = list(
+ "VIS_INHERIT_ICON" = VIS_INHERIT_ICON,
+ "VIS_INHERIT_ICON_STATE" = VIS_INHERIT_ICON_STATE,
+ "VIS_INHERIT_DIR" = VIS_INHERIT_DIR,
+ "VIS_INHERIT_LAYER" = VIS_INHERIT_LAYER,
+ "VIS_INHERIT_PLANE" = VIS_INHERIT_PLANE,
+ "VIS_INHERIT_ID" = VIS_INHERIT_ID,
+ "VIS_UNDERLAY" = VIS_UNDERLAY,
+ "VIS_HIDE" = VIS_HIDE
)
))
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index 04d4c2888a..959a62ebf8 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -43,15 +43,26 @@ GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup)
GLOBAL_LIST_EMPTY(latejoiners) //CIT CHANGE - All latejoining people, for traitor-target purposes.
/proc/update_config_movespeed_type_lookup(update_mobs = TRUE)
- var/list/mob_types = list()
+ // NOTE: This is entirely based on the fact that byond typesof/subtypesof gets longer/deeper paths before shallower ones.
+ // If that ever breaks this entire proc breaks.
+ var/list/mob_types = typesof(/mob)
var/list/entry_value = CONFIG_GET(keyed_list/multiplicative_movespeed)
+ var/list/configured_types = list()
for(var/path in entry_value)
var/value = entry_value[path]
- if(!value)
+ if(isnull(value))
continue
+ // associative list sets for elements that already exist preserve order
+ mob_types[path] = value
+ // now go back up through it to set everything, making absolute sure that base paths are overridden by child paths all the way down the path tree.
+ for(var/i in length(mob_types) to 1 step -1)
+ var/path = mob_types[i]
+ if(isnull(mob_types[path]))
+ continue
+ // we're going from bottom to top so it should be safe to do this without further checks..
for(var/subpath in typesof(path))
- mob_types[subpath] = value
- GLOB.mob_config_movespeed_type_lookup = mob_types
+ configured_types[subpath] = mob_types[path]
+ GLOB.mob_config_movespeed_type_lookup = configured_types
if(update_mobs)
update_mob_config_movespeeds()
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index 7a8cc20d76..a0dade37bd 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -19,7 +19,7 @@
///Things rendered on "openspace"; holes in multi-z
/obj/screen/plane_master/openspace
name = "open space plane master"
- plane = FLOOR_OPENSPACE_PLANE
+ plane = OPENSPACE_BACKDROP_PLANE
appearance_flags = PLANE_MASTER
blend_mode = BLEND_MULTIPLY
alpha = 255
@@ -106,8 +106,8 @@
*
* You really shouldn't be directly using this, use atom helpers instead
*/
-/obj/screen/plane_master/emissive_unblockable
- name = "emissive mob plane master"
+/obj/screen/plane_master/emissive_blocker
+ name = "emissive blocker plane master"
plane = EMISSIVE_BLOCKER_PLANE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
render_target = EMISSIVE_BLOCKER_RENDER_TARGET
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index a255afaba0..c0b6467f27 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -44,6 +44,13 @@ SUBSYSTEM_DEF(mapping)
var/stat_map_name = "Loading..."
+ /// Lookup list for random generated IDs.
+ var/list/random_generated_ids_by_original = list()
+ /// next id for separating obfuscated ids.
+ var/obfuscation_next_id = 1
+ /// "secret" key
+ var/obfuscation_secret
+
//dlete dis once #39770 is resolved
/datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig()
if(!config)
@@ -54,6 +61,10 @@ SUBSYSTEM_DEF(mapping)
#endif
stat_map_name = config.map_name
+/datum/controller/subsystem/mapping/PreInit()
+ if(!obfuscation_secret)
+ obfuscation_secret = md5(GUID()) //HAH! Guess this!
+
/datum/controller/subsystem/mapping/Initialize(timeofday)
HACK_LoadMapConfig()
if(initialized)
@@ -590,3 +601,15 @@ GLOBAL_LIST_EMPTY(the_station_areas)
LM.load()
if(GLOB.stationroom_landmarks.len)
seedStation() //I'm sure we can trust everyone not to insert a 1x1 rooms which loads a landmark which loads a landmark which loads a la...
+
+/**
+ * Generates an obfuscated but constant id for an original id for cases where you don't want players codediving for an id.
+ * WARNING: MAKE SURE PLAYERS ARE NOT ABLE TO ACCESS THIS. To save performance, it's just secret + an incrementing number. Very guessable if you know what the secret is.
+ */
+/datum/controller/subsystem/mapping/proc/get_obfuscated_id(original, id_type = "GENERAL")
+ if(!original)
+ return //no.
+ var/key = "[original]%[id_type]"
+ if(random_generated_ids_by_original[key])
+ return random_generated_ids_by_original[key]
+ . = random_generated_ids_by_original[key] = "[obfuscation_secret]%[obfuscation_next_id++]"
diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm
deleted file mode 100644
index b5740650e9..0000000000
--- a/code/datums/components/archaeology.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-/datum/component/archaeology
- dupe_mode = COMPONENT_DUPE_UNIQUE
- var/list/archdrops = list(/obj/item/bikehorn = list(ARCH_PROB = 100, ARCH_MAXDROP = 1)) // honk~
- var/prob2drop
- var/dug
- var/datum/callback/callback
-
-/datum/component/archaeology/Initialize(list/_archdrops = list(), datum/callback/_callback)
- archdrops = _archdrops
- for(var/i in archdrops)
- if(isnull(archdrops[i][ARCH_MAXDROP]))
- archdrops[i][ARCH_MAXDROP] = 1
- stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null max_drop value in [i].")
- if(isnull(archdrops[i][ARCH_PROB]))
- archdrops[i][ARCH_PROB] = 100
- stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null probability value in [i].")
- callback = _callback
- RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/Dig)
- RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/BombDig)
- RegisterSignal(parent, COMSIG_ATOM_SING_PULL, .proc/SingDig)
-
-/datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original)
- var/list/other_archdrops = A.archdrops
- var/list/_archdrops = archdrops
- for(var/I in other_archdrops)
- _archdrops[I] += other_archdrops[I]
-
-/datum/component/archaeology/proc/Dig(datum/source, obj/item/I, mob/living/user)
- if(dug)
- to_chat(user, "Looks like someone has dug here already.")
- return
-
- if(!isturf(user.loc))
- return
-
- if(I.tool_behaviour == TOOL_SHOVEL || I.tool_behaviour == TOOL_MINING)
- to_chat(user, "You start digging...")
-
- if(I.use_tool(parent, user, 40, volume=50))
- to_chat(user, "You dig a hole.")
- gets_dug()
- dug = TRUE
- SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type)
- return COMPONENT_NO_AFTERATTACK
-
-/datum/component/archaeology/proc/gets_dug()
- if(dug)
- return
- else
- var/turf/open/OT = get_turf(parent)
- for(var/thing in archdrops)
- var/maxtodrop = archdrops[thing][ARCH_MAXDROP]
- for(var/i in 1 to maxtodrop)
- if(prob(archdrops[thing][ARCH_PROB])) // can't win them all!
- new thing(OT)
-
- if(isopenturf(OT))
- if(OT.postdig_icon_change)
- if(istype(OT, /turf/open/floor/plating/asteroid/) && !OT.postdig_icon)
- var/turf/open/floor/plating/asteroid/AOT = parent
- AOT.icon_plating = "[AOT.environment_type]_dug"
- AOT.icon_state = "[AOT.environment_type]_dug"
- else
- if(isplatingturf(OT))
- var/turf/open/floor/plating/POT = parent
- POT.icon_plating = "[POT.postdig_icon]"
- POT.icon_state = "[OT.postdig_icon]"
-
- if(OT.slowdown) //Things like snow slow you down until you dig them.
- OT.slowdown = 0
- dug = TRUE
- if(callback)
- callback.Invoke()
-
-/datum/component/archaeology/proc/SingDig(datum/source, S, current_size)
- switch(current_size)
- if(STAGE_THREE)
- if(prob(30))
- gets_dug()
- if(STAGE_FOUR)
- if(prob(50))
- gets_dug()
- else
- if(current_size >= STAGE_FIVE && prob(70))
- gets_dug()
-
-/datum/component/archaeology/proc/BombDig(datum/source, severity, target)
- switch(severity)
- if(3)
- return
- if(2)
- if(prob(20))
- gets_dug()
- if(1)
- gets_dug()
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index 9eb3fcaaea..14ab751d2b 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -260,6 +260,15 @@
subcategory = CAT_TOOL
category = CAT_MISC
+/datum/crafting_recipe/electrochromatic_kit
+ name = "Electrochromatic Kit"
+ result = /obj/item/electronics/electrochromatic_kit
+ reqs = list(/obj/item/stack/sheet/metal = 1,
+ /obj/item/stack/cable_coil = 1)
+ time = 5
+ subcategory = CAT_TOOL
+ category = CAT_MISC
+
////////////
//Vehicles//
////////////
diff --git a/code/datums/components/identification.dm b/code/datums/components/identification.dm
new file mode 100644
index 0000000000..f7dc211504
--- /dev/null
+++ b/code/datums/components/identification.dm
@@ -0,0 +1,88 @@
+/**
+ * Identification components
+ */
+/datum/component/identification
+ /// General flags for how we should work.
+ var/identification_flags = NONE
+ /// General flags for what we should do.
+ var/identification_effect_flags = NONE
+ /// General flags for how we can be identified.
+ var/identification_method_flags = NONE
+ /// If this is set, show this on examine to the examiner if they know how to use it.
+ var/additional_examine_text = "You seem to know more about this item than others.."
+ /// Added to deconstructive analyzer say on success if set
+ var/deconstructor_reveal_text = "item operation instructions"
+
+/datum/component/identification/Initialize(id_flags, id_effect_flags, id_method_flags)
+ if(!isobj(parent))
+ return COMPONENT_INCOMPATIBLE
+ . = ..()
+ if(. & COMPONENT_INCOMPATIBLE)
+ return
+ identification_flags = id_flags
+ identification_effect_flags = id_effect_flags
+ identification_method_flags = id_method_flags
+
+/datum/component/identification/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ if(identification_effect_flags & ID_COMPONENT_EFFECT_NO_ACTIONS)
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
+ if(identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR)
+ RegisterSignal(parent, COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN, .proc/on_deconstructor_deepscan)
+
+/datum/component/identification/UnregisterFromParent()
+ var/list/unregister = list(COMSIG_PARENT_EXAMINE)
+ if(identification_effect_flags & ID_COMPONENT_EFFECT_NO_ACTIONS)
+ unregister += COMSIG_ITEM_EQUIPPED
+ if(identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR)
+ unregister += COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN
+ UnregisterSignal(parent, unregister)
+
+/datum/component/identification/proc/on_examine(datum/source, mob/user, list/returnlist)
+ if(check_knowledge(user) != ID_COMPONENT_KNOWLEDGE_FULL)
+ return
+ if(!additional_examine_text)
+ return
+ returnlist += additional_examine_text
+
+/datum/component/identification/vv_edit_var(var_name, var_value)
+ // since i care SOOO much about memory optimization, we only register signals we need to
+ // so when someone vv's us, we should probably make sure we have the ones we need to with an update.
+ if((var_value == NAMEOF(src, identification_flags)) || (var_value == NAMEOF(src, identification_effect_flags)) || (var_value == NAMEOF(src, identification_method_flags)))
+ UnregisterFromParent()
+ . = ..()
+ if((var_value == NAMEOF(src, identification_flags)) || (var_value == NAMEOF(src, identification_effect_flags)) || (var_value == NAMEOF(src, identification_method_flags)))
+ RegisterWithParent()
+
+/datum/component/identification/proc/on_equip(datum/source, mob/user)
+ if(check_knowledge(user) == ID_COMPONENT_KNOWLEDGE_FULL)
+ return
+ if(identification_method_flags & ID_COMPONENT_EFFECT_NO_ACTIONS)
+ return COMPONENT_NO_GRANT_ACTIONS
+
+/datum/component/identification/proc/check_knowledge(mob/user)
+ return ID_COMPONENT_KNOWLEDGE_NONE
+
+/datum/component/identification/proc/on_identify(mob/user)
+ if(identification_flags & ID_COMPONENT_DEL_ON_IDENTIFY)
+ qdel(src)
+
+/datum/component/identification/proc/on_deconstructor_deepscan(datum/source, obj/machinery/rnd/destructive_analyzer/analyzer, mob/user, list/information = list())
+ if((identification_method_flags & ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) && !(identification_flags & ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED))
+ identification_flags |= ID_COMPONENT_DECONSTRUCTOR_DEEPSCANNED
+ on_identify(user)
+ if(deconstructor_reveal_text)
+ information += deconstructor_reveal_text
+ return COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION
+
+/**
+ * Identification component subtype - Syndicate
+ *
+ * Checks if the user is a traitor.
+ */
+/datum/component/identification/syndicate
+
+/datum/component/identification/syndicate/check_knowledge(mob/user)
+ . = ..()
+ if(user?.mind?.has_antag_datum(/datum/antagonist/traitor))
+ . = max(., ID_COMPONENT_KNOWLEDGE_FULL)
diff --git a/code/datums/elements/scavenging.dm b/code/datums/elements/scavenging.dm
new file mode 100644
index 0000000000..1993005be7
--- /dev/null
+++ b/code/datums/elements/scavenging.dm
@@ -0,0 +1,215 @@
+ /*
+ * Scavenging element. Its scope shouldn't elude your imagination.
+ * Basically loot piles that can be searched through for some items.
+ * In my opinion, these are more engaging than normal maintenance loot spawners.
+ * The loot doesn't have to be strictly made of items and objects, you could also use it to invoke some "events"
+ * such as mice, rats, an halloween spook, persistent relics, traps, etcetera, go wild.
+ */
+/datum/element/scavenging
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 3
+
+ var/list/loot_left_per_atom = list() //loot left per attached atom.
+ var/list/loot_table //pickweight list of available loot.
+ var/list/unique_loot //limited loot, once the associated value reaches zero, its key is removed from loot_table
+ var/scavenge_time = 12 SECONDS //how much time it takes
+ var/can_use_hands = TRUE //bare handed scavenge time multiplier. If set to zero, only tools are usable.
+ var/list/tool_types //which tool types the player can use instead of scavenging by hand, associated value is their speed.
+ var/del_atom_on_depletion = FALSE //Will the atom be deleted when there is no loot left?
+ var/list/search_texts = list("starts searching through", "start searching through", "You hear rummaging...")
+ var/loot_restriction = NO_LOOT_RESTRICTION
+ var/maximum_loot_per_player = 1 //only relevant if there is a restriction.
+ var/list/scavenger_restriction_list //used for restrictions.
+
+ var/mean_loot_weight = 0
+ var/list/progress_per_atom = list() //seconds of ditched progress per atom, used to resume the work instead of starting over.
+ var/static/list/players_busy_scavenging = list() //players already busy scavenging.
+
+/datum/element/scavenging/Attach(atom/target, amount = 5, list/loot, list/unique, time = 12 SECONDS, hands = TRUE, list/tools, list/texts, \
+ del_deplete = FALSE, restriction = NO_LOOT_RESTRICTION, max_per_player = 1)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE || !length(loot) || !amount || !istype(target) || isarea(target))
+ return ELEMENT_INCOMPATIBLE
+ loot_left_per_atom[target] = amount
+ if(!loot_table)
+ loot_table = loot
+ for(var/A in loot_table) //tally the list weights
+ mean_loot_weight += loot_table[A]
+ mean_loot_weight /= length(loot_table)
+ if(!unique_loot)
+ unique_loot = unique || list()
+ scavenge_time = time
+ can_use_hands = hands
+ tool_types = tools
+ if(texts)
+ search_texts = texts
+ del_atom_on_depletion = del_deplete
+ loot_restriction = restriction
+ maximum_loot_per_player = max_per_player
+ if(can_use_hands)
+ RegisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW), .proc/scavenge_barehanded)
+ if(tool_types)
+ RegisterSignal(target, COMSIG_PARENT_ATTACKBY, .proc/scavenge_tool)
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+
+/datum/element/scavenging/Detach(atom/target)
+ . = ..()
+ loot_left_per_atom -= target
+ progress_per_atom -= target
+ if(maximum_loot_per_player == LOOT_RESTRICTION_MIND_PILE || maximum_loot_per_player == LOOT_RESTRICTION_CKEY_PILE)
+ maximum_loot_per_player -= target
+ UnregisterSignal(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE))
+
+/datum/element/scavenging/proc/on_examine(atom/source, mob/user, list/examine_list)
+ var/methods = tool_types.Copy()
+ if(can_use_hands)
+ methods += list("bare handed")
+ if(!length(methods))
+ return
+ var/text = english_list(methods, "", " or ")
+ examine_list += "Looks like [source.p_they()] can be scavenged [length(tool_types) ? "with" : ""][length(methods == 1) ? "" : "either "][length(tool_types) ? "a " : ""][text]"
+
+/datum/element/scavenging/proc/scavenge_barehanded(atom/source, mob/user)
+ scavenge(source, user, 1)
+ return COMPONENT_NO_ATTACK_HAND
+
+/datum/element/scavenging/proc/scavenge_tool(atom/source, obj/item/I, mob/user, params)
+ if(user.a_intent == INTENT_HARM || !I.tool_behaviour) //Robust trash disposal techniques!
+ return
+ var/speed_multi = tool_types[I.tool_behaviour]
+ if(!speed_multi)
+ return
+ scavenge(source, user, speed_multi)
+ return COMPONENT_NO_AFTERATTACK
+
+/// This proc has to be asynced (cough cough, do_after) in order to return the comsig values in time to stop the attack chain.
+/datum/element/scavenging/proc/scavenge(atom/source, mob/user, speed_multi = 1)
+ set waitfor = FALSE
+
+ if(players_busy_scavenging[user])
+ return
+ players_busy_scavenging[user] = TRUE
+ var/progress_done = progress_per_atom[source]
+ var/len_messages = length(search_texts)
+ var/msg_first_person
+ if(len_messages >= 2)
+ msg_first_person = "You [progress_done ? ", resume a ditched task and " : ""][search_texts[2]] [source]."
+ var/msg_blind
+ if(len_messages >= 3)
+ msg_blind = "[search_texts[3]]"
+ user.visible_message("[user] [search_texts[1]] [source].", msg_first_person, msg_blind)
+ if(do_after(user, scavenge_time * speed_multi, TRUE, source, TRUE, CALLBACK(src, .proc/set_progress, source, world.time), resume_time = progress_done * speed_multi))
+ spawn_loot(source, user)
+ players_busy_scavenging -= user
+
+/datum/element/scavenging/proc/set_progress(atom/source, start_time)
+ progress_per_atom[source] = world.time - start_time
+ return TRUE
+
+/datum/element/scavenging/proc/spawn_loot(atom/source, mob/user)
+ progress_per_atom -= source
+
+ var/loot = pickweight(loot_table)
+ var/special = TRUE
+ var/free = FALSE
+ if(!loot_left_per_atom[source])
+ to_chat(user, "Looks likes there is nothing worth of interest left in [source], what a shame...")
+ return
+
+ var/num_times = 0
+ switch(loot_restriction)
+ if(LOOT_RESTRICTION_MIND)
+ num_times = LAZYACCESS(scavenger_restriction_list, user.mind)
+ if(LOOT_RESTRICTION_CKEY)
+ num_times = LAZYACCESS(scavenger_restriction_list, user.ckey)
+ if(LOOT_RESTRICTION_MIND_PILE)
+ var/list/L = LAZYACCESS(scavenger_restriction_list, source)
+ if(L)
+ num_times = LAZYACCESS(L, user.mind)
+ if(LOOT_RESTRICTION_CKEY_PILE)
+ var/list/L = LAZYACCESS(scavenger_restriction_list, source)
+ if(L)
+ num_times = LAZYACCESS(L, user.ckey)
+ if(num_times >= maximum_loot_per_player)
+ to_chat(user, "You can't find anything else vaguely useful in [source]. Another set of eyes might, however.")
+ return
+
+ switch(loot) // TODO: datumize these out.
+ if(SCAVENGING_FOUND_NOTHING)
+ to_chat(user, "You found nothing, better luck next time.")
+ free = TRUE //doesn't consume the loot pile.
+ if(SCAVENGING_SPAWN_MOUSE)
+ var/nasty_rodent = pick("mouse", "rodent", "squeaky critter", "stupid pest", "annoying cable chewer", "nasty, ugly, evil, disease-ridden rodent")
+ to_chat(user, "You found something in [source]... no wait, that's just another [nasty_rodent].")
+ new /mob/living/simple_animal/mouse(source.loc)
+ if(SCAVENGING_SPAWN_MICE)
+ user.visible_message("A small gang of mice emerges from [source].", \
+ "You found something in [source]... no wait, that's just another- no wait, that's a lot of damn mice.")
+ for(var/i in 1 to rand(4, 6))
+ new /mob/living/simple_animal/mouse(source.loc)
+ if(SCAVENGING_SPAWN_TOM)
+ if(GLOB.tom_existed) //There can only be one.
+ to_chat(user, "You found nothing, better luck next time.")
+ free = TRUE
+ else
+ to_chat(user, "You found something in [source]... no wait, that's Tom, the mouse! What is he doing here?")
+ new /mob/living/simple_animal/mouse/brown/Tom(source.loc)
+ else
+ special = FALSE
+
+ if(!special) //generic loot. Nothing too strange like more loot spawners anyway.
+ var/atom/A = new loot(source.loc)
+ if(isitem(A) && !user.get_active_held_item())
+ user.put_in_hands(A)
+ var/rarity_append = "."
+ switch(loot_table[loot]/mean_loot_weight*100)
+ if(0 to 1)
+ rarity_append = "! AMAZING!"
+ if(1 to 2)
+ rarity_append = "! Woah!"
+ if(2 to 5)
+ rarity_append = ". Rare!"
+ if(5 to 10)
+ rarity_append = ". Great."
+ if(10 to 25)
+ rarity_append = ". Nice."
+ if(20 to 50)
+ rarity_append = ". Not bad."
+ to_chat(user, "You found something in [source]... it's \a [A][rarity_append]")
+
+ if(unique_loot[loot])
+ var/loot_left = --unique_loot[loot]
+ if(!loot_left)
+ loot_table -= loot
+ unique_loot -= loot
+ mean_loot_weight = 0
+ for(var/A in loot_table) //re-tally the list weights
+ mean_loot_weight += loot_table[A]
+ mean_loot_weight /= length(loot_table)
+
+ if(free)
+ return
+
+ --loot_left_per_atom[source]
+ if(del_atom_on_depletion && !loot_left_per_atom[source])
+ source.visible_message("[source] has been looted clean.")
+ qdel(source)
+ return
+
+ if(!loot_restriction)
+ return
+
+ LAZYINITLIST(scavenger_restriction_list)
+ switch(loot_restriction)
+ if(LOOT_RESTRICTION_MIND)
+ scavenger_restriction_list[user.mind]++
+ if(LOOT_RESTRICTION_CKEY)
+ scavenger_restriction_list[user.ckey]++
+ if(LOOT_RESTRICTION_MIND_PILE)
+ LAZYINITLIST(scavenger_restriction_list[source])
+ var/list/L = scavenger_restriction_list[source]
+ L[user.mind]++
+ if(LOOT_RESTRICTION_CKEY_PILE)
+ LAZYINITLIST(scavenger_restriction_list[source])
+ var/list/L = scavenger_restriction_list[source]
+ L[user.ckey]++
diff --git a/code/datums/wires/autoylathe.dm b/code/datums/wires/autoylathe.dm
deleted file mode 100644
index 736c9551ec..0000000000
--- a/code/datums/wires/autoylathe.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/datum/wires/autoylathe
- holder_type = /obj/machinery/autoylathe
- proper_name = "Autoylathe"
-
-/datum/wires/autoylathe/New(atom/holder)
- wires = list(
- WIRE_HACK, WIRE_DISABLE,
- WIRE_SHOCK, WIRE_ZAP
- )
- add_duds(6)
- ..()
-
-/datum/wires/autoylathe/interactable(mob/user)
- var/obj/machinery/autoylathe/A = holder
- if(A.panel_open)
- return TRUE
-
-/datum/wires/autoylathe/get_status()
- var/obj/machinery/autoylathe/A = holder
- var/list/status = list()
- status += "The red light is [A.disabled ? "on" : "off"]."
- status += "The blue light is [A.hacked ? "on" : "off"]."
- return status
-
-/datum/wires/autoylathe/on_pulse(wire)
- var/obj/machinery/autoylathe/A = holder
- switch(wire)
- if(WIRE_HACK)
- A.adjust_hacked(!A.hacked)
- addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
- if(WIRE_SHOCK)
- A.shocked = !A.shocked
- addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
- if(WIRE_DISABLE)
- A.disabled = !A.disabled
- addtimer(CALLBACK(A, /obj/machinery/autoylathe.proc/reset, wire), 60)
-
-/datum/wires/autoylathe/on_cut(wire, mend)
- var/obj/machinery/autoylathe/A = holder
- switch(wire)
- if(WIRE_HACK)
- A.adjust_hacked(!mend)
- if(WIRE_HACK)
- A.shocked = !mend
- if(WIRE_DISABLE)
- A.disabled = !mend
- if(WIRE_ZAP)
- A.shock(usr, 50)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index cc6f84a18f..b86c7e9729 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -68,7 +68,7 @@
if(vs.plane == EMISSIVE_BLOCKER_PLANE)
SSvis_overlays.remove_vis_overlay(src, list(vs))
break
- SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE)
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir)
/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction)
if(!direction)
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index e6e10941c4..659d50c077 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -839,3 +839,11 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
return RULE_OF_THREE(40, 20, x) + 50
if (20 to INFINITY)
return rand(90, 100)
+
+/datum/game_mode/dynamic/ghost_info()
+ . = list()
+ . += "Current threat: [threat]"
+ . += "Target threat: [threat_level]"
+ . += "Storyteller: [storyteller.name]
"
+ . += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
"
+ . += "On average, [peaceful_percentage]% of the rounds are more peaceful.
"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 57919863f2..e2c549d911 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -604,3 +604,7 @@
/// Mode specific admin panel.
/datum/game_mode/proc/admin_panel()
return
+
+/// Mode specific info for ghost game_info
+/datum/game_mode/proc/ghost_info()
+ return
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 64704d4771..edb31e9dbd 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -28,11 +28,11 @@
var/prod_coeff = 1
var/datum/design/being_built
- var/datum/techweb/stored_research
var/list/datum/design/matching_designs
var/selected_category
var/screen = 1
+ var/datum/techweb/stored_research = /datum/techweb/specialized/autounlocking/autolathe
var/list/categories = list(
"Tools",
"Electronics",
@@ -45,9 +45,7 @@
"Dinnerware",
"Imported"
)
-
-/obj/machinery/autolathe/Initialize()
- var/static/list/allowed_types = list(
+ var/list/allowed_materials = list(
/datum/material/iron,
/datum/material/glass,
/datum/material/gold,
@@ -63,10 +61,12 @@
/datum/material/adamantine,
/datum/material/mythril
)
- AddComponent(/datum/component/material_container, allowed_types, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
+
+/obj/machinery/autolathe/Initialize()
+ AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
. = ..()
wires = new /datum/wires/autolathe(src)
- stored_research = new /datum/techweb/specialized/autounlocking/autolathe
+ stored_research = new stored_research
matching_designs = list()
/obj/machinery/autolathe/Destroy()
@@ -91,7 +91,7 @@
if(AUTOLATHE_SEARCH_MENU)
dat = search_win(user)
- var/datum/browser/popup = new(user, "autolathe", name, 400, 500)
+ var/datum/browser/popup = new(user, name, name, 400, 500)
popup.set_content(dat)
popup.open()
@@ -439,3 +439,32 @@
desc = "An autolathe reprogrammed with security protocols to prevent hacking."
hackable = FALSE
circuit = /obj/item/circuitboard/machine/autolathe/secure
+ stored_research = /datum/techweb/specialized/autounlocking/autolathe/public
+
+/obj/machinery/autolathe/toy
+ name = "autoylathe"
+ desc = "It produces toys using plastic, metal and glass."
+ circuit = /obj/item/circuitboard/machine/autolathe/toy
+
+ stored_research = /datum/techweb/specialized/autounlocking/autolathe/toy
+ categories = list(
+ "Toys",
+ "Figurines",
+ "Pistols",
+ "Rifles",
+ "Heavy",
+ "Melee",
+ "Armor",
+ "Adult",
+ "Misc",
+ "Imported"
+ )
+ allowed_materials = list(
+ /datum/material/iron,
+ /datum/material/glass,
+ /datum/material/plastic
+ )
+
+/obj/machinery/autolathe/toy/hacked/Initialize()
+ . = ..()
+ adjust_hacked(TRUE)
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index ad3dd5d720..3a90707bbe 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -16,6 +16,9 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
+ if(istext(id) && mapload)
+ if(copytext(id, 1, 2) == "!")
+ id = SSmapping.get_obfuscated_id(id)
. = ..()
if(built)
setDir(ndir)
@@ -260,6 +263,11 @@
req_access = list()
id = 1
+/obj/machinery/button/electrochromatic
+ name = "window dim control"
+ desc = "Controls linked electrochromatic windows"
+ device_type = /obj/item/assembly/control/electrochromatic
+
/obj/item/wallframe/button
name = "button frame"
desc = "Used for building buttons."
diff --git a/code/game/machinery/toylathe.dm b/code/game/machinery/toylathe.dm
deleted file mode 100644
index 4e039d304c..0000000000
--- a/code/game/machinery/toylathe.dm
+++ /dev/null
@@ -1,415 +0,0 @@
-#define AUTOYLATHE_MAIN_MENU 1
-#define AUTOYLATHE_CATEGORY_MENU 2
-#define AUTOYLATHE_SEARCH_MENU 3
-
-/obj/machinery/autoylathe
- name = "autoylathe"
- desc = "It produces toys using plastic, metal and glass."
- icon_state = "autolathe"
- density = TRUE
- use_power = IDLE_POWER_USE
- idle_power_usage = 10
- active_power_usage = 100
- circuit = /obj/item/circuitboard/machine/autoylathe
- layer = BELOW_OBJ_LAYER
-
- var/operating = FALSE
- var/list/L = list()
- var/list/LL = list()
- var/hacked = FALSE
- var/disabled = 0
- var/shocked = FALSE
- var/hack_wire
- var/disable_wire
- var/shock_wire
-
- var/busy = FALSE
- var/prod_coeff = 1
-
- var/datum/design/being_built
- var/datum/techweb/stored_research
- var/list/datum/design/matching_designs
- var/selected_category
- var/screen = 1
-
- var/list/categories = list(
- "Toys",
- "Figurines",
- "Pistols",
- "Rifles",
- "Heavy",
- "Melee",
- "Armor",
- "Adult",
- "Misc",
- "Imported"
- )
-
-/obj/machinery/autoylathe/Initialize()
- var/static/list/allowed_materials = list(
- /datum/material/iron,
- /datum/material/glass,
- /datum/material/plastic
- )
- AddComponent(/datum/component/material_container, allowed_materials, 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
- . = ..()
-
- wires = new /datum/wires/autoylathe(src)
- stored_research = new /datum/techweb/specialized/autounlocking/autoylathe
- matching_designs = list()
-
-/obj/machinery/autoylathe/Destroy()
- QDEL_NULL(wires)
- return ..()
-
-/obj/machinery/autoylathe/ui_interact(mob/user)
- . = ..()
- if(!is_operational())
- return
-
- if(shocked && !(stat & NOPOWER))
- shock(user,50)
-
- var/dat
-
- switch(screen)
- if(AUTOYLATHE_MAIN_MENU)
- dat = main_win(user)
- if(AUTOYLATHE_CATEGORY_MENU)
- dat = category_win(user,selected_category)
- if(AUTOYLATHE_SEARCH_MENU)
- dat = search_win(user)
-
- var/datum/browser/popup = new(user, "Autoylathe", name, 400, 500)
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/autoylathe/on_deconstruction()
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- materials.retrieve_all()
-
-/obj/machinery/autoylathe/attackby(obj/item/O, mob/user, params)
- if (busy)
- to_chat(user, "The autoylathe is busy. Please wait for completion of previous operation.")
- return TRUE
-
- if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
- updateUsrDialog()
- return TRUE
-
- if(default_deconstruction_crowbar(O))
- return TRUE
-
- if(panel_open && is_wire_tool(O))
- wires.interact(user)
- return TRUE
-
- if(user.a_intent == INTENT_HARM) //so we can hit the machine
- return ..()
-
- if(stat)
- return TRUE
-
- if(istype(O, /obj/item/disk/design_disk))
- user.visible_message("[user] begins to load \the [O] in \the [src]...",
- "You begin to load a design from \the [O]...",
- "You hear the chatter of a floppy drive.")
- busy = TRUE
- var/obj/item/disk/design_disk/D = O
- if(do_after(user, 14.4, target = src))
- for(var/B in D.blueprints)
- if(B)
- stored_research.add_design(B)
- busy = FALSE
- return TRUE
-
- return ..()
-
-/obj/machinery/autoylathe/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted)
- if(item_inserted.custom_materials?.len && item_inserted.custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])
- flick("autolathe_r",src)//plays glass insertion animation by default otherwise
- else
- flick("autolathe_o",src)//plays metal insertion animation
-
- use_power(min(1000, amount_inserted / 100))
- updateUsrDialog()
-
-/obj/machinery/autoylathe/Topic(href, href_list)
- if(..())
- return
- if (!busy)
- if(href_list["menu"])
- screen = text2num(href_list["menu"])
- updateUsrDialog()
-
- if(href_list["category"])
- selected_category = href_list["category"]
- updateUsrDialog()
-
- if(href_list["make"])
-
- /////////////////
- //href protection
- being_built = stored_research.isDesignResearchedID(href_list["make"])
- if(!being_built)
- return
-
- var/multiplier = text2num(href_list["multiplier"])
- var/is_stack = ispath(being_built.build_path, /obj/item/stack)
- multiplier = clamp(multiplier,1,50)
-
- /////////////////
-
- var/coeff = (is_stack ? 1 : prod_coeff) //stacks are unaffected by production coefficient
- var/total_amount = 0
- for(var/MAT in being_built.materials)
- total_amount += being_built.materials[MAT]
- var/power = max(2000, (total_amount)*multiplier/5) //Change this to use all materials
-
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
-
- var/list/materials_used = list()
- var/list/custom_materials = list() //These will apply their material effect, This should usually only be one.
-
- for(var/MAT in being_built.materials)
- var/datum/material/used_material = MAT
- var/amount_needed = being_built.materials[MAT] * coeff * multiplier
- if(istext(used_material)) //This means its a category
- var/list/list_to_show = list()
- for(var/i in SSmaterials.materials_by_category[used_material])
- if(materials.materials[i] > 0)
- list_to_show += i
-
- used_material = input("Choose [used_material]", "Custom Material") as null|anything in list_to_show
- if(!used_material)
- return //Didn't pick any material, so you can't build shit either.
- custom_materials[used_material] += amount_needed
-
- materials_used[used_material] = amount_needed
-
- if(materials.has_materials(materials_used))
- busy = TRUE
- use_power(power)
- icon_state = "autolathe_n"
- var/time = is_stack ? 32 : 32*coeff*multiplier
- addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time)
- else
- to_chat(usr, "Not enough materials for this operation.")
-
- if(href_list["search"])
- matching_designs.Cut()
-
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(findtext(D.name,href_list["to_search"]))
- matching_designs.Add(D)
- updateUsrDialog()
- else
- to_chat(usr, "The autoylathe is busy. Please wait for completion of previous operation.")
-
- updateUsrDialog()
-
- return
-
-/obj/machinery/autoylathe/proc/make_item(power, list/materials_used, list/picked_materials, multiplier, coeff, is_stack)
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/atom/A = drop_location()
- use_power(power)
- materials.use_materials(materials_used)
-
- if(is_stack)
- var/obj/item/stack/N = new being_built.build_path(A, multiplier)
- N.update_icon()
- N.autoylathe_crafted(src)
- else
- for(var/i=1, i<=multiplier, i++)
- var/obj/item/new_item = new being_built.build_path(A)
- new_item.autoylathe_crafted(src)
- if(length(picked_materials))
- new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount
- icon_state = "autolathe"
- busy = FALSE
- updateDialog()
-
-/obj/machinery/autoylathe/RefreshParts()
- var/T = 0
- for(var/obj/item/stock_parts/matter_bin/MB in component_parts)
- T += MB.rating*75000
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- materials.max_amount = T
- T=1.2
- for(var/obj/item/stock_parts/manipulator/M in component_parts)
- T -= M.rating*0.2
- prod_coeff = clamp(T,1,0) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
-
-/obj/machinery/autoylathe/proc/main_win(mob/user)
- var/dat = "
Autoylathe Menu:
"
- dat += materials_printout()
-
- dat += "
"
-
- var/line_length = 1
- dat += "
"
-
- for(var/C in categories)
- if(line_length > 2)
- dat += "
"
- line_length = 1
-
- dat += "| [C] | "
- line_length++
-
- dat += "
"
- return dat
-
-/obj/machinery/autoylathe/proc/category_win(mob/user,selected_category)
- var/dat = "Return to main menu"
- dat += "Browsing [selected_category]:
"
- dat += materials_printout()
-
- for(var/v in stored_research.researched_designs)
- var/datum/design/D = SSresearch.techweb_design_by_id(v)
- if(!(selected_category in D.category))
- continue
-
- if(disabled || !can_build(D))
- dat += "
[D.name]"
- else
- dat += "
[D.name]"
-
- if(ispath(D.build_path, /obj/item/stack))
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/max_multiplier
- for(var/datum/material/mat in D.materials)
- max_multiplier = min(D.maxstack, round(materials.get_material_amount(mat)/D.materials[mat]))
- if (max_multiplier>10 && !disabled)
- dat += "
x10"
- if (max_multiplier>25 && !disabled)
- dat += "
x25"
- if(max_multiplier > 0 && !disabled)
- dat += "
x[max_multiplier]"
- else
- if(!disabled && can_build(D, 5))
- dat += "
x5"
- if(!disabled && can_build(D, 10))
- dat += "
x10"
-
- dat += "[get_design_cost(D)]
"
-
- dat += "
"
- return dat
-
-/obj/machinery/autoylathe/proc/search_win(mob/user)
- var/dat = "Return to main menu"
- dat += "Search results:
"
- dat += materials_printout()
-
- for(var/v in matching_designs)
- var/datum/design/D = v
- if(disabled || !can_build(D))
- dat += "
[D.name]"
- else
- dat += "
[D.name]"
-
- if(ispath(D.build_path, /obj/item/stack))
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/max_multiplier
- for(var/datum/material/mat in D.materials)
- max_multiplier = min(D.maxstack, round(materials.get_material_amount(mat)/D.materials[mat]))
- if (max_multiplier>10 && !disabled)
- dat += "
x10"
- if (max_multiplier>25 && !disabled)
- dat += "
x25"
- if(max_multiplier > 0 && !disabled)
- dat += "
x[max_multiplier]"
-
- dat += "[get_design_cost(D)]
"
-
- dat += "
"
- return dat
-
-/obj/machinery/autoylathe/proc/materials_printout()
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
- var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
"
- for(var/mat_id in materials.materials)
- var/datum/material/M = mat_id
- var/mineral_amount = materials.materials[mat_id]
- if(mineral_amount > 0)
- dat += "[M.name] amount: [mineral_amount] cm3
"
- return dat
-
-/obj/machinery/autoylathe/proc/can_build(datum/design/D, amount = 1)
- if(D.make_reagents.len)
- return FALSE
-
- var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
-
- var/list/required_materials = list()
-
- for(var/i in D.materials)
- required_materials[i] = D.materials[i] * coeff * amount
-
- var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
-
- return materials.has_materials(required_materials)
-
-/obj/machinery/autoylathe/proc/get_design_cost(datum/design/D)
- var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
- var/dat
- for(var/i in D.materials)
- if(istext(i)) //Category handling
- dat += "[D.materials[i] * coeff] [i]"
- else
- var/datum/material/M = i
- dat += "[D.materials[i] * coeff] [M.name] "
- return dat
-
-/obj/machinery/autoylathe/proc/reset(wire)
- switch(wire)
- if(WIRE_HACK)
- if(!wires.is_cut(wire))
- adjust_hacked(FALSE)
- if(WIRE_SHOCK)
- if(!wires.is_cut(wire))
- shocked = FALSE
- if(WIRE_DISABLE)
- if(!wires.is_cut(wire))
- disabled = FALSE
-
-/obj/machinery/autoylathe/proc/shock(mob/user, prb)
- if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
- return FALSE
- if(!prob(prb))
- return FALSE
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- if (electrocute_mob(user, get_area(src), src, 0.7, TRUE))
- return TRUE
- else
- return FALSE
-
-/obj/machinery/autoylathe/proc/adjust_hacked(state)
- hacked = state
- for(var/id in SSresearch.techweb_designs)
- var/datum/design/D = SSresearch.techweb_designs[id]
- if((D.build_type & AUTOYLATHE) && ("hacked" in D.category))
- if(hacked)
- stored_research.add_design(D)
- else
- stored_research.remove_design(D)
-
-/obj/machinery/autoylathe/hacked/Initialize()
- . = ..()
- adjust_hacked(TRUE)
-
-//Called when the object is constructed by an autoylathe
-//Has a reference to the autoylathe so you can do !!FUN!! things with hacked lathes
-/obj/item/proc/autoylathe_crafted(obj/machinery/autoylathe/A)
- return
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 8f0ce83c82..979b811bc5 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -7,7 +7,7 @@
move_resist = INFINITY
obj_flags = 0
- vis_flags = NONE
+ vis_flags = VIS_INHERIT_PLANE
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 596e428c7f..b310119827 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -49,5 +49,6 @@
/obj/effect/overlay/vis
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE
+ vis_flags = NONE
var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed
var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9cb03c6a85..c8e5b15f72 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -434,11 +434,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(mob/user, slot)
- SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
- for(var/X in actions)
- var/datum/action/A = X
- if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
- A.Grant(user)
+ . = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
+ if(!(. & COMPONENT_NO_GRANT_ACTIONS))
+ for(var/X in actions)
+ var/datum/action/A = X
+ if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
+ A.Grant(user)
item_flags |= IN_INVENTORY
user.update_equipment_speed_mods()
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 20e0b09d26..c23bc2bd5b 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -258,6 +258,8 @@ update_label("John Doe", "Clowny")
chameleon_action.chameleon_type = /obj/item/card/id
chameleon_action.chameleon_name = "ID Card"
chameleon_action.initialize_disguises()
+ if(!anyone)
+ AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, NONE) //no deconstructive analyzer usage.
/obj/item/card/id/syndicate/afterattack(obj/item/O, mob/user, proximity)
if(!proximity)
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 57638060f3..b788c3fcba 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1054,9 +1054,9 @@
build_path = /obj/machinery/vending/kink
req_components = list(/obj/item/vending_refill/kink = 1)
-/obj/item/circuitboard/machine/autoylathe
+/obj/item/circuitboard/machine/autolathe/toy
name = "Autoylathe (Machine Board)"
- build_path = /obj/machinery/autoylathe
+ build_path = /obj/machinery/autolathe/toy
req_components = list(
/obj/item/stock_parts/matter_bin = 3,
/obj/item/stock_parts/manipulator = 1,
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 3dad3877b7..f60edf2917 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -726,13 +726,12 @@
to_chat(usr, "A color that dark on an object like this? Surely not...")
return FALSE
- target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
if(istype(target, /obj/structure/window))
- if(color_hex2num(paint_color) < 255)
- target.set_opacity(255)
- else
- target.set_opacity(initial(target.opacity))
+ var/obj/structure/window/W = target
+ W.spraycan_paint(paint_color)
+ else
+ target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
. = use_charges(user, 2)
var/fraction = min(1, . / reagents.maximum_volume)
diff --git a/code/game/objects/items/devices/electrochromatic_kit.dm b/code/game/objects/items/devices/electrochromatic_kit.dm
new file mode 100644
index 0000000000..d582eab00e
--- /dev/null
+++ b/code/game/objects/items/devices/electrochromatic_kit.dm
@@ -0,0 +1,14 @@
+/obj/item/electronics/electrochromatic_kit
+ name = "electrochromatic kit"
+ desc = "A kit for upgrading a window into an electrochromatic one."
+ /// Electrochromatic ID
+ var/id
+
+/obj/item/electronics/electrochromatic_kit/attack_self(mob/user)
+ . = ..()
+ if(.)
+ return
+ var/new_id = input(user, "Set this kit's electrochromatic ID", "Set ID", id) as text|null
+ if(isnull(new_id))
+ return
+ id = new_id
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index cf0afb638b..ffa3d83304 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -294,18 +294,18 @@
name = "chameleon kit"
/obj/item/storage/box/syndie_kit/chameleon/PopulateContents()
- new /obj/item/clothing/under/chameleon(src)
- new /obj/item/clothing/suit/chameleon(src)
- new /obj/item/clothing/gloves/chameleon(src)
- new /obj/item/clothing/shoes/chameleon(src)
- new /obj/item/clothing/glasses/chameleon(src)
- new /obj/item/clothing/head/chameleon(src)
- new /obj/item/clothing/mask/chameleon(src)
- new /obj/item/storage/backpack/chameleon(src)
- 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)
+ new /obj/item/clothing/under/chameleon/syndicate(src)
+ new /obj/item/clothing/suit/chameleon/syndicate(src)
+ new /obj/item/clothing/gloves/chameleon/insulated/syndicate(src)
+ new /obj/item/clothing/shoes/chameleon/syndicate(src)
+ new /obj/item/clothing/glasses/chameleon/syndicate(src)
+ new /obj/item/clothing/head/chameleon/syndicate(src)
+ new /obj/item/clothing/mask/chameleon/syndicate(src)
+ new /obj/item/storage/backpack/chameleon/syndicate(src)
+ new /obj/item/radio/headset/chameleon/syndicate(src)
+ new /obj/item/stamp/chameleon/syndicate(src)
+ new /obj/item/pda/chameleon/syndicate(src)
+ new /obj/item/clothing/neck/cloak/chameleon/syndicate(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)
@@ -510,4 +510,4 @@
new /obj/item/clothing/under/chameleon(src)
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src)
new /obj/item/lighter(src)
-
+
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index d2d72193b7..5acbb2f231 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -3,6 +3,7 @@
var/crit_fail = FALSE
animate_movement = 2
speech_span = SPAN_ROBOT
+ vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace.
var/obj_flags = CAN_BE_HIT
var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
diff --git a/code/game/objects/structures/loot_pile.dm b/code/game/objects/structures/loot_pile.dm
new file mode 100644
index 0000000000..b6249ec1e4
--- /dev/null
+++ b/code/game/objects/structures/loot_pile.dm
@@ -0,0 +1,66 @@
+ /*
+ * Loot piles structures, somewhat inspired from Polaris 13 ones but without the one search per pile ckey/mind restriction
+ * because the actual code is located its own element and has enough variables already. the piles themselves merely cosmetical.
+ */
+/obj/structure/loot_pile
+ name = "pile of junk"
+ desc = "Lots of junk lying around. They say one man's trash is another man's treasure."
+ icon = 'icons/obj/loot_piles.dmi'
+ icon_state = "randompile"
+ density = FALSE
+ anchored = TRUE
+ var/loot_amount = 5
+ var/delete_on_depletion = FALSE
+ var/can_use_hands = TRUE
+ var/scavenge_time = 12 SECONDS
+ var/allowed_tools = list(TOOL_SHOVEL = 0.6) //list of tool_behaviours with associated speed multipliers (lower is better)
+ var/icon_states_to_use = list("junk_pile1", "junk_pile2", "junk_pile3", "junk_pile4", "junk_pile5")
+ var/list/loot
+
+ /*
+ * Associated values in this list are not weights but numbers of times the kery can be rolled
+ * before being removed from ALL piles with same kind. This is why I wanted 'scavenging' to be an element and not a component.
+ */
+ var/list/unique_loot
+
+ /*
+ * used for restrictions such as "one per mind", "one per ckey". Depending on the setting, these can be either limited to
+ * the current pile or shared throughout all atoms attached to this element.
+ */
+ var/loot_restriction = NO_LOOT_RESTRICTION
+ var/maximum_loot_per_player = 1
+
+/obj/structure/loot_pile/Initialize()
+ . = ..()
+ icon_state = pick(icon_states_to_use)
+
+/obj/structure/loot_pile/ComponentInitialize()
+ . = ..()
+ if(loot)
+ AddElement(/datum/element/scavenging, loot_amount, loot, unique_loot, scavenge_time, can_use_hands, allowed_tools, null, delete_on_depletion, loot_restriction, maximum_loot_per_player)
+
+//uses the maintenance_loot global list, mostly boring stuff and mices.
+/obj/structure/loot_pile/maint
+ name = "trash pile"
+ desc = "A heap of garbage, but maybe there's something interesting inside?"
+ density = TRUE
+ layer = TABLE_LAYER
+ climbable = TRUE
+ pass_flags = LETPASSTHROW
+ loot = list(
+ SCAVENGING_FOUND_NOTHING = 50,
+ SCAVENGING_SPAWN_MOUSE = 10,
+ SCAVENGING_SPAWN_MICE = 5,
+ SCAVENGING_SPAWN_TOM = 1,
+ /obj/item/clothing/gloves/color/yellow = 0.5)
+ unique_loot = list(/obj/item/clothing/gloves/color/yellow = 5, SCAVENGING_SPAWN_TOM = 1)
+
+/obj/structure/loot_pile/maint/ComponentInitialize()
+ var/static/safe_maint_items
+ if(!safe_maint_items)
+ safe_maint_items = list()
+ for(var/A in GLOB.maintenance_loot)
+ if(ispath(A, /obj/item))
+ safe_maint_items[A] = GLOB.maintenance_loot[A]
+ loot += safe_maint_items
+ return ..()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 5dd4e7d987..e4d93ea8de 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -1,3 +1,18 @@
+#define NOT_ELECTROCHROMATIC 0
+#define ELECTROCHROMATIC_OFF 1
+#define ELECTROCHROMATIC_DIMMED 2
+
+GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
+
+/proc/do_electrochromatic_toggle(new_status, id)
+ var/list/windows = GLOB.electrochromatic_window_lookup["[id]"]
+ if(!windows)
+ return
+ var/obj/structure/window/W //define outside for performance because obviously this matters.
+ for(var/i in windows)
+ W = i
+ new_status? W.electrochromatic_dim() : W.electrochromatic_off()
+
/obj/structure/window
name = "window"
desc = "A window."
@@ -28,8 +43,15 @@
rad_insulation = RAD_VERY_LIGHT_INSULATION
rad_flags = RAD_PROTECT_CONTENTS
+ /// Electrochromatic status
+ var/electrochromatic_status = NOT_ELECTROCHROMATIC
+ /// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes.
+ var/electrochromatic_id
+
/obj/structure/window/examine(mob/user)
. = ..()
+ if(electrochromatic_status != NOT_ELECTROCHROMATIC)
+ . += "The window has electrochromatic circuitry on it."
if(reinf)
if(anchored && state == WINDOW_SCREWED_TO_FRAME)
. += "The window is screwed to the frame."
@@ -52,6 +74,10 @@
if(reinf && anchored)
state = WINDOW_SCREWED_TO_FRAME
+ if(mapload && electrochromatic_id)
+ if(copytext(electrochromatic_id, 1, 2) == "!")
+ electrochromatic_id = SSmapping.get_obfuscated_id(electrochromatic_id)
+
ini_dir = dir
air_update_turf(1)
@@ -62,6 +88,12 @@
real_explosion_block = explosion_block
explosion_block = EXPLOSION_BLOCK_PROC
+ if(electrochromatic_status != NOT_ELECTROCHROMATIC)
+ var/old = electrochromatic_status
+ make_electrochromatic()
+ if(old == ELECTROCHROMATIC_DIMMED)
+ electrochromatic_dim()
+
/obj/structure/window/ComponentInitialize()
. = ..()
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation))
@@ -177,6 +209,24 @@
to_chat(user, "[src] is already in good condition!")
return
+ if(istype(I, /obj/item/electronics/electrochromatic_kit) && user.a_intent == INTENT_HELP)
+ var/obj/item/electronics/electrochromatic_kit/K = I
+ if(electrochromatic_status != NOT_ELECTROCHROMATIC)
+ to_chat(user, "[src] is already electrochromatic!")
+ return
+ if(anchored)
+ to_chat(user, "[src] must not be attached to the floor!")
+ return
+ if(!K.id)
+ to_chat(user, "[K] has no ID set!")
+ return
+ if(!user.temporarilyRemoveItemFromInventory(K))
+ to_chat(user, "[K] is stuck to your hand!")
+ return
+ user.visible_message("[user] upgrades [src] with [I].", "You upgrade [src] with [I].")
+ make_electrochromatic(K.id)
+ qdel(K)
+
if(!(flags_1&NODECONSTRUCT_1))
if(istype(I, /obj/item/screwdriver))
I.play_tool_sound(src, 75)
@@ -224,6 +274,91 @@
air_update_turf(TRUE)
update_nearby_icons()
+/obj/structure/window/proc/spraycan_paint(paint_color)
+ if(color_hex2num(paint_color) < 255)
+ set_opacity(255)
+ else
+ set_opacity(initial(opacity))
+ add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
+
+/obj/structure/window/proc/electrochromatic_dim()
+ if(electrochromatic_status == ELECTROCHROMATIC_DIMMED)
+ return
+ electrochromatic_status = ELECTROCHROMATIC_DIMMED
+ animate(src, color = "#222222", time = 2)
+ set_opacity(TRUE)
+
+/obj/structure/window/proc/electrochromatic_off()
+ if(electrochromatic_status == ELECTROCHROMATIC_OFF)
+ return
+ electrochromatic_status = ELECTROCHROMATIC_OFF
+ var/current = color
+ update_atom_colour()
+ var/newcolor = color
+ color = current
+ animate(src, color = newcolor, time = 2)
+
+/obj/structure/window/proc/remove_electrochromatic()
+ electrochromatic_off()
+ electrochromatic_status = NOT_ELECTROCHROMATIC
+ if(!electrochromatic_id)
+ return
+ var/list/L = GLOB.electrochromatic_window_lookup["[electrochromatic_id]"]
+ if(L)
+ L -= src
+ electrochromatic_id = null
+
+/obj/structure/window/vv_edit_var(var_name, var_value)
+ var/check_status
+ if(var_name == NAMEOF(src, electrochromatic_id))
+ if(electrochromatic_id && GLOB.electrochromatic_window_lookup["[electrochromatic_id]"])
+ GLOB.electrochromatic_window_lookup[electrochromatic_id] -= src
+ if(var_name == NAMEOF(src, electrochromatic_status))
+ check_status = TRUE
+ . = ..() //do this first incase it runtimes.
+ if(var_name == NAMEOF(src, electrochromatic_id))
+ if((electrochromatic_status != NOT_ELECTROCHROMATIC) && electrochromatic_id)
+ LAZYINITLIST(GLOB.electrochromatic_window_lookup[electrochromatic_id])
+ GLOB.electrochromatic_window_lookup[electrochromatic_id] += src
+ if(check_status)
+ if(electrochromatic_status == NOT_ELECTROCHROMATIC)
+ remove_electrochromatic()
+ return
+ else if(electrochromatic_status == ELECTROCHROMATIC_OFF)
+ if(!electrochromatic_id)
+ return
+ else
+ make_electrochromatic()
+ electrochromatic_off()
+ return
+ else if(electrochromatic_status == ELECTROCHROMATIC_DIMMED)
+ if(!electrochromatic_id)
+ return
+ else
+ make_electrochromatic()
+ electrochromatic_dim()
+ return
+ else
+ remove_electrochromatic()
+
+/obj/structure/window/proc/make_electrochromatic(new_id = electrochromatic_id)
+ remove_electrochromatic()
+ if(!new_id)
+ CRASH("Attempted to make electrochromatic with null ID.")
+ electrochromatic_id = new_id
+ electrochromatic_status = ELECTROCHROMATIC_OFF
+ LAZYINITLIST(GLOB.electrochromatic_window_lookup["[electrochromatic_id]"])
+ GLOB.electrochromatic_window_lookup[electrochromatic_id] |= src
+
+/obj/structure/window/update_atom_colour()
+ if((electrochromatic_status != ELECTROCHROMATIC_OFF) && (electrochromatic_status != ELECTROCHROMATIC_DIMMED))
+ return FALSE
+ . = ..()
+ if(color && (color_hex2num(color) < 255))
+ set_opacity(255)
+ else
+ set_opacity(FALSE)
+
/obj/structure/window/proc/check_state(checked_state)
if(state == checked_state)
return TRUE
@@ -263,7 +398,6 @@
if(BURN)
playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
/obj/structure/window/deconstruct(disassembled = TRUE)
if(QDELETED(src))
return
@@ -272,6 +406,9 @@
if(!(flags_1 & NODECONSTRUCT_1))
for(var/obj/item/shard/debris in spawnDebris(drop_location()))
transfer_fingerprints_to(debris) // transfer fingerprints to shards only
+ if(electrochromatic_status != NOT_ELECTROCHROMATIC) //eh fine keep your kit.
+ new /obj/item/electronics/electrochromatic_kit(drop_location())
+ // Intentionally not setting the ID so you can't decon one to know all of the IDs.
qdel(src)
update_nearby_icons()
@@ -315,9 +452,9 @@
density = FALSE
air_update_turf(1)
update_nearby_icons()
+ remove_electrochromatic()
return ..()
-
/obj/structure/window/Move()
var/turf/T = loc
. = ..()
@@ -731,7 +868,6 @@
set_opacity(TRUE)
queue_smooth(src)
-
/obj/structure/window/paperframe/attackby(obj/item/W, mob/user)
if(W.get_temperature())
fire_act(W.get_temperature())
@@ -749,3 +885,7 @@
return
..()
update_icon()
+
+#undef NOT_ELECTROCHROMATIC
+#undef ELECTROCHROMATIC_OFF
+#undef ELECTROCHROMATIC_DIMMED
diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm
index f0be20e008..90fab29611 100644
--- a/code/game/turfs/openspace/openspace.dm
+++ b/code/game/turfs/openspace/openspace.dm
@@ -1,7 +1,20 @@
+GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdrop, new)
+
+/atom/movable/openspace_backdrop
+ name = "openspace_backdrop"
+
+ anchored = TRUE
+
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "grey"
+ plane = OPENSPACE_BACKDROP_PLANE
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ layer = SPLASHSCREEN_LAYER
+
/turf/open/openspace
name = "open space"
desc = "Watch your step!"
- icon_state = "grey"
+ icon_state = "transparent"
baseturfs = /turf/open/openspace
CanAtmosPassVertical = ATMOS_PASS_YES
//mouse_opacity = MOUSE_OPACITY_TRANSPARENT
@@ -14,8 +27,9 @@
/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
. = ..()
- plane = FLOOR_OPENSPACE_PLANE
+ plane = OPENSPACE_PLANE
layer = OPENSPACE_LAYER
+ vis_contents += GLOB.openspace_backdrop_one_for_all //Special grey square for projecting backdrop darkness filter on it.
return INITIALIZE_HINT_LATELOAD
/turf/open/openspace/LateInitialize()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 849b6cf45d..88f6dd6962 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -1,6 +1,8 @@
/turf
icon = 'icons/turf/floors.dmi'
level = 1
+ vis_flags = VIS_INHERIT_PLANE|VIS_INHERIT_ID //when this be added to vis_contents of something it inherit something.plane and be associatet with something on clicking,
+ //important for visualisation of turf in openspace and interraction with openspace that show you turf.
var/intact = 1
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index b040c88a49..e9b8c274a8 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -81,7 +81,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
)
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel))
GLOBAL_PROTECT(admin_verbs_ban)
-GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/set_round_end_sound))
+GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound))
GLOBAL_PROTECT(admin_verbs_sounds)
GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_dress,
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 066c38bcba..e7b9342645 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -138,6 +138,49 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound")
+/client/proc/manual_play_web_sound()
+ set category = "Fun"
+ set name = "Manual Play Internet Sound"
+ if(!check_rights(R_SOUNDS))
+ return
+
+ var/web_sound_input = input("Enter content stream URL (fetch this from local youtube-dl!)", "Play Internet Sound via direct URL") as text|null
+ if(istext(web_sound_input))
+ if(!length(web_sound_input))
+ log_admin("[key_name(src)] stopped web sound")
+ message_admins("[key_name(src)] stopped web sound")
+ var/mob/M
+ for(var/i in GLOB.player_list)
+ M = i
+ M?.client?.chatOutput?.stopMusic()
+ return
+ else
+ if(web_sound_input && !findtext(web_sound_input, GLOB.is_http_protocol))
+ to_chat(src, "BLOCKED: Content URL not using http(s) protocol")
+ return
+ var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num
+ if(isnull(freq))
+ return
+ if(!freq)
+ freq = 1
+ SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]"))
+ var/logstr = "[key_name(src)] played web sound at freq [freq]: [web_sound_input]"
+ log_admin(logstr)
+ message_admins(logstr)
+ var/mob/M
+ var/client/C
+ var/datum/chatOutput/O
+ for(var/i in GLOB.player_list)
+ M = i
+ C = M.client
+ if(!(C?.prefs?.toggles & SOUND_MIDI))
+ continue
+ O = C.chatOutput
+ if(!O || O.broken || !O.loaded)
+ continue
+ O.sendMusic(web_sound_input, freq)
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Manual Play Internet Sound")
+
/client/proc/set_round_end_sound(S as sound)
set category = "Fun"
set name = "Set Round End Sound"
diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm
index 653853cfb5..9d138ed0b9 100644
--- a/code/modules/antagonists/_common/antag_team.dm
+++ b/code/modules/antagonists/_common/antag_team.dm
@@ -42,7 +42,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- report += "Objective #[objective_count]: [objective.explanation_text] Success!"
+ report += "Objective #[objective_count]: [objective.explanation_text] Success!"
else if(completion <= 0)
report += "Objective #[objective_count]: [objective.explanation_text] Fail."
win = FALSE
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 3bfc76322d..1867be1594 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -14,10 +14,10 @@
set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side.
var/notice_healing
while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src
- if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood
+ if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_FAKEDEATH)) // Deduct Blood
AddBloodVolume(passive_blood_drain) // -.1 currently
if(HandleHealing(1)) // Heal
- if(notice_healing == FALSE && owner.current.blood_volume > 0)
+ if(!notice_healing && owner.current.blood_volume > 0)
to_chat(owner, "The power of your blood begins knitting your wounds...")
notice_healing = TRUE
else if(notice_healing == TRUE)
@@ -25,7 +25,7 @@
HandleStarving() // Death
HandleDeath() // Standard Update
update_hud()// Daytime Sleep in Coffin
- if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker"))
+ if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker"))
if(istype(owner.current.loc, /obj/structure/closet/crate/coffin))
Torpor_Begin()
// Wait before next pass
@@ -83,7 +83,7 @@
// NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor!
//It is called from your coffin on close (by you only)
var/actual_regen = regen_rate + additional_regen
- if(poweron_masquerade == TRUE || owner.current.AmStaked())
+ if(poweron_masquerade|| owner.current.AmStaked())
return FALSE
if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic))
return FALSE
@@ -101,8 +101,8 @@
var/mob/living/carbon/C = owner.current
var/costMult = 1 // Coffin makes it cheaper
var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire)
- var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_FAKEDEATH)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin)
- if(amInCoffinWhileTorpor)
+ // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin)
+ if(istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_FAKEDEATH)))
mult *= 4 // Increase multiplier if we're sleeping in a coffin.
fireheal = min(C.getFireLoss(), regen_rate) // NOTE: Burn damage ONLY heals in torpor.
C.ExtinguishMob()
@@ -112,6 +112,9 @@
CheckVampOrgans() // Heart, Eyes
if(check_limbs(costMult))
return TRUE
+ else if(owner.current.stat >= UNCONSCIOUS) //Faster regeneration and slight burn healing while unconcious
+ mult *= 2
+ fireheal = min(C.getFireLoss(), regen_rate * 0.2)
// BRUTE: Always Heal
var/bruteheal = min(C.getBruteLoss(), actual_regen)
@@ -120,8 +123,6 @@
if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
if(mult == 0)
return TRUE
- if(owner.current.stat >= UNCONSCIOUS) //Faster regeneration while unconcious, so you dont have to wait all day
- mult *= 2
// We have damage. Let's heal (one time)
C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body.
C.adjustFireLoss(-fireheal * mult, forced = TRUE)
@@ -146,12 +147,6 @@
to_chat(C, "Your flesh knits as it regrows your [L]!")
playsound(C, 'sound/magic/demon_consume.ogg', 50, TRUE)
return TRUE
- /*for(var/obj/item/bodypart/BP in C.bodyparts)
- if(!istype(BP) && !BP.status == 2)
- return FALSE
- to_chat(C, "Your body expels the [BP]!")
- BP.drop_limb()
- return TRUE */
/datum/antagonist/bloodsucker/proc/CureDisabilities()
var/mob/living/carbon/C = owner.current
@@ -176,7 +171,7 @@
// EMPTY: Frenzy!
// BLOOD_VOLUME_GOOD: [336] Pale (handled in bloodsucker_integration.dm
// BLOOD_VOLUME_BAD: [224] Jitter
- if(owner.current.blood_volume < BLOOD_VOLUME_BAD && !prob(0.5))
+ if(owner.current.blood_volume < BLOOD_VOLUME_BAD && !prob(0.5 && HAS_TRAIT(owner, TRAIT_FAKEDEATH)) && !poweron_masquerade)
owner.current.Jitter(3)
// BLOOD_VOLUME_SURVIVE: [122] Blur Vision
if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2)
@@ -230,16 +225,16 @@
Torpor_Begin()
to_chat(owner, "Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.")
sleep(30) //To avoid spam
- if(poweron_masquerade == TRUE)
+ if(poweron_masquerade)
to_chat(owner, "Your wounds will not heal until you disable the Masquerade power.")
// End Torpor:
else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn)
if(total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin))
- // Not Daytime, Not in Torpor
- if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker"))
+ // Not Daytime, Not in Torpor, enough health to not die the moment you end torpor
+ if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker") && total_damage < owner.current.getMaxHealth())
Torpor_End()
// Fake Unconscious
- if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT)
+ if(poweron_masquerade && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT)
owner.current.Unconscious(20, 1)
/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE)
@@ -249,6 +244,7 @@
ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover.
ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in space. Otherwise you just...heal forever.
ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker")
+ owner.current.Jitter(0)
// Visuals
owner.current.update_sight()
owner.current.reload_fullscreen()
@@ -256,6 +252,9 @@
for(var/datum/action/bloodsucker/power in powers)
if(power.active && !power.can_use_in_torpor)
power.DeactivatePower()
+ if(owner.current.suiciding)
+ owner.current.suiciding = FALSE //Youll die but not for long.
+ to_chat(owner.current, "Your body keeps you going, even as you try to end yourself.")
/datum/antagonist/bloodsucker/proc/Torpor_End()
owner.current.stat = SOFT_CRIT
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
index b7d98c6783..43163f6a70 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
@@ -45,15 +45,15 @@
// (FINAL LIL WARNING)
while(time_til_cycle > 5)
sleep(10)
- if (cancel_me)
+ if(cancel_me)
return
//sleep(TIME_BLOODSUCKER_DAY_FINAL_WARN - 50)
warn_daylight(3,"Seek cover, for Sol rises!")
// Part 3: Night Ending
- while (time_til_cycle > 0)
+ while(time_til_cycle > 0)
sleep(10)
- if (cancel_me)
+ if(cancel_me)
return
//sleep(50)
warn_daylight(4,"Solar flares bombard the station with deadly UV light!
Stay in cover for the next [TIME_BLOODSUCKER_DAY / 60] minutes or risk Final Death!",\
@@ -69,11 +69,11 @@
while(time_til_cycle > 0)
punish_vamps()
sleep(TIME_BLOODSUCKER_BURN_INTERVAL)
- if (cancel_me)
+ if(cancel_me)
return
//daylight_time -= TIME_BLOODSUCKER_BURN_INTERVAL
// Issue Level Up!
- if(!issued_XP && time_til_cycle <= 15)
+ if(!issued_XP && time_til_cycle <= 5)
issued_XP = TRUE
vamps_rank_up()
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index 946be31ed6..2e9d3c1788 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -227,7 +227,7 @@
// Traits
for(var/T in defaultTraits)
REMOVE_TRAIT(owner.current, T, BLOODSUCKER_TRAIT)
- if(had_toxlover == TRUE)
+ if(had_toxlover)
ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, SPECIES_TRAIT)
// Traits: Species
diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm
index a616c39923..347700ca9a 100644
--- a/code/modules/antagonists/bloodsucker/powers/cloak.dm
+++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm
@@ -18,14 +18,11 @@
. = ..()
if(!.)
return
-
// must have nobody around to see the cloak
- var/watchers = viewers(9,get_turf(owner))
- for(var/mob/living/M in watchers)
+ for(var/mob/living/M in viewers(9, owner))
if(M != owner)
to_chat(owner, "You may only vanish into the shadows unseen.")
return FALSE
-
return TRUE
/datum/action/bloodsucker/cloak/ActivatePower()
diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
index 7d41899dc2..d83f938e3f 100644
--- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm
+++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
@@ -52,6 +52,7 @@
REMOVE_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker")
REMOVE_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker")
REMOVE_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker")
+ REMOVE_TRAIT(user, TRAIT_NOBREATH, "bloodsucker")
var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART)
var/obj/item/organ/eyes/vassal/bloodsucker/E = user.getorganslot(ORGAN_SLOT_EYES)
E.flash_protect = 0
@@ -93,6 +94,7 @@
ADD_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker")
ADD_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker")
ADD_TRAIT(user, TRAIT_VIRUSIMMUNE, "bloodsucker")
+ ADD_TRAIT(user, TRAIT_NOBREATH, "bloodsucker")
// HEART
var/obj/item/organ/heart/H = user.getorganslot(ORGAN_SLOT_HEART)
diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm
index 45d1dda3ef..c91b924bb7 100644
--- a/code/modules/antagonists/bloodsucker/powers/trespass.dm
+++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm
@@ -28,7 +28,7 @@
/datum/action/bloodsucker/targeted/trespass/CheckValidTarget(atom/A)
// Can't target my tile
- if (A == get_turf(owner) || get_turf(A) == get_turf(owner))
+ if(A == get_turf(owner) || get_turf(A) == get_turf(owner))
return FALSE
return TRUE // All we care about is destination. Anything you click is fine.
@@ -43,13 +43,13 @@
// Are either tiles WALLS?
var/turf/from_turf = get_turf(owner)
var/this_dir // = get_dir(from_turf, target_turf)
- for (var/i=1 to 2)
+ for(var/i=1 to 2)
// Keep Prev Direction if we've reached final turf
- if (from_turf != final_turf)
+ if(from_turf != final_turf)
this_dir = get_dir(from_turf, final_turf) // Recalculate dir so we don't overshoot on a diagonal.
from_turf = get_step(from_turf, this_dir)
// ERROR! Wall!
- if (iswallturf(from_turf))
+ if(iswallturf(from_turf))
if (display_error)
var/wallwarning = (i == 1) ? "in the way" : "at your destination"
to_chat(owner, "There is a solid wall [wallwarning].")
@@ -84,7 +84,7 @@
user.next_move = world.time + mist_delay
user.Stun(mist_delay, ignore_canstun = TRUE)
user.notransform = TRUE
- user.density = 0
+ user.density = FALSE
var/invis_was = user.invisibility
user.invisibility = INVISIBILITY_MAXIMUM
@@ -94,7 +94,7 @@
sleep(mist_delay / 2)
// Move & Freeze
- if (isturf(target_turf))
+ if(isturf(target_turf))
do_teleport(owner, target_turf, no_effects=TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm?
user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm
index a48e080a89..0a2e079921 100644
--- a/code/modules/antagonists/brother/brother.dm
+++ b/code/modules/antagonists/brother/brother.dm
@@ -111,7 +111,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- parts += "Objective #[objective_count]: [objective.explanation_text] Success!"
+ parts += "Objective #[objective_count]: [objective.explanation_text] Success!"
else if(completion <= 0)
parts += "Objective #[objective_count]: [objective.explanation_text] Fail."
win = FALSE
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 336d21c974..9dbcaf7ec2 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -563,7 +563,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- parts += "Objective #[count]: [objective.explanation_text] Success!"
+ parts += "Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
parts += "Objective #[count]: [objective.explanation_text] Fail."
changelingwin = FALSE
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
index 023794182a..ae61b2c814 100644
--- a/code/modules/antagonists/cult/cult.dm
+++ b/code/modules/antagonists/cult/cult.dm
@@ -441,7 +441,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- parts += "Objective #[count]: [objective.explanation_text] Success!"
+ parts += "Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
parts += "Objective #[count]: [objective.explanation_text] Fail."
else
diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm
index c827179006..7de0330ad6 100644
--- a/code/modules/antagonists/disease/disease_datum.dm
+++ b/code/modules/antagonists/disease/disease_datum.dm
@@ -55,7 +55,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- result += "Objective #[count]: [objective.explanation_text] Success!"
+ result += "Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
result += "Objective #[count]: [objective.explanation_text] Fail."
win = FALSE
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index df5e6004ba..1d30cdbf77 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -239,7 +239,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- objectives_text += "
Objective #[count]: [objective.explanation_text] Success!"
+ objectives_text += "
Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
objectives_text += "
Objective #[count]: [objective.explanation_text] Fail."
traitorwin = FALSE
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 2d32f8f00a..70adafd3fb 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -269,7 +269,7 @@
if(objective.completable)
var/completion = objective.check_completion()
if(completion >= 1)
- parts += "Objective #[count]: [objective.explanation_text] Success!"
+ parts += "Objective #[count]: [objective.explanation_text] Success!"
else if(completion <= 0)
parts += "Objective #[count]: [objective.explanation_text] Fail."
wizardwin = FALSE
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index 1c9c1a0203..32e262ce65 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -3,14 +3,35 @@
desc = "A small electronic device able to control a blast door remotely."
icon_state = "control"
attachable = TRUE
- var/id = null
- var/can_change_id = 0
+ /// Our ID. Make the first character ! if you want to obfuscate it as a mapper via randomization.
+ var/id
+ /// Can the ID be changed if used in hand?
+ var/can_change_id = FALSE
+ /// Show ID?
+ var/show_id = TRUE
var/cooldown = FALSE //Door cooldowns
+/obj/item/assembly/control/Initialize(mapload)
+ if(mapload && id)
+ if(copytext(id, 1, 2) == "!")
+ id = SSmapping.get_obfuscated_id(id)
+ return ..()
+
/obj/item/assembly/control/examine(mob/user)
. = ..()
- if(id)
+ if(id && show_id)
. += "Its channel ID is '[id]'."
+ if(can_change_id)
+ . += "Use in hand to change ID."
+
+/obj/item/assembly/control/attack_self(mob/living/user)
+ . = ..()
+ if(!can_change_id)
+ return
+ var/new_id
+ new_id = input(user, "Set ID", "Set ID", show_id? id : null) as text|null
+ if(!isnull(new_id)) //0/"" is considered !, so check null instead of just !.
+ id = new_id
/obj/item/assembly/control/activate()
cooldown = TRUE
@@ -22,7 +43,6 @@
INVOKE_ASYNC(M, openclose ? /obj/machinery/door/poddoor.proc/open : /obj/machinery/door/poddoor.proc/close)
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10)
-
/obj/item/assembly/control/airlock
name = "airlock controller"
desc = "A small electronic device able to control an airlock remotely."
@@ -123,7 +143,6 @@
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
-
/obj/item/assembly/control/crematorium
name = "crematorium controller"
desc = "An evil-looking remote controller for a crematorium."
@@ -135,3 +154,14 @@
C.cremate(usr)
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50)
+
+/obj/item/assembly/control/electrochromatic
+ name = "electrochromatic window controller"
+ desc = "Toggles linked electrochromatic windows."
+ can_change_id = TRUE
+ /// Stores our status to prevent windows from desyncing.
+ var/on = FALSE
+
+/obj/item/assembly/control/electrochromatic/activate()
+ on = !on
+ do_electrochromatic_toggle(on, id)
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index 5c34ece723..c7ffc51458 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -192,6 +192,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g
anchored = TRUE // should only appear in vis_contents, but to be safe
layer = FLY_LAYER
appearance_flags = TILE_BOUND
+ vis_flags = NONE
/obj/effect/overlay/gas/New(state, alph)
. = ..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index f98f628cab..dbe3c0b90b 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -225,6 +225,7 @@
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
target_temperature = min_temperature
+ to_chat(user,"You minimize the temperature on the [src].")
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
message_admins("[src.name] was minimized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return TRUE
@@ -257,6 +258,7 @@
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
target_temperature = max_temperature
+ to_chat(user,"You maximize the temperature on the [src].")
investigate_log("was set to [target_temperature] K by [key_name(usr)]", INVESTIGATE_ATMOS)
message_admins("[src.name] was maximized by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_COORDJMP(T)], [A]")
return TRUE
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 9f1111e5d9..df05eee638 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -262,7 +262,15 @@
return
random_look(owner)
-/obj/item/clothing/under/chameleon
+// Forgive me for my sins...
+#define CHAMELEON_CLOTHING_DEFINE(path) \
+##path/syndicate/Initialize(mapload){\
+ . = ..();\
+ AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR);\
+}\
+##path
+
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon)
//starts off as black
name = "black jumpsuit"
icon_state = "black"
@@ -300,7 +308,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/clothing/suit/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/suit/chameleon)
name = "armor"
desc = "A slim armored vest that protects against most types of damage."
icon_state = "armor"
@@ -329,7 +337,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/clothing/glasses/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/glasses/chameleon)
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
@@ -357,7 +365,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/clothing/gloves/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon)
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
@@ -368,6 +376,9 @@
var/datum/action/item_action/chameleon/change/chameleon_action
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/gloves/chameleon/insulated)
+ siemens_coefficient = 0
+
/obj/item/clothing/gloves/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
@@ -386,7 +397,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/clothing/head/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon)
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
@@ -429,7 +440,7 @@
var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src)
randomise_action.UpdateButtonIcon()
-/obj/item/clothing/mask/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon)
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"
@@ -486,7 +497,7 @@
/obj/item/clothing/mask/chameleon/drone/attack_self(mob/user)
to_chat(user, "[src] does not have a voice changer.")
-/obj/item/clothing/shoes/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon)
name = "black shoes"
icon_state = "black"
desc = "A pair of black shoes."
@@ -511,7 +522,7 @@
return
chameleon_action.emp_randomise()
-/obj/item/clothing/shoes/chameleon/noslip
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/shoes/chameleon/noslip)
name = "black shoes"
icon_state = "black"
desc = "A pair of black shoes."
@@ -521,7 +532,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/storage/backpack/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/backpack/chameleon)
name = "backpack"
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -542,7 +553,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/storage/belt/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/storage/belt/chameleon)
name = "toolbelt"
desc = "Holds tools."
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -570,7 +581,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/radio/headset/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/radio/headset/chameleon)
name = "radio headset"
var/datum/action/item_action/chameleon/change/chameleon_action
@@ -591,7 +602,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/pda/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/pda/chameleon)
name = "PDA"
var/datum/action/item_action/chameleon/change/pda/chameleon_action
@@ -613,7 +624,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/stamp/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/stamp/chameleon)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/stamp/chameleon/Initialize()
@@ -627,7 +638,7 @@
. = ..()
chameleon_action.emp_randomise(INFINITY)
-/obj/item/clothing/neck/cloak/chameleon
+CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/neck/cloak/chameleon)
name = "black tie"
desc = "A neosilk clip-on tie."
icon = 'icons/obj/clothing/neck.dmi'
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index a8137acf48..1b4716b407 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -23,6 +23,9 @@
/datum/round_event/wormholes/start()
for(var/turf/open/floor/T in world)
if(is_station_level(T.z))
+ var/area/A = get_area(T)
+ if(A.outdoors)
+ continue
pick_turfs += T
for(var/i = 1, i <= number_of_wormholes, i++)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index dc7384124d..b8e56f3d7c 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -937,3 +937,20 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
spawners_menu = new(src)
spawners_menu.ui_interact(src)
+
+/mob/dead/observer/verb/game_info()
+ set name = "Game info"
+ set desc = "Shows various info relating to the game mode, antagonists etc."
+ set category = "Ghost"
+ if(!started_as_observer && can_reenter_corpse)
+ to_chat(src, "You cannot see this info unless you are an observer or you've chosen Do Not Resuscitate!")
+ return
+ var/list/stuff = list("[SSticker.mode.name]")
+ stuff += "Antagonists:\n"
+ for(var/datum/antagonist/A in GLOB.antagonists)
+ if(A.owner)
+ stuff += "[A.owner] the [A.name]"
+ var/ghost_info = SSticker.mode.ghost_info()
+ if(ghost_info)
+ stuff += ghost_info
+ to_chat(src,stuff.Join("\n"))
diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
index ff733d9436..57a973bf22 100644
--- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
@@ -101,7 +101,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
/obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops..
. = ..()
- if(!owner || owner.stat == DEAD)
+ if(owner && owner.stat != DEAD)
dwarf_cycle_ticker()
//Handles the delayed tick cycle by just adding on increments per each on_life() tick
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index ab7c632214..e4e81bb5db 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -264,6 +264,9 @@
if((last_newpatient_speak + 300) < world.time) //Don't spam these messages!
var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg',"[H.name], you appear to be injured!" = 'sound/voice/medbot/injured.ogg')
var/message = pick(messagevoice)
+ if(prob(1) && ISINRANGE_EX(H.getFireLoss(), 0, 20))
+ message = "Notices your minor burns*OwO what's this?"
+ messagevoice[message] = 'sound/voice/medbot/owo.ogg'
speak(message)
playsound(loc, messagevoice[message], 50, 0)
last_newpatient_speak = world.time
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 370442d4c4..7f83bb9f9b 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -97,6 +97,8 @@
body_color = "brown"
icon_state = "mouse_brown"
+GLOBAL_VAR(tom_existed)
+
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
name = "Tom"
@@ -106,6 +108,10 @@
response_harm = "splats"
gold_core_spawnable = NO_SPAWN
+/mob/living/simple_animal/mouse/brown/Tom/Initialize()
+ . = ..()
+ GLOB.tom_existed = TRUE
+
/obj/item/reagent_containers/food/snacks/deadmouse
name = "dead mouse"
desc = "It looks like somebody dropped the bass on it. A lizard's favorite meal."
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 7d177e7ac2..825f015ef4 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -10,6 +10,8 @@
throwforce = 10
blocks_emissive = EMISSIVE_BLOCK_GENERIC
+ vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace.
+
var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
var/datum/mind/mind
var/list/datum/action/actions = list()
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
index 15e9b68912..994b0f7f01 100644
--- a/code/modules/projectiles/ammunition/energy/special.dm
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -4,8 +4,8 @@
fire_sound = 'sound/weapons/ionrifle.ogg'
/obj/item/ammo_casing/energy/ion/hos
- projectile_type = /obj/item/projectile/ion/weak
- e_cost = 300
+ projectile_type = /obj/item/projectile/ion
+ e_cost = 200
/obj/item/ammo_casing/energy/declone
projectile_type = /obj/item/projectile/energy/declone
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
index 86e11010bc..5d80b91087 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
@@ -74,3 +74,11 @@
materials = list(/datum/material/glass = 20)
build_path = /obj/item/stock_parts/cell/emergency_light
category = list("initial", "Electronics")
+
+/datum/design/electrochromatic_control
+ name = "Electrochromatic Control Circuit"
+ id = "electrochromatic_control_circuit"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 100, /datum/material/glass = 100)
+ build_path = /obj/item/assembly/control/electrochromatic
+ category = list("initial", "Electronics")
diff --git a/code/modules/research/designs/autoylathe_designs.dm b/code/modules/research/designs/autoylathe_designs.dm
index 7811cfdaad..0e572fee7a 100644
--- a/code/modules/research/designs/autoylathe_designs.dm
+++ b/code/modules/research/designs/autoylathe_designs.dm
@@ -1,5 +1,5 @@
/datum/design/autoylathe
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
/datum/design/autoylathe/mech
category = list("initial", "Figurines")
@@ -558,7 +558,7 @@
/datum/design/foam_x9
name = "Foam Force X9 Rifle"
id = "foam_x9"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/x9/toy
category = list("initial", "Rifles")
@@ -566,7 +566,7 @@
/datum/design/foam_dart
name = "Box of Foam Darts"
id = "foam_dart"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 500, /datum/material/iron = 100)
build_path = /obj/item/ammo_box/foambox
category = list("initial", "Misc")
@@ -574,7 +574,7 @@
/datum/design/foam_magpistol
name = "Foam Force Magpistol"
id = "magfoam_launcher"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/gun/ballistic/shotgun/toy/mag
category = list("initial", "Pistols")
@@ -582,7 +582,7 @@
/datum/design/foam_magrifle
name = "Foam Force MagRifle"
id = "foam_magrifle"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/toy/magrifle
category = list("initial", "Rifles")
@@ -590,7 +590,7 @@
/datum/design/foam_hyperburst
name = "MagTag Hyper Rifle"
id = "foam_hyperburst"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 2000, /datum/material/glass = 1000)
build_path = /obj/item/gun/energy/laser/practice/hyperburst
category = list("initial", "Rifles")
@@ -598,7 +598,7 @@
/datum/design/foam_sp
name = "Foam Force Stealth Pistol"
id = "foam_sp"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 1000)
build_path = /obj/item/gun/ballistic/automatic/toy/pistol/stealth
category = list("initial", "Pistols")
@@ -606,7 +606,7 @@
/datum/design/toyray
name = "RayTag Gun"
id = "toyray"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 1000, /datum/material/glass = 1000)
build_path = /obj/item/gun/energy/laser/practice/raygun
category = list("initial", "Pistols")
@@ -614,7 +614,7 @@
/datum/design/am4c
name = "Foam Force AM4-C Rifle"
id = "foam_am4c"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/AM4C
category = list("initial", "Rifles")
@@ -622,7 +622,7 @@
/datum/design/foam_f3
name = "Replica F3 Justicar"
id = "foam_f3"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/toy/gun/justicar
category = list("initial", "Pistols")
@@ -630,7 +630,7 @@
/datum/design/toy_blaster
name = "pump-action plastic blaster"
id = "toy_blaster"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 750, /datum/material/glass = 1000)
build_path = /obj/item/gun/energy/pumpaction/toy
category = list("initial", "Rifles")
@@ -638,7 +638,7 @@
/datum/design/capammo
name = "Box of Caps"
id = "capammo"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/iron = 10, /datum/material/glass = 10)
build_path = /obj/item/toy/ammo/gun
category = list("initial", "Misc")
@@ -646,7 +646,7 @@
/datum/design/foam_smg
name = "Foam Force SMG"
id = "foam_smg"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/gun/ballistic/automatic/toy/unrestricted
category = list("initial", "Pistols")
@@ -654,7 +654,7 @@
/datum/design/foam_pistol
name = "Foam Force Pistol"
id = "foam_pistol"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted
category = list("initial", "Pistols")
@@ -662,7 +662,7 @@
/datum/design/foam_shotgun
name = "Foam Force Shotgun"
id = "foam_shotgun"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/shotgun/toy/unrestricted
category = list("initial", "Rifles")
@@ -670,7 +670,7 @@
/datum/design/foam_dartred
name = "Box of Lastag Red Foam Darts"
id = "redfoam_dart"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 500, /datum/material/iron = 100)
build_path = /obj/item/ammo_box/foambox/tag/red
category = list("initial", "Misc")
@@ -678,7 +678,7 @@
/datum/design/foam_dartblue
name = "Box of Lastag Blue Foam Darts"
id = "bluefoam_dart"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 500, /datum/material/iron = 100)
build_path = /obj/item/ammo_box/foambox/tag/blue
category = list("initial", "Misc")
@@ -686,7 +686,7 @@
/datum/design/foam_bow
name = "Foam Force Crossbow"
id = "foam_bow"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 2000, /datum/material/iron = 250)
build_path = /obj/item/gun/ballistic/shotgun/toy/crossbow
category = list("initial", "Pistols")
@@ -694,7 +694,7 @@
/datum/design/foam_c20
name = "Donksoft C20R"
id = "foam_c20"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted
category = list("hacked", "Rifles")
@@ -702,7 +702,7 @@
/datum/design/foam_l6
name = "Donksoft LMG"
id = "foam_LMG"
- build_type = AUTOYLATHE
+ build_type = TOYLATHE
materials = list(/datum/material/plastic = 4000, /datum/material/iron = 500)
build_path = /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted
category = list("hacked", "Rifles")
diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
index 6d63df7d4b..06cdef5ecc 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
@@ -111,6 +111,6 @@
name = "Machine Design (Autoylathe)"
desc = "The circuit board for an autoylathe."
id = "autoylathe"
- build_path = /obj/item/circuitboard/machine/autoylathe
+ build_path = /obj/item/circuitboard/machine/autolathe/toy
departmental_flags = DEPARTMENTAL_FLAG_ALL
category = list("Misc. Machinery")
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 42b8a4dcbb..cc02e271f9 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -101,7 +101,7 @@ Note: Must be placed within 3 tiles of the R&D Console
if(!istype(loaded_item) || !istype(linked_console))
return FALSE
- if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID)
+ if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID && id != RESEARCH_DEEP_SCAN_ID)
var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id)
if(!istype(TN))
return FALSE
@@ -125,7 +125,7 @@ Note: Must be placed within 3 tiles of the R&D Console
if(destroy_item(loaded_item))
linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(TN.id), dpath)
- else
+ else if(id == RESEARCH_MATERIAL_RECLAMATION_ID)
var/list/point_value = techweb_item_point_check(loaded_item)
if(linked_console.stored_research.deconstructed_items[loaded_item.type])
point_value = list()
@@ -143,6 +143,15 @@ Note: Must be placed within 3 tiles of the R&D Console
if(destroy_item(loaded_item))
linked_console.stored_research.add_point_list(point_value)
linked_console.stored_research.deconstructed_items[loaded_type] = point_value
+ else if(id == RESEARCH_DEEP_SCAN_ID)
+ var/list/return_list = list()
+ . = SEND_SIGNAL(loaded_item, COMSIG_ITEM_DECONSTRUCTOR_DEEPSCAN, src, user, return_list)
+ flick("d_analyzer_process", src)
+ if(. & COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION)
+ say("New information uncovered from item deep scan[length(return_list)? ": [english_list(return_list)]" : ""].")
+ else
+ say("Item deep scan uncovered no new information.")
+
return TRUE
/obj/machinery/rnd/destructive_analyzer/proc/unload_item()
diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm
index 6352f50b8b..71aa5bf09a 100644
--- a/code/modules/research/nanites/nanite_programs/utility.dm
+++ b/code/modules/research/nanites/nanite_programs/utility.dm
@@ -160,7 +160,7 @@
if(!host_mob.client) //less brainpower
points *= 0.25
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points))
-
+
/datum/nanite_program/researchplus
name = "Neural Network"
desc = "The nanites link the host's brains together forming a neural research network, that becomes more efficient with the amount of total hosts."
@@ -184,7 +184,7 @@
SSnanites.neural_network_count--
else
SSnanites.neural_network_count -= 0.25
-
+
/datum/nanite_program/researchplus/active_effect()
if(!iscarbon(host_mob))
return
@@ -234,7 +234,7 @@
var/spread_cooldown = 0
/datum/nanite_program/spreading/active_effect()
- if(spread_cooldown < world.time)
+ if(world.time < spread_cooldown)
return
spread_cooldown = world.time + 50
var/list/mob/living/target_hosts = list()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 19f6e3ffdb..9bef00d5bf 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -47,6 +47,9 @@ Nothing else in the console has ID requirements.
var/research_control = TRUE
+ /// Long action cooldown to prevent spam
+ var/last_long_action = 0
+
/obj/machinery/computer/rdconsole/production
circuit = /obj/item/circuitboard/computer/rdconsole/production
research_control = FALSE
@@ -583,10 +586,8 @@ Nothing else in the console has ID requirements.
l += "| [icon2html(linked_destroy.loaded_item, usr)] | [linked_destroy.loaded_item.name] Eject |
[RDSCREEN_NOBREAK]"
l += "Select a node to boost by deconstructing this item. This item can boost:"
- var/anything = FALSE
var/list/boostable_nodes = techweb_item_boost_check(linked_destroy.loaded_item)
for(var/id in boostable_nodes)
- anything = TRUE
var/list/worth = boostable_nodes[id]
var/datum/techweb_node/N = SSresearch.techweb_node_by_id(id)
@@ -620,7 +621,6 @@ Nothing else in the console has ID requirements.
// point deconstruction and material reclamation use the same ID to prevent accidentally missing the points
var/list/point_values = techweb_item_point_check(linked_destroy.loaded_item)
if(point_values)
- anything = TRUE
l += "[RDSCREEN_NOBREAK]"
if (stored_research.deconstructed_items[linked_destroy.loaded_item.type])
l += "Point Deconstruction"
@@ -636,10 +636,8 @@ Nothing else in the console has ID requirements.
for (var/M in materials)
l += "* [CallMaterialName(M)] x [materials[M]]"
l += "
[RDSCREEN_NOBREAK]"
- anything = TRUE
- if (!anything)
- l += "Nothing!"
+ l += ""
l += ""
return l
@@ -926,6 +924,9 @@ Nothing else in the console has ID requirements.
screen = RDSCREEN_MENU
say("Ejecting Technology Disk")
if(ls["deconstruct"])
+ if((last_long_action + 1 SECONDS) > world.time)
+ return
+ last_long_action = world.time
if(QDELETED(linked_destroy))
say("No Destructive Analyzer Linked!")
return
@@ -1037,7 +1038,7 @@ Nothing else in the console has ID requirements.
autolathe_friendly = FALSE
D.category -= "Imported"
- if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab
+ if(D.build_type & (AUTOLATHE|PROTOLATHE|TOYLATHE)) // Specifically excludes circuit imprinter and mechfab
D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type
D.category |= "Imported"
d_disk.blueprints[slot] = D
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index 388fa3785c..ddf6edc9f9 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -344,6 +344,7 @@
/datum/techweb/specialized/autounlocking
var/design_autounlock_buildtypes = NONE
+ var/design_autounlock_skip_types = NONE
var/design_autounlock_categories = list("initial") //if a design has a buildtype that matches the abovea and either has a category in this or this is null, unlock it.
var/node_autounlock_ids = list() //autounlock nodes of this type.
@@ -356,7 +357,7 @@
research_node_id(id, TRUE, FALSE)
for(var/id in SSresearch.techweb_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(id)
- if(D.build_type & design_autounlock_buildtypes)
+ if(D.build_type & (design_autounlock_buildtypes & allowed_buildtypes) && !(D.build_type & design_autounlock_skip_types))
for(var/i in D.category)
if(i in design_autounlock_categories)
add_design_by_id(D.id)
@@ -364,7 +365,16 @@
/datum/techweb/specialized/autounlocking/autolathe
design_autounlock_buildtypes = AUTOLATHE
- allowed_buildtypes = AUTOLATHE
+ allowed_buildtypes = AUTOLATHE|TOYLATHE
+
+/datum/techweb/specialized/autounlocking/autolathe/public
+ design_autounlock_skip_types = NO_PUBLIC_LATHE
+
+/datum/techweb/specialized/autounlocking/autolathe/toy
+ design_autounlock_buildtypes = TOYLATHE
+
+/datum/techweb/specialized/autounlocking/autolathe/toy/public
+ design_autounlock_skip_types = NO_PUBLIC_LATHE
/datum/techweb/specialized/autounlocking/limbgrower
design_autounlock_buildtypes = LIMBGROWER
@@ -381,10 +391,6 @@
/datum/techweb/specialized/autounlocking/exofab
allowed_buildtypes = MECHFAB
-/datum/techweb/specialized/autounlocking/autoylathe
- design_autounlock_buildtypes = AUTOYLATHE
- allowed_buildtypes = AUTOYLATHE
-
/datum/techweb/specialized/autounlocking/autobottler
design_autounlock_buildtypes = AUTOBOTTLER
allowed_buildtypes = AUTOBOTTLER
\ No newline at end of file
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index 1ad55b12dd..c737e8bc30 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -13,7 +13,7 @@
/obj/item/organ/appendix/on_life()
. = ..()
- if(.)
+ if(. || !owner)
return
owner.adjustToxLoss(4, TRUE, TRUE) //forced to ensure people don't use it to gain tox as slime person
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 146e5c7119..b24034ca4a 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -26,7 +26,7 @@
/obj/item/organ/liver/on_life()
. = ..()
- if(!.)//can't process reagents with a failing liver
+ if(!. || !owner)//can't process reagents with a failing liver
return
if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER))
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 4bb1eaec19..534261f63d 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -108,7 +108,7 @@
var/datum/gas_mixture/enviro = T.return_air()
local_temp = enviro.temperature
- else if(istype(loc, /mob/) && !owner)
+ else if(!owner && ismob(loc))
var/mob/M = loc
if(is_type_in_typecache(M.loc, GLOB.freezing_objects))
if(!(organ_flags & ORGAN_FROZEN))
@@ -137,9 +137,7 @@
/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic
if(organ_flags & ORGAN_FAILING || !owner)
return FALSE
- if(is_cold())
- return FALSE
- if(damage)
+ if(!is_cold() && damage)
///Damage decrements by a percent of its maxhealth
var/healing_amount = -(maxHealth * healing_factor)
///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's satiety
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 4f7502bb02..e27431f8ee 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -579,39 +579,36 @@ GLOBAL_LIST_EMPTY(vending_products)
if(!R || !istype(R) || !R.product_path)
vend_ready = TRUE
return
+ if(R.amount <= 0)
+ to_chat(usr, "Sold out.")
+ vend_ready = TRUE
+ return
if(R in hidden_records)
if(!extended_inventory)
vend_ready = TRUE
return
else if(R in coin_records)
- if(!(coin))
- to_chat(usr, "You need to a coin to get this item!")
+ if(!coin)
+ to_chat(usr, "You need to insert a coin to get this item!")
vend_ready = TRUE
return
if(coin && coin.string_attached)
- if(!prob(50))
- to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!")
- QDEL_NULL(coin)
- return
- if(!usr.CanReach(src))
- to_chat(usr, "You successfully pull [coin] out of [src] to the floor.")
- coin = null
- if(!usr.put_in_hands(coin))
+ if(prob(50))
+ if(usr.put_in_hands(coin))
+ to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.")
+ coin = null
+ else
to_chat(usr, "You couldn't pull [coin] out because your hands are full!")
QDEL_NULL(coin)
- to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.")
- coin = null
- QDEL_NULL(coin)
+ else
+ to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!")
+ QDEL_NULL(coin)
+ else
+ QDEL_NULL(coin)
else if(!(R in product_records))
vend_ready = TRUE
message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!")
return
- if(R.amount <= 0)
- to_chat(usr, "Sold out.")
- vend_ready = TRUE
- return
- else
- R.amount--
if(((last_reply + 200) <= world.time) && vend_reply)
speak(vend_reply)
last_reply = world.time
@@ -623,8 +620,7 @@ GLOBAL_LIST_EMPTY(vending_products)
to_chat(usr, "You take [R.name] out of the slot.")
else
to_chat(usr, "[capitalize(R.name)] falls onto the floor!")
-
-
+ R.amount--
SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]"))
vend_ready = TRUE
return
diff --git a/icons/obj/loot_piles.dmi b/icons/obj/loot_piles.dmi
new file mode 100644
index 0000000000..3d83d6612e
Binary files /dev/null and b/icons/obj/loot_piles.dmi differ
diff --git a/sound/voice/medbot/owo.ogg b/sound/voice/medbot/owo.ogg
new file mode 100644
index 0000000000..0fdaa9d483
Binary files /dev/null and b/sound/voice/medbot/owo.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 3950bb178b..8869563b04 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -393,6 +393,7 @@
#include "code\datums\components\explodable.dm"
#include "code\datums\components\footstep.dm"
#include "code\datums\components\forced_gravity.dm"
+#include "code\datums\components\identification.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
@@ -523,6 +524,7 @@
#include "code\datums\elements\mob_holder.dm"
#include "code\datums\elements\polychromic.dm"
#include "code\datums\elements\snail_crawl.dm"
+#include "code\datums\elements\scavenging.dm"
#include "code\datums\elements\spellcasting.dm"
#include "code\datums\elements\squish.dm"
#include "code\datums\elements\swimming.dm"
@@ -598,7 +600,6 @@
#include "code\datums\wires\airlock.dm"
#include "code\datums\wires\apc.dm"
#include "code\datums\wires\autolathe.dm"
-#include "code\datums\wires\autoylathe.dm"
#include "code\datums\wires\emitter.dm"
#include "code\datums\wires\explosive.dm"
#include "code\datums\wires\microwave.dm"
@@ -736,7 +737,6 @@
#include "code\game\machinery\syndicatebeacon.dm"
#include "code\game\machinery\syndicatebomb.dm"
#include "code\game\machinery\teleporter.dm"
-#include "code\game\machinery\toylathe.dm"
#include "code\game\machinery\transformer.dm"
#include "code\game\machinery\turnstile.dm"
#include "code\game\machinery\washing_machine.dm"
@@ -990,6 +990,7 @@
#include "code\game\objects\items\devices\dogborg_sleeper.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
+#include "code\game\objects\items\devices\electrochromatic_kit.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\forcefieldprojector.dm"
#include "code\game\objects\items\devices\geiger_counter.dm"
@@ -1134,6 +1135,7 @@
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\life_candle.dm"
#include "code\game\objects\structures\loom.dm"
+#include "code\game\objects\structures\loot_pile.dm"
#include "code\game\objects\structures\manned_turret.dm"
#include "code\game\objects\structures\memorial.dm"
#include "code\game\objects\structures\mineral_doors.dm"