diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
index f8d701debe..2d66300953 100644
--- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
+++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm
@@ -71,8 +71,9 @@
/turf/closed/wall/r_wall,
/area/engine/engineering)
"di" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
+/obj/structure/reagent_dispensers/fueltank,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
/area/engine/engineering)
"dl" = (
/obj/structure/cable{
@@ -304,12 +305,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"kH" = (
@@ -523,6 +518,9 @@
/obj/machinery/light{
dir = 4
},
+/obj/structure/sign/warning/enginesafety{
+ pixel_x = 32
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"qv" = (
@@ -543,7 +541,13 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
/area/engine/engineering)
"qN" = (
/obj/structure/table/reinforced,
@@ -848,6 +852,10 @@
/obj/machinery/igniter{
id = "TEG_igniter"
},
+/mob/living/carbon/monkey{
+ name = "Mumkey Jones"
+ },
+/obj/item/clothing/head/hardhat/atmos,
/turf/open/floor/engine/vacuum,
/area/engine/engineering)
"An" = (
@@ -882,14 +890,6 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 1
},
-/obj/machinery/camera{
- c_tag = "TEG - North Center";
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/plasteel,
/area/engine/engineering)
"AX" = (
@@ -1042,12 +1042,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"EI" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/reagent_dispensers/fueltank,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel,
-/area/engine/engineering)
"EL" = (
/turf/closed/wall,
/area/engine/engineering)
@@ -1082,6 +1076,11 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"Fs" = (
+/obj/structure/rack,
+/obj/item/pipe_dispenser,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"FG" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 10
@@ -1218,11 +1217,6 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"Jd" = (
-/obj/machinery/light,
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
/obj/machinery/atmospherics/pipe/manifold/orange/visible,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -1312,15 +1306,6 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"LD" = (
@@ -1372,6 +1357,7 @@
/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
dir = 4
},
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/engineering)
"Nz" = (
@@ -1429,12 +1415,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 4
},
-/obj/machinery/airalarm{
- dir = 1;
- locked = 0;
- pixel_y = -22
- },
/obj/machinery/light,
+/obj/structure/sign/nanotrasen{
+ pixel_y = -32
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"Pz" = (
@@ -1452,6 +1436,9 @@
/obj/machinery/light{
dir = 1
},
+/obj/structure/sign/warning/nosmoking{
+ pixel_y = 30
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"PK" = (
@@ -1522,12 +1509,11 @@
/turf/open/space,
/area/space/nearstation)
"Rl" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
+/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/engineering)
"Rz" = (
@@ -1602,7 +1588,13 @@
/turf/open/floor/plating,
/area/engine/engineering)
"TE" = (
-/obj/structure/closet/crate/internals,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/spawner/lootdrop/maintenance{
+ lootcount = 2;
+ name = "2maintenance loot spawner"
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"TH" = (
@@ -1648,6 +1640,10 @@
dir = 4
},
/obj/effect/turf_decal/tile/yellow,
+/obj/machinery/camera{
+ c_tag = "TEG - North Center";
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"Uq" = (
@@ -1671,18 +1667,15 @@
/area/engine/engineering)
"UT" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"UY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
},
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"Vi" = (
@@ -1811,10 +1804,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
-/obj/structure/extinguisher_cabinet{
- dir = 4;
- pixel_y = -27
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"YC" = (
@@ -1837,9 +1826,10 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"YP" = (
-/obj/structure/rack,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/item/pipe_dispenser,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/plasteel,
/area/engine/engineering)
"YQ" = (
@@ -1878,7 +1868,9 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"Zu" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
+ },
/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/engineering)
@@ -1887,13 +1879,6 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/sign/warning/securearea{
- pixel_y = -32
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/plasteel,
/area/engine/engineering)
"ZC" = (
@@ -2170,7 +2155,7 @@ iD
MP
MP
MP
-ij
+MP
yX
qn
qn
@@ -2251,11 +2236,11 @@ ME
QS
uB
Ok
-Ok
-Ok
+di
+di
Ok
Bz
-Zu
+lI
Wc
Ok
zG
@@ -2307,8 +2292,8 @@ iP
wk
go
fF
-EI
-EI
+UT
+UT
sn
qc
Nh
@@ -2367,7 +2352,7 @@ KA
KA
Ok
dZ
-bO
+Zu
ev
tl
qb
@@ -2477,7 +2462,7 @@ IP
Zs
sD
Jd
-EL
+YP
YG
AX
PK
@@ -2505,7 +2490,7 @@ SX
ou
vG
Zv
-di
+Xe
qJ
Lw
Xe
@@ -2595,7 +2580,7 @@ PK
Dv
Dv
bO
-YP
+sH
As
yN
yN
@@ -2651,7 +2636,7 @@ eh
zx
XW
ST
-Ok
+Fs
MP
tw
tw
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 264fdb1058..c0b4e6a88a 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -1257,6 +1257,16 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"acV" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solar/port/fore)
+"acW" = (
/obj/structure/cable{
icon_state = "0-2"
},
@@ -1266,11 +1276,6 @@
},
/turf/open/floor/plasteel/airless/solarpanel,
/area/solar/port/fore)
-"acW" = (
-/obj/structure/cable,
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solar/port/fore)
"acX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -1489,7 +1494,12 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/starboard/fore)
-"adu" = (
+"adw" = (
+/obj/structure/cable,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solar/port/fore)
+"adx" = (
/obj/structure/cable{
icon_state = "4-8"
},
@@ -1502,56 +1512,17 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/port/fore)
-"adv" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solar/port/fore)
-"adw" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solar/port/fore)
-"adx" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solar/port/fore)
"ady" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/port/fore)
-"adz" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/solar/port/fore)
"adA" = (
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/cable,
+/obj/machinery/power/solar{
+ id = "auxsolareast";
+ name = "Port Auxiliary Solar Array"
},
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/lattice/catwalk,
-/turf/open/space,
+/turf/open/floor/plasteel/airless/solarpanel,
/area/solar/port/fore)
"adB" = (
/obj/structure/cable{
@@ -1817,12 +1788,11 @@
/turf/open/space,
/area/solar/starboard/fore)
"adZ" = (
-/obj/structure/cable,
-/obj/machinery/power/solar{
- id = "auxsolareast";
- name = "Port Auxiliary Solar Array"
+/obj/structure/cable{
+ icon_state = "0-8"
},
-/turf/open/floor/plasteel/airless/solarpanel,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
/area/solar/port/fore)
"aea" = (
/obj/machinery/portable_atmospherics/canister/nitrous_oxide,
@@ -5054,12 +5024,16 @@
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"ajq" = (
-/obj/structure/lattice/catwalk,
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/space,
-/area/solar/port/fore)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating,
+/area/maintenance/solars/port/fore)
"ajr" = (
/obj/structure/table/wood,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -5417,16 +5391,12 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"ajW" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/turf/open/floor/plating,
-/area/maintenance/solars/port/fore)
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solar/port/fore)
"ajX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -6668,15 +6638,17 @@
/area/security/courtroom)
"amv" = (
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solar/port/fore)
"amw" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -8572,13 +8544,15 @@
/turf/open/floor/plasteel,
/area/security/processing)
"aqJ" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plating,
-/area/maintenance/port/fore)
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/solar/port/fore)
"aqK" = (
/obj/structure/chair/stool,
/turf/open/floor/plasteel,
@@ -42345,15 +42319,9 @@
/turf/open/floor/plasteel,
/area/science/circuit)
"bXv" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
+/obj/item/stack/rods,
+/turf/open/space,
+/area/space)
"bXw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
@@ -45067,7 +45035,7 @@
dir = 4
},
/turf/closed/wall/r_wall,
-/area/engine/engineering)
+/area/engine/atmos)
"cez" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
@@ -45521,9 +45489,12 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"cfK" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall,
-/area/engine/engineering)
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/space,
+/area/solar/port/fore)
"cfL" = (
/obj/machinery/firealarm{
pixel_y = 24
@@ -46323,18 +46294,11 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
"chO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
+ req_access_txt = "13"
},
/turf/open/floor/plating,
-/area/maintenance/solars/port/aft)
+/area/maintenance/fore/secondary)
"chP" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -49352,15 +49316,16 @@
/turf/open/space,
/area/maintenance/aft)
"csg" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "10;13"
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
},
/turf/open/floor/plating,
-/area/engine/engineering)
+/area/maintenance/solars/starboard/fore)
"csi" = (
/obj/structure/transit_tube/curved/flipped{
dir = 1
@@ -51153,13 +51118,10 @@
/turf/open/floor/plasteel,
/area/security/processing)
"cxW" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/structure/lattice,
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/space/nearstation)
"cxY" = (
/obj/machinery/camera{
c_tag = "Arrivals Escape Pod 1";
@@ -51258,14 +51220,13 @@
/turf/open/floor/plating,
/area/hallway/secondary/entry)
"cyC" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
+ name = "External Access";
req_access_txt = "13"
},
/turf/open/floor/plating,
-/area/maintenance/starboard)
+/area/maintenance/port/fore)
"cyD" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -51287,15 +51248,13 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cyG" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
+ name = "External Access";
+ req_access_txt = "13"
},
/turf/open/floor/plating,
-/area/engine/atmos)
+/area/maintenance/starboard/fore)
"cyK" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -51341,18 +51300,14 @@
/turf/open/space/basic,
/area/space)
"cyU" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+ dir = 8
},
/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
+ req_access_txt = "13"
},
/turf/open/floor/plating,
-/area/maintenance/solars/starboard/aft)
+/area/maintenance/starboard)
"czg" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -52258,10 +52213,9 @@
/turf/open/space,
/area/space/nearstation)
"cCS" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/lattice,
-/turf/open/space,
-/area/space/nearstation)
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"cCT" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -52328,12 +52282,15 @@
/turf/closed/wall,
/area/engine/engineering)
"cDY" = (
-/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ name = "External Access";
+ req_access_txt = "13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"cDZ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -53612,6 +53569,11 @@
dir = 8
},
/area/crew_quarters/fitness/pool)
+"dCt" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/structure/lattice,
+/turf/open/space,
+/area/space/nearstation)
"dCV" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -54280,6 +54242,12 @@
},
/turf/open/floor/plasteel,
/area/security/range)
+"fty" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/structure/lattice,
+/turf/open/space,
+/area/space/nearstation)
"ftE" = (
/obj/item/radio/intercom{
pixel_y = 25
@@ -54838,10 +54806,6 @@
dir = 8
},
/area/medical/sleeper)
-"haL" = (
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space)
"haM" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -55122,6 +55086,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
+"imk" = (
+/obj/structure/lattice,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 9
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"imH" = (
/obj/structure/falsewall,
/turf/open/floor/plating,
@@ -55417,6 +55388,10 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"jiK" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall,
+/area/engine/engineering)
"jjC" = (
/obj/structure/table/wood,
/obj/item/toy/cards/deck,
@@ -56729,6 +56704,19 @@
/obj/structure/table/wood,
/turf/open/floor/wood,
/area/maintenance/bar)
+"mQp" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/aft)
"mQS" = (
/obj/machinery/light{
dir = 8;
@@ -58858,14 +58846,10 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/pool)
"tAH" = (
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/fore/secondary)
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"tCa" = (
/obj/structure/table/wood,
/obj/item/instrument/guitar{
@@ -58888,6 +58872,19 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"tEK" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/port/aft)
"tHh" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/tile/red,
@@ -59258,7 +59255,7 @@
"uDO" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
- icon_state = "0-2"
+ icon_state = "1-2"
},
/turf/open/space,
/area/solar/port/fore)
@@ -60002,6 +59999,16 @@
/obj/machinery/holopad,
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
+"wmu" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access_txt = "10;13"
+ },
+/turf/open/floor/plating,
+/area/engine/engineering)
"woR" = (
/obj/machinery/cryopod{
dir = 1
@@ -60161,6 +60168,16 @@
/obj/item/hand_labeler,
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
+"wWi" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Airlock";
+ req_access_txt = "24"
+ },
+/turf/open/floor/plating,
+/area/engine/atmos)
"wWT" = (
/obj/effect/landmark/start/roboticist,
/turf/open/floor/plasteel/white,
@@ -67551,7 +67568,7 @@ gXs
gXs
gJi
gJi
-haL
+gXs
aag
gJi
aaa
@@ -68305,7 +68322,7 @@ aaa
aaa
aaa
aae
-ktS
+aaa
gXs
aaa
aaa
@@ -68562,7 +68579,7 @@ aaa
aaa
aaa
aaa
-ktS
+aaa
gXs
aaa
aaa
@@ -68819,7 +68836,7 @@ aaa
aaa
aaa
aaa
-ktS
+aaa
gXs
aaa
aaa
@@ -69076,7 +69093,7 @@ aaa
aaa
aaa
aaa
-ktS
+aaa
gXs
aaa
cqq
@@ -69333,7 +69350,7 @@ aaf
aaf
aaf
aaa
-ktS
+aaa
arB
asE
cyb
@@ -73695,11 +73712,11 @@ aaa
aae
aaa
aaa
-aaa
aag
alU
alU
alU
+alU
aCW
amC
asK
@@ -73952,9 +73969,9 @@ aaa
aaa
aaa
aaa
-aaa
aag
-aqJ
+cyC
+amC
amC
gLH
ase
@@ -74209,7 +74226,7 @@ aaa
aaa
aaa
aaa
-aaa
+gJi
alU
alU
alU
@@ -74958,7 +74975,6 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaS
aaS
@@ -74977,6 +74993,7 @@ aaS
aaf
aaf
aaf
+aaf
aaa
aaa
aaa
@@ -75215,7 +75232,6 @@ aaa
aaa
aaa
aaa
-aaa
abY
aaa
aaf
@@ -75228,7 +75244,7 @@ acy
aaa
aaf
aaa
-aiS
+bXv
aaa
aaS
aaa
@@ -75237,6 +75253,7 @@ aaa
aaa
aaa
aaa
+aaa
alU
aoR
apO
@@ -75472,25 +75489,25 @@ aaa
aaa
aaa
aaa
-aaa
abY
aaa
+acW
acV
-adv
-adZ
+adA
aaa
+acW
acV
-adv
-adZ
+adA
aaa
+acW
acV
-adv
-adZ
+adA
aaa
aaS
aaf
aaf
aaf
+aaf
aaa
aaa
aaa
@@ -75726,23 +75743,22 @@ aaa
aaa
aaa
aaa
-aaa
aae
aaa
aaa
abY
aaf
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaf
aaf
aaa
@@ -75751,6 +75767,7 @@ aaa
aaa
aaa
aaa
+aaa
alU
alU
alU
@@ -75986,20 +76003,19 @@ aaa
aaa
aaa
aaa
-aaa
abY
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaf
-acV
-adu
-adZ
+acW
+adx
+adA
aaf
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
aaf
aaa
@@ -76008,6 +76024,7 @@ aaa
aaa
aaa
aaa
+aaa
aaf
aaa
ali
@@ -76243,20 +76260,20 @@ aaa
aaa
aaa
aaa
-aaa
aaf
aaf
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
+aaf
aaf
aaf
aaf
@@ -76497,26 +76514,26 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaS
aaS
aaf
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
-acV
-adu
-adZ
+acW
+adx
+adA
aaa
aaf
aaa
+aaa
ajV
alR
alR
@@ -76754,27 +76771,27 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaa
aaf
aaa
aaa
aaa
-adw
+adZ
aaa
aaa
aaa
-adw
+adZ
aaa
aaa
aaa
-adw
+adZ
aaa
aaa
ajV
ajV
ajV
+ajV
alQ
amy
ang
@@ -77011,13 +77028,12 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaf
abs
abZ
abZ
-acW
+adw
ady
ady
ady
@@ -77027,9 +77043,10 @@ ady
ady
ady
ady
+cfK
uDO
ajq
-ajW
+akB
akB
alh
alT
@@ -77268,27 +77285,27 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaa
aaf
aaa
aaa
aaa
-adx
+ajW
aaa
aaa
aaa
-adx
+ajW
aaa
aaa
aaa
-adx
+ajW
aaa
aaa
ajV
ajV
ajV
+ajV
alS
amz
anh
@@ -77525,26 +77542,26 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aba
aaS
aaf
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
aaf
aaa
+aaa
ajV
alR
alR
@@ -77785,22 +77802,22 @@ aaa
aaa
aaa
aaa
+aaf
+aaf
+acW
+amv
+adA
aaa
-aaf
-aaf
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
+aaf
+aaf
aaa
-acV
-adz
-adZ
-aaf
-aaf
aaa
aaa
aaa
@@ -78042,24 +78059,24 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaf
-acV
-adz
-adZ
+acW
+amv
+adA
aaf
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
aaf
aaf
aaf
+aaf
gXs
alU
alF
@@ -78299,25 +78316,25 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaf
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaa
-acV
-adz
-adZ
+acW
+amv
+adA
aaf
aaf
aaa
aaa
aaa
+aaa
alU
alU
ank
@@ -78556,22 +78573,22 @@ aaa
aaa
aaa
aaa
+aaS
+aaa
+acW
+aqJ
+adA
+aaa
+acW
+aqJ
+adA
+aaa
+acW
+aqJ
+adA
aaa
aaS
aaa
-acV
-adA
-adZ
-aaa
-acV
-adA
-adZ
-aaa
-acV
-adA
-adZ
-aaa
-aaS
aaa
aaa
aaa
@@ -78658,9 +78675,9 @@ aaf
aaa
aaf
aaa
-aaa
+aaf
hrF
-aaa
+aaf
aaa
aaf
aaa
@@ -78813,7 +78830,6 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaa
aaf
@@ -78831,6 +78847,7 @@ aaa
aaS
aaf
aaf
+aaf
gXs
alU
amC
@@ -78915,9 +78932,9 @@ aaf
aaf
aaf
aaf
-aaf
-hrF
-aaf
+cfx
+tEK
+cfx
aaf
aaf
aaf
@@ -79070,7 +79087,6 @@ aaa
aaa
aaa
aaa
-aaa
aaS
aaS
aaS
@@ -79089,6 +79105,7 @@ aaS
aaa
aaa
aaa
+aaa
alU
amE
ann
@@ -79173,7 +79190,7 @@ aaf
aaa
aaa
cfx
-chO
+chN
cfx
aaa
aaf
@@ -79421,8 +79438,8 @@ caf
aoV
aag
aaf
-aaa
-aaa
+gXs
+gXs
aaf
aaa
aaa
@@ -79675,9 +79692,9 @@ bLv
bCq
aoV
cbj
-aoV
-aag
-aaf
+bLv
+cDY
+bLv
aaf
bCq
bCq
@@ -79933,7 +79950,7 @@ bCq
bCq
cbj
bLv
-bXv
+bHE
bLv
aaf
bCq
@@ -79949,7 +79966,7 @@ ciQ
cfw
aaa
aaa
-aaa
+gXs
aaf
aaf
aaa
@@ -80204,9 +80221,9 @@ cgC
chR
ciS
cfw
-aaa
-aaa
-aaa
+aag
+aag
+aag
aaa
aaf
aaf
@@ -80461,9 +80478,9 @@ cgB
chQ
ciR
cfw
-aag
-aag
-aag
+bCq
+cDY
+bCq
aaa
aaa
aaf
@@ -80719,7 +80736,7 @@ chS
cfw
cfw
bCq
-bXv
+bHE
bCq
aaa
aaa
@@ -90215,7 +90232,7 @@ bUE
bWM
bXJ
bMK
-bMK
+bYH
bYH
bYH
bVg
@@ -92531,10 +92548,10 @@ bWQ
bWQ
caD
bWQ
-ccw
-ccw
+bLK
+bLK
cey
-ccw
+bLK
ccw
ccw
ccw
@@ -92810,14 +92827,14 @@ ckF
cpE
cjR
crW
-csg
+ciZ
+wmu
aag
aaa
aaa
aaa
aaa
aaa
-aaa
ctv
ctv
ctv
@@ -93067,14 +93084,14 @@ crw
cjO
ccw
crX
-cfK
+ciZ
+jiK
aag
aaa
aaa
aaa
aaa
aaa
-aaa
aaT
aaT
aaT
@@ -93325,7 +93342,7 @@ cjm
ccw
ccw
cig
-aag
+cig
aag
aag
aag
@@ -95003,10 +95020,10 @@ aaa
aaa
aaa
aaa
-aaa
acw
abp
abp
+abp
adR
abp
lJC
@@ -95259,10 +95276,10 @@ aaa
aaa
aaa
aaa
-aaa
aaf
aag
acU
+anF
adr
sXy
aeC
@@ -95517,12 +95534,12 @@ aaa
aaa
aaa
aaa
-aaa
aag
abp
abp
abp
abp
+abp
mxn
abp
abp
@@ -96045,7 +96062,7 @@ aaa
ahn
ahn
ahn
-tAH
+anF
ahn
eMs
anG
@@ -96301,8 +96318,8 @@ aaa
aaa
aaa
aaa
-gJi
-gJi
+ahn
+chO
ahn
ahn
khB
@@ -96390,10 +96407,10 @@ bQA
bPj
bOh
cCQ
-bLK
-cyG
-bLK
-aoV
+cCS
+chg
+cCS
+aaf
aoV
aoV
aaf
@@ -96558,8 +96575,8 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+gJi
+gJi
dFX
wWW
dqb
@@ -96646,21 +96663,21 @@ cbI
ccC
cdD
bOh
-cCG
+cCQ
cCS
+wWi
cCS
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cCI
-cDY
+aaa
+aaa
+aaa
+gXs
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+cCQ
aaf
aaf
aaf
@@ -96903,21 +96920,21 @@ cbH
ccB
cbH
bOh
-aaf
-aaa
-aoV
-aaf
-aoV
-aoV
-aoV
-aaf
-aoV
-aoV
-aoV
-aoV
-aoV
-aoV
-gXs
+cCG
+tAH
+dCt
+fty
+dCt
+dCt
+dCt
+fty
+dCt
+dCt
+dCt
+dCt
+dCt
+dCt
+imk
aoV
aaa
aaa
@@ -97161,11 +97178,11 @@ ccD
cbH
bOh
aaf
-aaf
-aaf
-aaf
-aaf
-aoV
+aaa
+aaa
+aaa
+aaa
+aaa
aoV
aaf
aoV
@@ -100424,7 +100441,7 @@ aaa
aaa
aaa
aaa
-aaa
+gXs
aaf
aaf
alO
@@ -100680,8 +100697,8 @@ aaa
aaa
aaa
aaa
-aaa
-aag
+gJi
+alO
alO
arp
alO
@@ -100937,9 +100954,9 @@ aaa
aaa
aaa
aaa
-aaa
-aag
-cxW
+gJi
+cyG
+anf
anf
aqv
ayf
@@ -101194,10 +101211,10 @@ aaf
aaf
aaf
aaf
-aaf
-aag
+cxW
alO
anf
+anf
alO
mAH
jaF
@@ -101703,7 +101720,7 @@ aaa
aaa
aaf
aaa
-aaa
+amw
amw
amw
amw
@@ -101960,8 +101977,8 @@ eaR
jIs
jIs
jIs
-acx
-amv
+csg
+ane
ane
cxN
aog
@@ -102217,7 +102234,7 @@ aaa
aaa
aaf
aaa
-aaa
+amw
amw
amw
amw
@@ -110535,7 +110552,7 @@ cmw
cnj
cnj
cnj
-aaa
+cnj
aaa
aaf
aaa
@@ -110742,7 +110759,7 @@ aaf
aaf
aaf
bky
-cyC
+btp
bns
boF
bqe
@@ -110791,8 +110808,8 @@ clx
cmv
cnk
cnK
-cyU
-cpi
+cnK
+mQp
cpi
cpi
cqJ
@@ -110997,9 +111014,9 @@ aQE
aNa
aaa
aaf
-aaa
-aaf
-aaa
+gXs
+bky
+cyU
bns
boF
bqe
@@ -111049,7 +111066,7 @@ cmx
cnj
cnj
cnj
-aaa
+cnj
aaa
aaf
aaa
@@ -111254,7 +111271,7 @@ afE
aNa
aaa
aaa
-aaa
+gXs
aaf
aaa
bns
@@ -112836,7 +112853,7 @@ aaa
aaa
aaf
cNW
-cPI
+cOe
cNW
aaf
aaf
@@ -113092,9 +113109,9 @@ aaa
aaa
aaa
aaf
-aag
-aag
-aag
+cNW
+cPI
+cNW
aaf
aaa
aaa
@@ -113348,11 +113365,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+gXs
aag
-aaa
-aaa
+aag
+aag
+gXs
aaa
aaa
aaa
@@ -113607,7 +113624,7 @@ aaa
aaa
aaa
aaa
-aaf
+aag
aaa
aaa
aaa
diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 8bf6d0e32b..3c64b9f6ad 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -1848,9 +1848,6 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral,
-/obj/machinery/light_switch{
- pixel_y = -24
- },
/turf/open/floor/plasteel/dark,
/area/crew_quarters/observatory)
"aez" = (
@@ -2177,6 +2174,9 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/light_switch{
+ pixel_x = 24
+ },
/turf/open/floor/plasteel/dark,
/area/crew_quarters/observatory)
"afl" = (
@@ -2722,10 +2722,6 @@
dir = 1;
pixel_y = -22
},
-/obj/machinery/camera{
- c_tag = "Observatory Viewing Area";
- dir = 4
- },
/obj/machinery/light/small{
dir = 8
},
@@ -2882,7 +2878,6 @@
/turf/closed/wall/r_wall,
/area/security/processing)
"agX" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -3188,6 +3183,9 @@
/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"ahL" = (
@@ -3327,15 +3325,12 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/observatory)
"aif" = (
-/obj/machinery/firealarm{
- pixel_y = 26
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aig" = (
@@ -4175,22 +4170,11 @@
/turf/open/floor/plasteel,
/area/construction/secondary)
"akg" = (
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "foreport";
- name = "Port Bow Solar Control"
- },
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "1-2"
},
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akh" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
@@ -4200,14 +4184,16 @@
/turf/open/floor/plating,
/area/construction/secondary)
"akj" = (
-/obj/structure/chair{
- dir = 8
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/door/airlock/external{
+ name = "Starboard Bow Solar Exterior Airlock";
+ req_access_txt = "10;13"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akk" = (
/obj/item/stack/tile/plasteel{
pixel_x = 10;
@@ -4365,18 +4351,12 @@
/turf/open/floor/plasteel,
/area/security/warden)
"akz" = (
-/obj/machinery/light/small{
- dir = 1;
- light_color = "#ffc1c1"
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/turf/open/floor/plasteel,
+/area/router/service)
"akA" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -4483,17 +4463,8 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"akN" = (
-/obj/structure/plasticflaps,
-/obj/structure/fans/tiny,
-/obj/machinery/door/poddoor/preopen{
- id = "secblock";
- name = "Security Router"
- },
-/obj/machinery/conveyor/auto{
- id = "sec"
- },
-/turf/open/floor/plating,
-/area/router/sec)
+/turf/open/space/basic,
+/area/router/aux)
"akO" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -6200,12 +6171,20 @@
/turf/open/floor/grass,
/area/hydroponics)
"aoJ" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/obj/machinery/space_heater,
-/turf/open/floor/plasteel,
-/area/engine/engineering{
- name = "Engine Room"
- })
+/obj/machinery/firealarm{
+ pixel_y = 26
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/fore)
"aoK" = (
/turf/closed/wall/r_wall,
/area/router/service)
@@ -6300,7 +6279,7 @@
/obj/machinery/conveyor{
id = "serv_off"
},
-/obj/machinery/door/poddoor/preopen{
+/obj/machinery/door/poddoor{
id = "servblock";
name = "Service Router"
},
@@ -6309,7 +6288,7 @@
"aoT" = (
/obj/structure/plasticflaps,
/obj/structure/fans/tiny,
-/obj/machinery/door/poddoor/preopen{
+/obj/machinery/door/poddoor{
id = "servblock";
name = "Service Router"
},
@@ -6336,16 +6315,16 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aoW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/external/glass{
- name = "Port Bow Solars External Access";
- req_access_txt = "10;13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/machinery/power/solar_control{
+ dir = 4;
+ id = "foreport";
+ name = "Port Bow Solar Control"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7340,12 +7319,19 @@
/turf/open/floor/plasteel,
/area/security/brig)
"arr" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/chair{
+ dir = 8
},
-/obj/item/stock_parts/cell/high/plus,
/turf/open/floor/plating,
/area/maintenance/solars/port)
"ars" = (
@@ -7779,10 +7765,16 @@
/turf/open/floor/plasteel,
/area/security/prison)
"asl" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/camera{
- c_tag = "Port Bow Solar Maintenance";
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/external/glass{
+ name = "Port Bow Solars External Access";
+ req_access_txt = "10;13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7996,12 +7988,18 @@
name = "Canister Storage"
})
"asH" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
+/obj/machinery/camera{
+ c_tag = "Port Bow Solar Maintenance";
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/structure/sign/warning/electricshock{
+ pixel_y = -32
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -8241,12 +8239,16 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"atn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 8
},
-/obj/machinery/door/airlock/external,
-/turf/open/floor/plasteel,
-/area/router/service)
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plating,
+/area/maintenance/solars/port)
"ato" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -8607,7 +8609,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/item/toy/cards/deck,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
@@ -10456,13 +10458,11 @@
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
"aya" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
},
-/obj/machinery/camera{
- c_tag = "AI Core Exterior";
- dir = 1
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -15009,13 +15009,19 @@
/turf/open/floor/plasteel/stairs/medium,
/area/hallway/secondary/entry)
"aHa" = (
-/obj/structure/disposalpipe/junction/yjunction,
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
- dir = 8
+/obj/structure/cable,
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/locker";
+ dir = 8;
+ name = "Locker Room APC";
+ pixel_x = -24
},
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/fore)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"aHb" = (
/obj/structure/chair,
/obj/machinery/firealarm{
@@ -15103,19 +15109,19 @@
},
/area/chapel/main)
"aHj" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Starboard Bow Solar Exterior Airlock";
- req_access_txt = "10;13"
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"aHk" = (
/obj/structure/chair{
dir = 4
@@ -15163,12 +15169,12 @@
/turf/open/floor/plasteel,
/area/tcommsat/computer)
"aHp" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/fore)
+/turf/open/floor/plating,
+/area/maintenance/fore)
"aHq" = (
/obj/effect/turf_decal/bot,
/obj/structure/disposalpipe/segment,
@@ -15271,13 +15277,14 @@
/area/bridge)
"aHE" = (
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aHF" = (
/turf/open/floor/plasteel/dark,
/area/bridge)
@@ -15841,12 +15848,16 @@
/turf/open/floor/carpet/royalblue,
/area/bridge)
"aIJ" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/maintenance{
+ name = "Fore Maintenance";
+ req_one_access_txt = "12;46"
},
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
/area/hallway/primary/port/fore)
"aIK" = (
/obj/structure/table/wood,
@@ -16804,7 +16815,7 @@
/area/bridge)
"aKw" = (
/obj/structure/table,
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/item/toy/cards/deck,
/obj/structure/disposalpipe/segment{
dir = 4
@@ -17089,13 +17100,22 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"aLc" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Central Maintenance";
- req_one_access_txt = "12"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
/area/hallway/primary/port/fore)
"aLd" = (
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
@@ -17721,14 +17741,16 @@
/turf/closed/wall,
/area/maintenance/department/chapel)
"aMo" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
+/obj/structure/disposalpipe/junction/yjunction,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "1-4"
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/central)
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/fore)
"aMp" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
@@ -17880,18 +17902,15 @@
},
/area/chapel/main)
"aMG" = (
-/obj/structure/disposalpipe/segment,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden,
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "2-8"
},
-/obj/machinery/camera{
- c_tag = "Central Starboard Maintenance";
- dir = 8;
- pixel_y = -22
- },
-/mob/living/simple_animal/hostile/retaliate/bat,
-/turf/open/floor/plating,
-/area/maintenance/starboard/central)
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/fore)
"aMH" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -19880,9 +19899,16 @@
/turf/open/floor/plasteel/white,
/area/crew_quarters/fitness/cogpool)
"aQS" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plating,
-/area/maintenance/central)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/port/fore)
"aQT" = (
/obj/machinery/door/airlock/engineering{
name = "Thermo-Electric Generator";
@@ -20966,19 +20992,18 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aTh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/external/glass{
+ name = "Telecommunications External Access";
+ req_access_txt = "61"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/obj/machinery/power/apc{
- name = "AI Upload Foyer APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aTi" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -22384,6 +22409,18 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/department/eva)
+"aWr" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/maintenance{
+ name = "Central Maintenance";
+ req_one_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/hallway/primary/port/fore)
"aWs" = (
/obj/machinery/light{
dir = 8;
@@ -22411,16 +22448,10 @@
/turf/open/floor/plating,
/area/maintenance/central)
"aWu" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/fitness/cogpool";
- dir = 4;
- name = "Pool APC";
- pixel_x = 24
- },
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/maintenance/central)
"aWv" = (
@@ -22778,18 +22809,18 @@
/turf/open/floor/wood,
/area/library)
"aXf" = (
-/obj/structure/window/reinforced/spawner/east,
-/obj/structure/table/wood,
+/obj/machinery/photocopier,
/obj/machinery/light{
dir = 1;
- light_color = "#c1caff"
+ light_color = "#e8eaff"
},
-/turf/open/floor/carpet,
-/area/library)
+/obj/item/paper/fluff/cogstation/eva,
+/turf/open/floor/plasteel/dark,
+/area/security/checkpoint/customs)
"aXg" = (
-/obj/structure/bookcase/random/reference,
-/turf/open/floor/wood,
-/area/library)
+/obj/machinery/vending/coffee,
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"aXh" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 6
@@ -22837,6 +22868,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"aXm" = (
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/tcommsat/computer)
"aXn" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
@@ -22876,6 +22913,15 @@
"aXr" = (
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
+"aXs" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aXt" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/securearea,
@@ -23872,35 +23918,20 @@
/turf/closed/wall,
/area/lawoffice)
"aZz" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Fore Exterior";
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/turf/open/space/basic,
+/area/maintenance/department/eva)
"aZA" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/computer/card{
dir = 8
},
+/obj/item/paper/guides/cogstation/job_changes,
/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/area/security/checkpoint/customs)
"aZB" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -23920,7 +23951,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/book/manual/wiki/security_space_law,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZD" = (
@@ -23977,13 +24010,21 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/civilian)
"aZI" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/landmark/start/lawyer,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/door/window/northleft{
+ name = "Law Office Counter";
+ req_access_txt = "38"
+ },
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZJ" = (
@@ -24385,13 +24426,21 @@
/turf/open/floor/wood,
/area/library)
"baz" = (
-/obj/machinery/photocopier,
-/obj/machinery/light{
- dir = 1;
- light_color = "#e8eaff"
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/book/manual/wiki/security_space_law,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"baA" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/item/folder/blue,
@@ -24424,10 +24473,12 @@
/turf/open/floor/plasteel/dark,
/area/security/checkpoint/customs)
"baE" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
+/obj/structure/bookcase/random/reference,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/turf/open/floor/wood,
+/turf/open/floor/plasteel/dark,
/area/library)
"baF" = (
/obj/structure/chair/office/dark{
@@ -24976,18 +25027,21 @@
/turf/open/floor/plating,
/area/security/checkpoint/customs)
"bbQ" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32;
- pixel_y = 32
+/obj/structure/cable{
+ icon_state = "0-2"
},
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/fitness/cogpool";
+ dir = 4;
+ name = "Pool APC";
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/engine/engineering{
- name = "Engine Room"
- })
+/turf/open/floor/plating,
+/area/maintenance/central)
"bbR" = (
/obj/structure/closet/crate/hydroponics,
/obj/effect/turf_decal/tile/green,
@@ -25236,11 +25290,17 @@
/turf/closed/wall/r_wall,
/area/science/mixing)
"bcz" = (
-/obj/machinery/computer/card{
- dir = 8
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/newscaster{
+ pixel_x = -30
},
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"bcA" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -26085,9 +26145,21 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"beC" = (
-/obj/machinery/recharge_station,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/rack,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/radio/off,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"beD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -26110,13 +26182,16 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"beG" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Fore Exterior";
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/lawyer,
+/obj/structure/chair/stool,
+/turf/open/floor/plasteel/dark,
+/area/lawoffice)
"beH" = (
/obj/structure/window/reinforced/spawner/east,
/obj/machinery/light{
@@ -27393,19 +27468,16 @@
/turf/open/floor/wood,
/area/medical/medbay/lobby)
"bhy" = (
-/obj/structure/closet/crate/science,
-/obj/item/stack/sheet/metal/ten,
-/obj/item/stack/sheet/glass/five,
-/obj/item/stack/rods/twentyfive,
-/obj/item/target/syndicate,
-/obj/item/target/alien,
-/obj/item/target,
-/obj/item/target/clown,
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 10
+/obj/structure/plasticflaps,
+/obj/structure/fans/tiny,
+/obj/machinery/conveyor/auto{
+ id = "sec"
},
-/turf/open/floor/plasteel,
-/area/science/mixing)
+/obj/machinery/door/poddoor{
+ name = "Security Router"
+ },
+/turf/open/floor/plating,
+/area/router/sec)
"bhz" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
@@ -27774,8 +27846,15 @@
/turf/open/floor/plating,
/area/quartermaster/storage)
"bim" = (
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/button/massdriver{
+ id = "router_in";
+ name = "mass driver button (Router)";
+ pixel_x = 24;
+ pixel_y = -8
+ },
+/turf/open/floor/plating,
+/area/maintenance/disposal)
"bin" = (
/obj/machinery/computer/mecha{
dir = 4
@@ -30316,6 +30395,18 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
+"bnl" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
"bnm" = (
/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
dir = 4
@@ -30587,9 +30678,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bnS" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/cogpool)
"bnT" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
@@ -30706,17 +30799,17 @@
/turf/open/floor/plasteel,
/area/ai_monitored/nuke_storage)
"bof" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/obj/machinery/door/airlock/external/glass{
name = "Pool Exterior Access";
req_access_txt = "13"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/space/basic,
/area/crew_quarters/fitness/cogpool)
"bog" = (
/obj/machinery/light{
@@ -31910,7 +32003,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
-/obj/item/storage/pill_bottle/dice,
+/obj/item/storage/box/dice,
/obj/item/toy/cards/deck,
/turf/open/floor/plasteel/white/corner{
dir = 1
@@ -32817,19 +32910,9 @@
/turf/open/floor/plasteel/stairs/left,
/area/hydroponics)
"bsx" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- name = "Recycler Exterior Access";
- req_one_access_txt = "13;50"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal)
+/obj/structure/lattice,
+/turf/closed/wall/r_wall,
+/area/crew_quarters/fitness/cogpool)
"bsy" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -33235,21 +33318,9 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"btw" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light/small,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/department/eva)
+/obj/machinery/atmospherics/components/unary/outlet_injector/on,
+/turf/open/floor/plating/airless,
+/area/router)
"btx" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
@@ -33867,9 +33938,18 @@
/area/janitor)
"bvb" = (
/obj/structure/disposalpipe/segment,
-/obj/effect/landmark/blobstart,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/engineering{
+ name = "Electrical Substation";
+ req_access_txt = "10"
+ },
+/obj/structure/fans/tiny,
/turf/open/floor/plating,
-/area/maintenance/starboard/central)
+/area/engine/storage_shared{
+ name = "Electrical Substation"
+ })
"bvc" = (
/obj/machinery/computer/cargo/request,
/obj/machinery/airalarm{
@@ -34166,17 +34246,13 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bvM" = (
-/obj/machinery/door/airlock/external/glass{
- name = "External Construction Access";
- req_one_access_txt = "10;31"
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Aft Exterior";
+ pixel_x = 22
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
+/turf/open/space/basic,
+/area/router)
"bvN" = (
/obj/machinery/atmospherics/components/binary/valve/digital/on{
dir = 4
@@ -34423,10 +34499,13 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"bwp" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/structure/disposalpipe/segment{
+ dir = 6
},
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"bwq" = (
@@ -34650,6 +34729,20 @@
},
/turf/open/floor/plating,
/area/router)
+"bwM" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/camera{
+ c_tag = "Central Starboard Maintenance";
+ dir = 8;
+ pixel_y = -22
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/mob/living/simple_animal/hostile/retaliate/bat,
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
"bwN" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
@@ -34883,21 +34976,30 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai)
"bxm" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/tcommsat/computer)
-"bxn" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/department/eva)
+"bxn" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/camera{
+ c_tag = "AI Core Exterior";
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/maintenance/department/eva)
"bxo" = (
/obj/machinery/door/airlock/external{
name = "Telecommunications External Access";
@@ -34921,11 +35023,16 @@
/turf/open/floor/plating,
/area/maintenance/department/chapel)
"bxq" = (
+/obj/structure/disposalpipe/segment,
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "1-2"
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plating,
-/area/tcommsat/computer)
+/area/maintenance/starboard/central)
"bxr" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/purple,
@@ -34955,18 +35062,13 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"bxt" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Telecommunications External Access";
- req_access_txt = "61"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
/turf/open/floor/plating,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxu" = (
/obj/structure/rack,
/obj/item/circuitboard/machine/telecomms/broadcaster,
@@ -35124,18 +35226,15 @@
/turf/open/floor/plasteel,
/area/tcommsat/computer)
"bxK" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxL" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -35428,32 +35527,29 @@
/turf/open/floor/plasteel,
/area/router/eva)
"byt" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
+"byu" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/landmark/blobstart,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
+"byv" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/camera{
c_tag = "Central Starboard Exterior Access"
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/central)
-"byu" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "Central Starboard Exterior Access";
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/central)
-"byv" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 1
- },
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"byw" = (
@@ -35815,11 +35911,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"bzp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/structure/lattice/catwalk,
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/area/maintenance/disposal)
"bzq" = (
/obj/machinery/light{
dir = 8
@@ -36136,14 +36232,19 @@
/turf/open/floor/plasteel,
/area/gateway)
"bAd" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Central Starboard Exterior Access";
+ req_access_txt = "13"
},
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 5
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/starboard/central)
@@ -36375,6 +36476,15 @@
/area/medical/medbay/zone2{
name = "Medbay Treatment Center"
})
+"bAz" = (
+/obj/structure/disposalpipe/junction/flip{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
"bAA" = (
/obj/structure/lattice,
/obj/structure/cable{
@@ -36532,6 +36642,19 @@
/area/medical/medbay/zone2{
name = "Medbay Treatment Center"
})
+"bAN" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/space/fragile,
+/obj/item/clothing/head/helmet/space/fragile,
+/obj/item/tank/internals/air,
+/obj/item/flashlight,
+/obj/machinery/airalarm{
+ dir = 1;
+ locked = 0;
+ pixel_y = -22
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/central)
"bAO" = (
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
dir = 4
@@ -37527,12 +37650,20 @@
/turf/open/floor/plasteel/showroomfloor,
/area/medical/morgue)
"bDb" = (
-/mob/living/simple_animal/mouse/white{
- desc = "Wubba lubba dub dub.";
- name = "Rick"
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/morgue)
+/obj/machinery/door/airlock/external{
+ name = "Recycler Exterior Access";
+ req_one_access_txt = "13;50"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/turf/open/floor/plasteel,
+/area/maintenance/disposal)
"bDc" = (
/obj/machinery/vending/security,
/obj/structure/disposalpipe/segment,
@@ -38158,16 +38289,20 @@
},
/area/crew_quarters/heads/captain)
"bEr" = (
-/obj/structure/cable,
-/obj/machinery/power/apc{
- areastring = "/area/crew_quarters/locker";
- dir = 8;
- name = "Locker Room APC";
- pixel_x = -24
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32;
+ pixel_y = 32
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plating,
-/area/maintenance/fore)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering{
+ name = "Engine Room"
+ })
"bEs" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/tile/yellow{
@@ -38355,9 +38490,15 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"bEK" = (
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plating,
-/area/maintenance/fore)
+/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/machinery/space_heater,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/engineering{
+ name = "Engine Room"
+ })
"bEL" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -38591,9 +38732,19 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai)
"bFg" = (
-/obj/effect/turf_decal/tile/brown,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/suit_storage_unit/engine,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
/turf/open/floor/plasteel,
-/area/quartermaster/miningoffice)
+/area/engine/engineering{
+ name = "Engine Room"
+ })
"bFh" = (
/obj/effect/turf_decal/tile/brown,
/obj/machinery/light,
@@ -39046,23 +39197,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bFY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/structure/noticeboard{
- pixel_y = 28
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/obj/structure/lattice/catwalk,
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"bFZ" = (
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
@@ -39247,14 +39384,15 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bGu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Fore Maintenance";
- req_one_access_txt = "12;46"
+/obj/structure/cable{
+ icon_state = "1-4"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plating,
-/area/hallway/primary/port/fore)
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet/restrooms)
"bGv" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -39621,20 +39759,15 @@
/turf/open/floor/plasteel,
/area/security/main)
"bHi" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/effect/landmark/event_spawn,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/port/fore)
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet/restrooms)
"bHj" = (
/obj/structure/table,
/obj/structure/bedsheetbin/towel,
@@ -40740,7 +40873,11 @@
/obj/machinery/airalarm{
pixel_y = 24
},
-/turf/open/floor/wood,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/library)
"bJD" = (
/obj/machinery/disposal/bin{
@@ -40891,15 +41028,11 @@
/turf/open/floor/plasteel/white,
/area/science/mixing)
"bJU" = (
-/obj/effect/turf_decal/tile/brown,
-/obj/machinery/light{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningoffice)
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/toilet/restrooms)
"bJV" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
dir = 1;
@@ -41361,7 +41494,11 @@
/area/science/robotics/lab)
"bKR" = (
/obj/structure/bookcase/random/religion,
-/turf/open/floor/wood,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/library)
"bKS" = (
/obj/machinery/door/firedoor,
@@ -42981,22 +43118,30 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bOn" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Shuttle Maintenance Access"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/maintenance{
+ name = "Bathroom Maintenance";
+ req_access_txt = "12"
},
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/toilet/restrooms)
"bOo" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/warning/docking,
/turf/open/floor/plating,
/area/hallway/secondary/exit)
"bOp" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Departures Shuttle Dock"
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel,
-/area/hallway/secondary/exit)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/aft)
"bOq" = (
/obj/machinery/power/tracker,
/obj/structure/cable,
@@ -44925,8 +45070,12 @@
/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"bRZ" = (
-/obj/structure/bookcase/random/fiction,
-/turf/open/floor/wood,
+/obj/structure/bookcase/random/nonfiction,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/library)
"bSa" = (
/obj/structure/closet/secure_closet/medical3,
@@ -45708,11 +45857,11 @@
/area/engine/atmos)
"bTJ" = (
/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/violet/hidden{
- dir = 8
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/disposal)
"bTK" = (
/turf/open/floor/engine/co2,
/area/engine/atmos)
@@ -45950,17 +46099,12 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUj" = (
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/violet/hidden{
+ dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"bUk" = (
/obj/structure/closet/crate,
/obj/effect/decal/cleanable/cobweb,
@@ -46332,11 +46476,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUV" = (
-/obj/structure/lattice,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/violet/hidden{
dir = 10
},
+/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
"bUW" = (
@@ -46569,15 +46713,15 @@
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
"bVt" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/brown{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/central)
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
"bVu" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/radio/intercom{
@@ -46688,14 +46832,9 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bVD" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"bVE" = (
/obj/effect/landmark/start/atmospheric_technician,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -47121,13 +47260,16 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bWq" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Aft Exterior";
- pixel_x = 22
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"bWr" = (
/obj/structure/closet/l3closet/scientist,
/obj/effect/turf_decal/stripes/line,
@@ -47293,17 +47435,18 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bWJ" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"bWK" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/orange/visible,
@@ -47901,11 +48044,9 @@
/turf/open/floor/plating,
/area/router)
"bXN" = (
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/obj/machinery/smartfridge/organ/preloaded,
+/turf/closed/wall,
+/area/medical/morgue)
"bXO" = (
/obj/structure/table/glass,
/obj/machinery/reagentgrinder,
@@ -47922,7 +48063,7 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/space/nearstation)
"bXQ" = (
/obj/structure/closet/l3closet/scientist,
@@ -47979,7 +48120,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/space/nearstation)
"bXW" = (
/obj/structure/disposalpipe/segment{
@@ -48671,8 +48812,10 @@
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
"bZo" = (
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/restrooms)
+/obj/effect/turf_decal/tile/brown,
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
"bZp" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -48706,13 +48849,13 @@
/turf/open/floor/plating,
/area/hallway/primary/central)
"bZs" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Bathroom Maintenance";
- req_access_txt = "12"
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/crew_quarters/toilet/restrooms)
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
"bZt" = (
/turf/closed/wall,
/area/maintenance/starboard/aft)
@@ -48859,8 +49002,11 @@
/turf/open/floor/carpet,
/area/library)
"bZK" = (
-/obj/structure/bookcase/random/nonfiction,
-/turf/open/floor/wood,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
/area/library)
"bZL" = (
/obj/machinery/air_sensor/atmos/nitrous_tank,
@@ -48928,14 +49074,15 @@
},
/area/library)
"bZV" = (
+/obj/structure/window/reinforced/spawner/east,
/obj/structure/table/wood,
-/obj/structure/window/reinforced/spawner/north,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
},
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet,
/area/library)
"bZW" = (
/obj/structure/sign/warning/fire,
@@ -49653,18 +49800,24 @@
/turf/open/floor/plating,
/area/ai_monitored/storage/eva)
"cbI" = (
-/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Airlock";
+ req_access_txt = "24"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"cbJ" = (
/obj/structure/table/reinforced,
/obj/item/analyzer,
@@ -49706,19 +49859,13 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbM" = (
@@ -50874,24 +51021,17 @@
/turf/closed/wall/r_wall,
/area/medical/medbay/lobby)
"cea" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/photocopier,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/table/wood,
+/obj/structure/window/reinforced/spawner/north,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- name = "Cargo RC";
- pixel_y = 30
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet{
+ icon_state = "carpetsymbol"
},
-/obj/machinery/camera{
- c_tag = "Supply - Delivery Office Aft";
- network = list("ss13","rd")
- },
-/obj/item/paper/guides/cogstation/disposals,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
+/area/library)
"ceb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -52612,9 +52752,8 @@
/turf/open/floor/plasteel,
/area/engine/teg_hot)
"chC" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/disposal)
+/turf/closed/wall/r_wall/rust,
+/area/space/nearstation)
"chD" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -53089,6 +53228,17 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"ciA" = (
+/obj/effect/turf_decal/tile/brown,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
"ciB" = (
/obj/structure/frame/computer,
/obj/structure/disposalpipe/segment,
@@ -54655,18 +54805,15 @@
/turf/open/floor/circuit/telecomms/mainframe,
/area/tcommsat/server)
"clO" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/tile/brown,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
},
-/obj/machinery/door/airlock/engineering{
- name = "Electrical Substation";
- req_access_txt = "10"
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
},
-/turf/open/floor/plating,
-/area/engine/storage_shared{
- name = "Electrical Substation"
- })
+/turf/open/floor/plasteel,
+/area/quartermaster/miningoffice)
"clP" = (
/obj/structure/table,
/obj/item/stock_parts/subspace/amplifier,
@@ -55625,6 +55772,29 @@
icon_state = "panelscorched"
},
/area/maintenance/port/fore)
+"cnG" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Shuttle Maintenance Access"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit)
+"cnH" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Departures Shuttle Dock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/hallway/secondary/exit)
+"cnI" = (
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/space/nearstation)
+"cnJ" = (
+/obj/structure/girder,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"cnK" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -55634,10 +55804,69 @@
},
/turf/open/floor/plasteel,
/area/engine/teg_hot)
+"cnL" = (
+/obj/structure/closet/crate/science,
+/obj/item/stack/sheet/metal/ten,
+/obj/item/stack/sheet/glass/five,
+/obj/item/stack/rods/twentyfive,
+/obj/item/target/syndicate,
+/obj/item/target/alien,
+/obj/item/target,
+/obj/item/target/clown,
+/turf/open/floor/plasteel,
+/area/science/mixing)
+"cnM" = (
+/obj/machinery/mass_driver{
+ dir = 8;
+ id = "pb_in";
+ name = "Router Driver"
+ },
+/turf/open/floor/plating/airless,
+/area/router/aux)
+"cnN" = (
+/obj/structure/bookcase/random/fiction,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/library)
"cnO" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/engine,
/area/science/storage)
+"cnP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/item/kirbyplants{
+ icon_state = "plant-21";
+ pixel_y = 3
+ },
+/turf/open/floor/wood,
+/area/library)
+"cnQ" = (
+/obj/structure/lattice,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/camera{
+ c_tag = "Supply - Warehouse Exterior";
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/quartermaster/warehouse)
+"cnR" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cnS" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -56406,18 +56635,25 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cpm" = (
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/delivery,
+/obj/machinery/photocopier,
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/machinery/requests_console{
+ department = "Cargo Bay";
+ departmentType = 2;
+ name = "Cargo RC";
+ pixel_y = 30
},
-/obj/machinery/newscaster{
- pixel_x = -30
+/obj/machinery/camera{
+ c_tag = "Supply - Delivery Office Aft";
+ network = list("ss13","rd")
},
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/obj/item/paper/guides/cogstation/disposals,
+/obj/item/paper/fluff/cogstation/mulebot,
+/turf/open/floor/plasteel,
+/area/quartermaster/sorting)
"cpn" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -58290,8 +58526,9 @@
req_access_txt = "5"
},
/obj/item/clipboard,
-/obj/item/clothing/glasses/hud/health,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med,
+/obj/item/clothing/glasses/hud/health,
/obj/item/pen,
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plasteel/white,
@@ -61157,17 +61394,15 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
"cyd" = (
-/obj/effect/turf_decal/tile/brown{
- dir = 1
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/effect/turf_decal/tile/purple{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/quartermaster/miningoffice)
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cye" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -65512,19 +65747,24 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cFs" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/structure/noticeboard{
+ pixel_y = 28
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/item/paper/guides/cogstation/letter_med,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone2{
- name = "Medbay Treatment Center"
- })
+/area/medical/medbay/central)
"cFt" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -67715,12 +67955,10 @@
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
"cJg" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/restrooms)
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJh" = (
/obj/structure/table,
/obj/structure/bedsheetbin/towel,
@@ -67823,15 +68061,17 @@
name = "Engine Room"
})
"cJq" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/suit_storage_unit/engine,
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
+/obj/structure/cable{
+ icon_state = "1-2"
},
+/obj/machinery/door/airlock/external/glass{
+ name = "External Construction Access";
+ req_one_access_txt = "10;31"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plasteel,
-/area/engine/engineering{
- name = "Engine Room"
- })
+/area/quartermaster/warehouse)
"cJr" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
@@ -67840,23 +68080,28 @@
/turf/open/space/basic,
/area/space/nearstation)
"cJs" = (
-/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
- dir = 4
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJt" = (
-/obj/structure/lattice/catwalk,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/power/apc{
+ name = "AI Upload Foyer APC";
+ pixel_y = -24
+ },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 5
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cJu" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -69804,12 +70049,20 @@
/turf/open/floor/plating,
/area/quartermaster/miningdock/airless)
"cNC" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/freezer,
-/area/crew_quarters/toilet/restrooms)
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cND" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
@@ -70752,15 +71005,25 @@
/turf/open/space/basic,
/area/space/nearstation)
"cPG" = (
-/obj/structure/lattice,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/camera{
- c_tag = "Supply - Warehouse Exterior";
- dir = 1
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/turretid{
+ control_area = "/area/science/server";
+ icon_state = "control_stun";
+ name = "Computer Core turret control";
+ pixel_x = -3;
+ pixel_y = -23;
+ req_access_txt = "65"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/science/server{
+ name = "Computer Core"
+ })
"cPH" = (
/obj/machinery/conveyor_switch{
id = "EngiCargoConveyer"
@@ -71613,9 +71876,6 @@
/obj/item/paper/guides/jobs/medical/cloning{
pixel_x = -4
},
-/obj/item/paper/fluff/cogstation/cloner{
- pixel_x = 6
- },
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"cRc" = (
@@ -71681,22 +71941,11 @@
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"cRh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
-/obj/machinery/turretid{
- control_area = "/area/science/server";
- icon_state = "control_stun";
- name = "Computer Core turret control";
- pixel_x = -3;
- pixel_y = -23;
- req_access_txt = "65"
- },
-/turf/open/floor/plasteel,
-/area/science/server{
- name = "Computer Core"
- })
+/turf/closed/wall/r_wall,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cRi" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
@@ -71840,6 +72089,53 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
+"cRs" = (
+/obj/machinery/recharge_station,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 9
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
+"cRt" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/quartermaster/warehouse)
+"cRu" = (
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/science/mixing)
+"cRv" = (
+/mob/living/simple_animal/opossum{
+ desc = "Wubba lubba dub dub.";
+ name = "Rick"
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/morgue)
+"cRw" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med{
+ pixel_y = 4
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone2{
+ name = "Medbay Treatment Center"
+ })
"cVq" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
@@ -71947,14 +72243,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"frb" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/space/basic,
-/area/space/nearstation)
"fti" = (
/obj/machinery/atmospherics/components/binary/pump,
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
@@ -84767,7 +85055,7 @@ akI
aAJ
cMp
aYa
-bxm
+akI
akI
aNC
bxv
@@ -85023,7 +85311,7 @@ aLH
akI
aAK
aRC
-bxn
+aHj
akI
bxA
hiV
@@ -85536,11 +85824,11 @@ aaU
aaa
aaU
aEa
-cMK
-bxq
+aXm
+aXs
bxC
akI
-bxK
+beC
bxY
byh
byb
@@ -85794,7 +86082,7 @@ aaU
aaU
aEa
cMK
-bxt
+aHE
akI
akI
akI
@@ -86050,9 +86338,9 @@ aaU
aaa
aaU
aEa
-aHE
-bab
-aaa
+cMK
+aTh
+akI
aaa
aaU
aaa
@@ -86307,7 +86595,8 @@ aaU
aaU
aaU
aEb
-aPT
+aya
+bab
aaU
aaU
aye
@@ -86325,7 +86614,6 @@ aye
aye
aye
aye
-aye
aaa
aaa
aaa
@@ -90474,7 +90762,7 @@ aaa
aaa
aaa
aaa
-aaa
+aWj
aaU
aaa
aaU
@@ -90730,9 +91018,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+bcw
+aUZ
+bcw
aaa
bcy
cnU
@@ -90988,7 +91276,7 @@ aaa
aaa
aaa
bcw
-aUZ
+cRu
bcw
aaa
bcy
@@ -91010,7 +91298,7 @@ aaa
aaa
aaU
aaa
-bAb
+brs
bxT
bFq
bHY
@@ -91180,10 +91468,10 @@ aaa
aaa
aaU
abx
-aqw
-aoW
-aqw
-aqw
+aiN
+alu
+aiN
+abx
aaU
aaa
aaa
@@ -91437,9 +91725,9 @@ aaa
aaa
aaU
abx
-akg
-apS
-arr
+aiN
+asl
+aiN
abx
aaU
aaa
@@ -91694,9 +91982,9 @@ aaa
aaa
aaU
aiN
-akj
-anV
-asl
+aoW
+apS
+asH
abx
aaU
aaU
@@ -91951,9 +92239,9 @@ aaa
aaa
aaU
aiN
-akz
+arr
aDO
-asH
+atn
awm
axc
awm
@@ -92528,7 +92816,7 @@ aaa
aaa
aaa
aaa
-aaU
+aaa
bcy
bed
boJ
@@ -93042,11 +93330,11 @@ aaa
aaa
aaa
aaa
-aaa
+aaU
+bQe
+aaU
aaU
aaU
-aaa
-aaa
bcw
bdf
bdf
@@ -93299,13 +93587,13 @@ aaa
aaa
aaa
aaa
-aaa
-bim
+aaU
+aye
+aaU
aaU
aaU
-aaa
bcw
-bhy
+cnL
bdf
bpR
bJw
@@ -93557,10 +93845,10 @@ aaa
aaa
aaa
aaU
-aaa
-aaa
-aaU
-aaU
+chC
+abp
+abp
+abp
bcy
biK
bdf
@@ -93814,10 +94102,10 @@ aaa
aaa
aaa
aaU
-aaa
-aaa
-aaa
-aaU
+brs
+brs
+brs
+brs
bcw
biT
bdf
@@ -94071,8 +94359,8 @@ aaU
aaU
aaU
aaU
-aaa
-aaa
+cnI
+cnJ
bgW
bgW
bgW
@@ -95316,7 +95604,7 @@ aNL
aNL
aVl
aYT
-baz
+aXf
bFH
aYT
aaU
@@ -96860,7 +97148,7 @@ aVL
aYT
baG
bbM
-bcz
+aZA
aYT
bdy
beM
@@ -97834,16 +98122,16 @@ aaa
aaa
aaa
aaa
-aak
-aak
-aak
+aaU
+aaa
+aaU
aaa
aaa
aaa
aaa
aaa
aaa
-akN
+bhy
alq
alq
apn
@@ -97911,7 +98199,7 @@ bgA
bWf
bXm
bZQ
-ccN
+bWq
ccN
cei
ccN
@@ -98169,7 +98457,7 @@ aZy
aZy
aZy
aZy
-beJ
+aXg
bfd
bjg
bUt
@@ -98348,9 +98636,9 @@ aaa
aaa
aaa
aaa
-aWj
-aWj
-aWj
+aaU
+aaa
+aaU
aaa
aaa
aaa
@@ -98598,16 +98886,16 @@ aaU
aar
abM
ace
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
+aaU
+aaU
+aaU
+aaU
+aaU
+aaU
+aaU
+aaU
abp
-aWj
+aaU
aaU
aaU
aaU
@@ -98855,16 +99143,16 @@ aaU
aar
abR
ace
-aWj
+aaU
aaa
aaa
aaa
aaa
aaa
aaa
-aWj
-aWj
-aWj
+aaU
+aaa
+aaU
aaa
aaa
aaa
@@ -99112,7 +99400,7 @@ aaU
aar
abM
acf
-aWj
+aaU
aaa
aaa
aaa
@@ -99197,12 +99485,12 @@ bWh
csG
bQA
aZy
-aXf
+bZV
bZJ
bZF
cpu
bax
-bZV
+cea
bZX
ccY
cab
@@ -99368,8 +99656,8 @@ aaa
aaU
aaa
acM
-aWj
-aWj
+aaa
+aaU
aaa
aaa
aaa
@@ -99445,8 +99733,8 @@ bnz
bpw
bQx
bll
-aZz
-cpm
+aZC
+bcz
bad
bah
baR
@@ -99454,8 +99742,8 @@ bWi
aWh
cmN
aZy
-aXg
-bZK
+baE
+bRZ
bZF
csH
bay
@@ -99625,7 +99913,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -99702,8 +99990,8 @@ bnA
bpy
bQI
bll
-aZA
aZI
+beG
bae
chP
baS
@@ -99712,7 +100000,7 @@ baS
bbr
aZy
bJC
-bZF
+bZK
bZF
cjx
bay
@@ -99882,7 +100170,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -99959,7 +100247,7 @@ bnD
bpC
bQx
bll
-aZC
+baz
aZN
bCS
bak
@@ -99969,10 +100257,10 @@ cdE
bbs
aZy
bKR
-bRZ
+cnN
bZF
cCJ
-baE
+cnP
bZS
bZS
bGI
@@ -100139,7 +100427,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
add
adC
@@ -100396,7 +100684,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adf
aad
@@ -100653,7 +100941,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adf
aad
@@ -100910,7 +101198,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adf
aad
@@ -101167,7 +101455,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adf
aad
@@ -101424,7 +101712,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adf
aad
@@ -101681,7 +101969,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
adh
adC
@@ -101938,7 +102226,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -102193,9 +102481,9 @@ aaa
aaa
aaa
aaU
-aar
aaU
-aWj
+aaU
+aaU
aaU
aaU
aaU
@@ -102450,9 +102738,9 @@ aaa
aaa
aaa
abp
-aar
+akN
aTd
-aWj
+aaa
abp
aaa
aaU
@@ -102577,7 +102865,7 @@ caR
czi
cKj
buS
-bFY
+cFs
cEX
bIU
aJE
@@ -102707,9 +102995,9 @@ aaa
aaa
aaa
aaU
-aar
aaU
-aWj
+aaU
+aaU
aaU
aaU
aaU
@@ -102966,7 +103254,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -103223,7 +103511,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
aaa
adj
@@ -103353,7 +103641,7 @@ cFe
cFk
cFm
cFq
-cFs
+cRw
cFz
bqt
blx
@@ -103480,7 +103768,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adj
@@ -103737,7 +104025,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adF
@@ -103994,7 +104282,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adF
@@ -104251,7 +104539,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adF
@@ -104285,12 +104573,12 @@ aJF
aJF
aJF
aJF
-bEr
-bEK
-bEK
-bGu
-bHi
aHa
+aHp
+aHp
+aIJ
+aLc
+aMo
cBj
cBw
cBF
@@ -104508,7 +104796,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adF
@@ -104547,15 +104835,15 @@ aim
aim
aEh
aEq
-aHp
-aIJ
-aLc
-aQS
-aQS
-aQS
-aQS
+aMG
aQS
+aWr
aWu
+aWu
+aWu
+aWu
+aWu
+bbQ
aWA
aXd
bre
@@ -104598,8 +104886,8 @@ bLz
bNe
ajO
bQb
-bUj
-aTh
+cnR
+cJt
bfh
brb
bzN
@@ -104765,7 +105053,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adF
@@ -104839,9 +105127,9 @@ bOV
aRq
cjD
bnU
-btw
+bxm
bns
-aya
+bxn
avy
alo
awn
@@ -104856,7 +105144,7 @@ bPp
bPU
bQi
bUU
-bWJ
+cNC
bWP
cbV
bzR
@@ -105022,7 +105310,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaU
adj
adj
@@ -105096,7 +105384,7 @@ aSt
aSt
aSt
aSt
-cpG
+aWd
aSt
brs
avv
@@ -105113,7 +105401,7 @@ cRf
bPV
bQT
bVq
-cRh
+cPG
bfh
cbY
cdn
@@ -105279,7 +105567,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaU
adj
@@ -105340,7 +105628,7 @@ axV
aog
aog
aSH
-beG
+aZz
aaU
aaU
aaU
@@ -105352,9 +105640,9 @@ aRv
aaU
aaU
aaU
-aWj
-aSq
-aWj
+aSt
+cpG
+aSt
aaU
avv
ajO
@@ -105370,7 +105658,7 @@ ajO
ajO
aRy
bVC
-aRy
+cRh
bfh
bfh
bBR
@@ -105536,7 +105824,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -105626,8 +105914,8 @@ bmH
aYZ
bht
bcY
-bVD
-beC
+cyd
+cRs
cgF
bfh
bBS
@@ -105660,7 +105948,7 @@ cbm
byQ
bHK
cGU
-byQ
+bXN
bHK
bIu
bJh
@@ -105793,7 +106081,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -105850,7 +106138,7 @@ aOJ
aOJ
bmF
bnT
-aRJ
+bnT
aRJ
aRJ
chm
@@ -106050,7 +106338,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -106106,13 +106394,13 @@ bfv
bfv
bkW
bmJ
+bnS
bof
aQJ
aQJ
aQJ
aQJ
aQJ
-aQJ
aRZ
aaU
aaa
@@ -106174,7 +106462,7 @@ cyP
byQ
bzS
czw
-bDb
+cRv
bBu
crX
czI
@@ -106307,7 +106595,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -106364,7 +106652,7 @@ bjL
blD
bmK
boi
-aaU
+bsx
aaU
aaU
aaU
@@ -106564,7 +106852,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -106622,7 +106910,7 @@ aOJ
aPN
bes
aaU
-aye
+bQe
aye
bQe
aye
@@ -106821,7 +107109,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -107078,7 +107366,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -107191,11 +107479,11 @@ cIA
cIP
cIY
cJf
-cJg
-cNC
-bZo
-bZs
-bXN
+bGu
+bHi
+bJU
+bOn
+bOp
bJp
bJp
cyT
@@ -107335,7 +107623,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -107592,7 +107880,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaU
@@ -107656,7 +107944,7 @@ aye
aye
aaU
aWj
-bnS
+btw
buq
bwC
bAr
@@ -107849,7 +108137,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -108104,9 +108392,9 @@ aaa
aaa
aaa
aaU
-aar
+aaU
aTd
-aWj
+aaU
aaU
aaU
aaU
@@ -108363,7 +108651,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -108436,7 +108724,7 @@ bMS
bBv
bXM
bvB
-bWq
+bvM
acY
adz
bsz
@@ -108620,7 +108908,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -108877,7 +109165,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -108941,7 +109229,7 @@ aaa
aaa
aaU
aWj
-bnS
+btw
buq
bwZ
bBC
@@ -109013,7 +109301,7 @@ bme
bme
bme
bme
-bOn
+cnG
bme
bOo
aaa
@@ -109134,7 +109422,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -109272,7 +109560,7 @@ bOe
bOi
cnd
bOl
-bOp
+cnH
aaa
aaa
aaa
@@ -109391,7 +109679,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -109648,7 +109936,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aae
aaa
aaa
@@ -109786,7 +110074,7 @@ bme
bOh
cne
bOm
-bOp
+cnH
aaa
aaa
aaa
@@ -109905,7 +110193,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -110162,7 +110450,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -110242,7 +110530,7 @@ bsz
aej
agc
agT
-cJq
+bFg
apm
aqS
arP
@@ -110419,7 +110707,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -110480,7 +110768,7 @@ bpH
ang
coh
cfy
-clO
+bvb
aRu
aSv
aSy
@@ -110498,7 +110786,7 @@ cxa
bPr
sVC
aNH
-bbQ
+bEr
cJA
aqO
anE
@@ -110676,7 +110964,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -110755,7 +111043,7 @@ cxb
bsz
aej
agC
-aoJ
+bEK
cJB
apm
aqT
@@ -110933,7 +111221,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -111188,9 +111476,9 @@ aaa
aaa
aaa
aaU
-aav
+aaU
aTd
-aWj
+aaU
aaU
aaU
aaU
@@ -111328,7 +111616,7 @@ bme
bOi
bOj
bOl
-bOp
+cnH
cnE
aaa
aaa
@@ -111447,7 +111735,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -111704,7 +111992,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaU
@@ -111842,7 +112130,7 @@ bOe
bOh
cnc
bOm
-bOp
+cnH
aaa
aaa
aaa
@@ -111961,7 +112249,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -111982,7 +112270,7 @@ afm
apT
adS
bEu
-ahN
+aif
afa
aha
ahx
@@ -112097,7 +112385,7 @@ bme
bme
bme
bme
-bOn
+cnG
bme
bOo
aaa
@@ -112218,7 +112506,7 @@ aaa
aaa
aaa
aaU
-aWj
+aaa
aaa
aaa
aaa
@@ -112239,7 +112527,7 @@ aiV
anv
aec
axS
-ahN
+aif
afK
ahb
ahx
@@ -112288,7 +112576,7 @@ bxP
arE
aMI
cgX
-chC
+bim
cik
bwW
bsT
@@ -112475,7 +112763,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -112496,7 +112784,7 @@ aja
aoM
aec
agi
-ahN
+aif
afK
ahc
ahx
@@ -112730,9 +113018,9 @@ aaa
aaa
aaa
aaU
-aav
aaU
-aWj
+aaU
+aaU
aaU
aaU
aaU
@@ -112753,7 +113041,7 @@ bEp
bEp
bEp
bEp
-ahN
+aif
afK
ahd
ahx
@@ -112798,8 +113086,8 @@ arE
att
cqr
arE
-byt
-bzo
+byv
+bAN
aMI
cgZ
cif
@@ -112987,9 +113275,9 @@ aaa
aaa
aaa
abp
-aav
+aaa
aTd
-aWj
+aaa
abp
aaa
aaa
@@ -113007,10 +113295,10 @@ abe
aeP
agX
ajS
-aHj
+akg
bvm
ahP
-ahN
+aif
afK
afK
ahT
@@ -113055,7 +113343,7 @@ att
btP
bwo
arE
-byu
+bAd
arE
aMI
cha
@@ -113244,19 +113532,19 @@ aaa
aaa
aaa
aaU
-aav
aaU
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
-aWj
+aaU
+aaU
+aaU
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaU
aaV
aaU
aaU
@@ -113265,9 +113553,9 @@ aaV
ahP
ahP
ahP
-bzp
+akj
ahP
-ahN
+aif
aiB
afK
ahU
@@ -113306,13 +113594,13 @@ aYF
beQ
bjw
bwu
-bAd
-aMo
-aMG
-bVt
+bnl
bwp
-bvb
-byv
+bwM
+bxq
+byt
+byu
+bAz
ceQ
cgT
chc
@@ -113503,7 +113791,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -113524,7 +113812,7 @@ akn
aJR
bEg
ahP
-aif
+aoJ
ass
afK
afK
@@ -113760,7 +114048,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -114017,7 +114305,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -114274,7 +114562,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -114531,7 +114819,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -114788,7 +115076,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -115045,7 +115333,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -115302,7 +115590,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -115559,7 +115847,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -115638,10 +115926,10 @@ bra
bwW
bwW
aaU
-bdR
-cJr
-bTJ
-aaa
+anr
+aWj
+bUj
+bVD
aaa
cPz
aaa
@@ -115816,7 +116104,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -115895,8 +116183,8 @@ brr
bCr
cwv
bAQ
-bAQ
-cJs
+bxt
+bzp
bUV
caf
bam
@@ -115906,7 +116194,7 @@ bYl
bam
bam
bam
-bam
+cJg
bbX
bbX
bcn
@@ -116073,7 +116361,7 @@ aaa
aaU
aaa
aaU
-aWj
+aaa
aaU
aaa
aaa
@@ -116152,8 +116440,8 @@ brP
brX
bsh
bsu
-bsx
-cJt
+bxK
+bDb
sVC
cdp
sVC
@@ -116163,8 +116451,8 @@ bZp
sVC
sVC
sVC
-frb
-bvM
+cJq
+cRt
bvW
bvX
bwd
@@ -116330,7 +116618,7 @@ aaa
aaU
aaa
ahv
-aWj
+aaa
aaU
aaa
aaa
@@ -116410,7 +116698,7 @@ bsi
bsv
bsy
bsy
-bsD
+bTJ
bsI
bRv
bsD
@@ -116419,8 +116707,8 @@ bsD
cPE
cPF
cPF
-cPF
-cPG
+cnQ
+cJs
bBL
bBL
bCm
@@ -116585,7 +116873,7 @@ aaa
aaa
aaa
aaU
-aav
+cnM
abM
acj
aaU
@@ -117958,9 +118246,9 @@ bJv
aaU
cwJ
aaU
-cbG
-aaU
-aaU
+bWJ
+mIT
+cJr
aaU
bbT
bbT
@@ -118214,10 +118502,10 @@ bPA
wPS
aaa
cwI
-aaa
+cwA
cbI
-mIT
-cJr
+cwA
+anr
aaa
aaU
aaU
@@ -118471,9 +118759,9 @@ bgM
cwA
cwA
cwL
-cww
+cwA
cbL
-cww
+cwA
bdR
mIT
mIT
@@ -118487,7 +118775,7 @@ bgk
bbT
bkd
bbT
-cea
+cpm
bVG
cgn
cje
@@ -119537,13 +119825,13 @@ cjb
cxV
cyb
cyc
-cyd
-bFg
-bHR
-bHR
-bHR
-bJU
-bHR
+bVt
+bZo
+bZs
+bZs
+bZs
+ciA
+clO
bHR
bLb
boK
@@ -119693,7 +119981,7 @@ aaa
aaa
aaa
arM
-atn
+atl
arM
aaU
aaU
@@ -119949,9 +120237,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+arM
+akz
+arM
aaU
aaU
aaU
@@ -120207,9 +120495,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+aWj
+aaU
+aaU
aaa
aaa
aaU
@@ -125155,11 +125443,11 @@ aWj
cww
cJm
cww
-aaU
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
aaU
aaU
aaa
@@ -125410,9 +125698,9 @@ bal
aaU
aWj
cww
-cJn
+cJm
cww
-aaU
+aWj
bal
bal
bal
@@ -125666,10 +125954,10 @@ aaa
aaa
aaU
aWj
+bFY
+cJn
+cww
aWj
-aWj
-aaa
-aaa
aaa
aaa
aaa
@@ -125922,11 +126210,11 @@ aaa
aaa
aaa
aaU
-aaa
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
bal
bal
bal
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 1b7b9c7414..53ca9a72b0 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -1464,19 +1464,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "External Solar Access";
- req_access_txt = "10; 13"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/maintenance/solars/starboard/fore)
"acQ" = (
@@ -17256,19 +17244,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Solar Access";
- req_one_access_txt = "13; 24; 10"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/maintenance/solars/port/fore)
"aIk" = (
@@ -25107,14 +25083,8 @@
/turf/open/floor/plasteel/dark,
/area/security/execution/education)
"aUK" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Security External Airlock";
- req_access_txt = "63"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
},
/turf/open/floor/plating,
/area/security/prison)
@@ -43327,21 +43297,16 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"bzd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/closet/emcloset/anchored,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
+/obj/structure/lattice,
+/turf/closed/wall,
+/area/construction/mining/aux_base)
"bze" = (
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bzf" = (
-/obj/machinery/light/small{
- dir = 4
- },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/emcloset/anchored,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
@@ -44447,122 +44412,83 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bAI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bAJ" = (
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/engine/gravity_generator)
-"bAK" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/status_display/evac{
- pixel_y = 32
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bAL" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/engine/gravity_generator";
- dir = 1;
- name = "Gravity Generator APC";
- pixel_y = 24
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bAM" = (
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/item/radio/intercom{
- name = "Station Intercom";
- pixel_y = 26
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 10
- },
-/obj/structure/cable/white{
- icon_state = "0-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bAN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/obj/structure/sign/nanotrasen{
- pixel_y = 32
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = 26
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
+/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bAO" = (
-/turf/closed/wall,
-/area/engine/gravity_generator)
-"bAP" = (
-/obj/machinery/door/firedoor,
+/area/construction/mining/aux_base)
+"bAJ" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/construction/mining/aux_base)
+"bAK" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+ dir = 8
},
/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
+ name = "External Solar Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/solars/starboard/fore)
+"bAL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/space,
+/area/solar/port/fore)
+"bAM" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Solar Access";
+ req_one_access_txt = "13; 24; 10"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/solars/port/fore)
+"bAN" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "Security External Airlock";
+ req_access_txt = "63"
},
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/turf/open/floor/plating,
+/area/security/prison)
+"bAO" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bAP" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bAQ" = (
@@ -45609,7 +45535,7 @@
},
/turf/open/floor/circuit/green,
/area/ai_monitored/turret_protected/ai)
-"bCw" = (
+"bCx" = (
/obj/effect/turf_decal/bot_white/right,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -45623,37 +45549,9 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
-"bCx" = (
-/obj/effect/turf_decal/bot_white,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
-"bCy" = (
-/obj/effect/turf_decal/bot_white/left,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/gravity_generator)
"bCz" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -45668,26 +45566,91 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bCA" = (
-/obj/structure/cable/white,
/obj/structure/cable/white{
icon_state = "0-2"
},
/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/warning/electricshock{
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/engine/gravity_generator)
"bCB" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/status_display/evac{
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/obj/effect/turf_decal/stripes/line{
- dir = 8
+ dir = 9
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bCC" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/engine/gravity_generator";
+ dir = 1;
+ name = "Gravity Generator APC";
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-2"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bCD" = (
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/item/radio/intercom{
+ name = "Station Intercom";
+ pixel_y = 26
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/obj/structure/cable/white{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bCE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/power/smes{
+ charge = 5e+006
+ },
+/obj/structure/sign/nanotrasen{
+ pixel_y = 32
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 26
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bCF" = (
+/obj/effect/turf_decal/bot_white/left,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -45698,80 +45661,26 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bCD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bCE" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bCF" = (
-/obj/structure/sign/warning/radiation,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"bCG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm{
- pixel_y = 23
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "Engineering - Gravity Generator Foyer";
- dir = 4;
- name = "engineering camera"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bCH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/door/firedoor,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bCI" = (
-/obj/structure/closet/radiation,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/extinguisher_cabinet{
- pixel_x = 26
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/gravity_generator)
"bCJ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -45784,9 +45693,6 @@
icon_state = "0-4"
},
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/turf/open/floor/plating,
/area/engine/break_room)
"bCL" = (
@@ -45801,13 +45707,13 @@
/obj/structure/cable/white{
icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bCM" = (
@@ -47193,11 +47099,8 @@
/turf/open/floor/circuit/green,
/area/ai_monitored/turret_protected/ai)
"bEn" = (
-/obj/machinery/light{
- dir = 8
- },
-/obj/structure/sign/warning/radiation{
- pixel_x = -32
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -47212,112 +47115,124 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bEo" = (
-/turf/open/floor/circuit/green,
-/area/engine/gravity_generator)
-"bEp" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command/glass{
- name = "Gravity Generator Chamber";
- req_access_txt = "19; 61"
+/obj/effect/turf_decal/bot_white,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/structure/cable/white{
- icon_state = "1-4"
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bEq" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bEr" = (
-/obj/machinery/holopad,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bEs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/obj/structure/cable/white{
- icon_state = "1-4"
+ icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bEt" = (
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bEu" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/highsecurity{
- name = "Gravity Generator Room";
- req_access_txt = "19;23"
- },
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bEv" = (
-/obj/structure/cable/white{
- icon_state = "2-4"
- },
-/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bEw" = (
-/obj/machinery/holopad,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/structure/cable{
+ icon_state = "1-8"
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
-"bEx" = (
+"bEu" = (
+/obj/structure/sign/warning/radiation,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall/r_wall,
+/area/engine/gravity_generator)
+"bEv" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm{
+ pixel_y = 23
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/machinery/camera{
+ c_tag = "Engineering - Gravity Generator Foyer";
+ dir = 4;
+ name = "engineering camera"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bEw" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/delivery,
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bEx" = (
+/obj/structure/closet/radiation,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 26
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bEy" = (
@@ -47330,9 +47245,6 @@
req_access_txt = "10"
},
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/stripes/line{
dir = 8
},
@@ -47342,18 +47254,21 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bEz" = (
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/stripes/end{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bEA" = (
@@ -47363,27 +47278,26 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bEB" = (
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bEC" = (
@@ -47393,25 +47307,25 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bED" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/end{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bEE" = (
@@ -48446,22 +48360,15 @@
/turf/open/floor/plasteel/dark,
/area/aisat)
"bFW" = (
-/obj/machinery/gravity_generator/main/station,
-/obj/effect/turf_decal/bot_white,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/circuit/green,
/area/engine/gravity_generator)
"bFX" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/sign/warning/radiation{
+ pixel_x = -32
+ },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -48475,89 +48382,89 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"bFY" = (
-/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bFZ" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
+/obj/machinery/holopad,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/bot,
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bGa" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+/obj/structure/cable/white{
+ icon_state = "1-4"
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bGb" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/port_gen/pacman,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/bot,
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bGc" = (
-/obj/structure/sign/warning/radiation,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/turf/closed/wall/r_wall,
-/area/engine/gravity_generator)
-"bGd" = (
/obj/structure/cable/white{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/plasteel,
-/area/engine/gravity_generator)
-"bGe" = (
-/obj/machinery/status_display/evac{
- pixel_x = 32;
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
+ icon_state = "4-8"
},
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
-"bGf" = (
-/obj/structure/closet/radiation,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+"bGc" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/highsecurity{
+ name = "Gravity Generator Room";
+ req_access_txt = "19;23"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
-/obj/machinery/light/small,
/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bGd" = (
+/obj/structure/cable/white{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bGe" = (
+/obj/machinery/holopad,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
+"bGf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"bGg" = (
/obj/machinery/firealarm{
dir = 4;
@@ -48565,6 +48472,9 @@
},
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bGh" = (
@@ -48579,6 +48489,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark/corner,
/area/engine/break_room)
"bGi" = (
@@ -48586,15 +48499,16 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/turf/open/floor/plasteel/dark/corner,
/area/engine/break_room)
"bGj" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark/corner,
/area/engine/break_room)
"bGk" = (
@@ -49624,9 +49538,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"bHN" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 5
- },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -49641,68 +49553,50 @@
/area/engine/gravity_generator)
"bHO" = (
/obj/structure/cable/white,
+/obj/structure/cable/white{
+ icon_state = "0-2"
+ },
/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/electricshock{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/turf/open/floor/plating,
/area/engine/gravity_generator)
"bHP" = (
-/obj/machinery/light,
-/obj/machinery/status_display/evac{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/machinery/camera{
- c_tag = "Engineering - Gravity Generator";
- dir = 1;
- name = "engineering camera"
- },
+/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
- dir = 10
+ dir = 8
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bHQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm{
- dir = 1;
- pixel_y = -22
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
-/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bHR" = (
-/obj/machinery/newscaster{
- pixel_y = -32
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
},
/obj/effect/turf_decal/stripes/line{
- dir = 6
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bHS" = (
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/port_gen/pacman,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/machinery/light_switch{
- pixel_y = -26
- },
-/obj/structure/table/reinforced,
-/obj/item/stack/sheet/plasteel/twenty,
-/obj/item/wrench,
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
@@ -49710,27 +49604,23 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/door/poddoor/preopen{
- id = "transitlock";
- name = "Transit Tube Lockdown Door"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
- dir = 1
+ dir = 10
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"bHU" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/poddoor/preopen{
- id = "transitlock";
- name = "Transit Tube Lockdown Door"
+/obj/machinery/status_display/evac{
+ pixel_x = 32;
+ pixel_y = -32
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
@@ -51017,27 +50907,30 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Transit Tube Access";
- req_one_access_txt = "32;19"
+/obj/machinery/door/poddoor/preopen{
+ id = "transitlock";
+ name = "Transit Tube Lockdown Door"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/transit_tube)
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"bJP" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/door/poddoor/preopen{
+ id = "transitlock";
+ name = "Transit Tube Lockdown Door"
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/closed/wall/r_wall,
-/area/engine/transit_tube)
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"bJQ" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
@@ -52186,50 +52079,54 @@
/turf/closed/wall/r_wall,
/area/engine/transit_tube)
"bLG" = (
-/obj/structure/closet/emcloset/anchored,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/command/glass{
+ name = "Gravity Generator Chamber";
+ req_access_txt = "19; 61"
},
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/engine/transit_tube)
-"bLH" = (
-/obj/machinery/status_display/evac,
-/turf/closed/wall,
-/area/engine/transit_tube)
-"bLI" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/engine/transit_tube";
- dir = 1;
- name = "Transit Tube Access APC";
- pixel_y = 24
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
/obj/structure/cable/white{
- icon_state = "0-4"
+ icon_state = "1-4"
+ },
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
+"bLH" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/engine/break_room)
+"bLI" = (
+/obj/machinery/gravity_generator/main/station,
+/obj/effect/turf_decal/bot_white,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/engine/transit_tube)
+/area/engine/gravity_generator)
"bLJ" = (
/obj/structure/cable/white{
icon_state = "1-2"
},
+/obj/machinery/door/airlock/hatch{
+ name = "MiniSat Transit Tube Access";
+ req_one_access_txt = "32;19"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -52241,35 +52138,11 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/structure/cable/white{
- icon_state = "1-8"
- },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bLK" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/firealarm{
- dir = 8;
- pixel_x = 24
- },
-/obj/machinery/button/door{
- id = "transitlock";
- name = "Transit Tube Lockdown Control";
- pixel_y = 26;
- req_access_txt = "39; 19"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/turf/closed/wall/r_wall,
/area/engine/transit_tube)
"bLL" = (
/obj/item/kirbyplants/random,
@@ -53595,29 +53468,14 @@
/turf/open/space,
/area/space/nearstation)
"bNH" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/cable/white{
- icon_state = "2-4"
+/obj/structure/sign/warning/radiation,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
- },
-/turf/open/space,
-/area/space/nearstation)
+/turf/closed/wall/r_wall,
+/area/engine/gravity_generator)
"bNI" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Exterior Access";
- req_one_access_txt = "32;19"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
+/obj/structure/closet/emcloset/anchored,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -53631,12 +53489,6 @@
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bNJ" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -53647,39 +53499,21 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/closet/firecloset,
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bNK" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Exterior Access";
- req_one_access_txt = "32;19"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/obj/machinery/status_display/evac,
+/turf/closed/wall,
/area/engine/transit_tube)
"bNL" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/engine/transit_tube";
+ dir = 1;
+ name = "Transit Tube Access APC";
+ pixel_y = 24
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -53690,15 +53524,16 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "0-4"
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bNM" = (
/obj/structure/cable/white{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 9
+ icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -53709,11 +53544,22 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bNN" = (
-/obj/machinery/light/small{
- dir = 4
+/obj/item/kirbyplants/random,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/button/door{
+ id = "transitlock";
+ name = "Transit Tube Lockdown Control";
+ pixel_y = 26;
+ req_access_txt = "39; 19"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -54901,9 +54747,38 @@
/turf/open/space,
/area/space/nearstation)
"bPL" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
/obj/machinery/light/small,
-/obj/structure/sign/warning/vacuum{
- pixel_x = -32
+/turf/open/floor/plasteel/dark,
+/area/engine/transit_tube)
+"bPM" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/hatch{
+ name = "MiniSat Exterior Access";
+ req_one_access_txt = "32;19"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -54917,20 +54792,11 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
-"bPM" = (
-/turf/closed/wall,
-/area/engine/transit_tube)
"bPN" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/airalarm{
- dir = 4;
- pixel_x = -23
- },
-/obj/machinery/flasher{
- id = "AI";
- pixel_x = -26;
- pixel_y = -26
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -54944,6 +54810,9 @@
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bPO" = (
+/obj/structure/cable/white{
+ icon_state = "1-8"
+ },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -54954,15 +54823,16 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bPP" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/light_switch{
- pixel_x = 22;
- pixel_y = -10
+/obj/machinery/light/small{
+ dir = 4
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -56192,13 +56062,15 @@
/turf/open/space,
/area/space/nearstation)
"bRV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/engine/transit_tube)
-"bRW" = (
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Transit Tube Access";
- req_one_access_txt = "32;19"
+/obj/item/kirbyplants/random,
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/obj/machinery/flasher{
+ id = "AI";
+ pixel_x = -26;
+ pixel_y = -26
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -56212,10 +56084,38 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
+"bRW" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel/dark,
+/area/engine/transit_tube)
"bRX" = (
-/obj/effect/spawner/structure/window/reinforced,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
+/obj/machinery/light_switch{
+ pixel_x = 22;
+ pixel_y = -10
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bRY" = (
/obj/machinery/keycard_auth{
@@ -57376,22 +57276,9 @@
/turf/open/space,
/area/space/nearstation)
"bTL" = (
-/obj/structure/window/reinforced{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
},
-/obj/structure/table/reinforced,
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "AI Satellite - Transit Tube";
- name = "ai camera";
- network = list("minisat");
- start_active = 1
- },
-/obj/item/clipboard,
-/obj/item/folder/blue,
-/obj/item/pen,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -57403,30 +57290,16 @@
dir = 8
},
/turf/open/floor/plasteel/dark,
-/area/engine/transit_tube)
+/area/engine/gravity_generator)
"bTM" = (
-/obj/structure/chair/office/dark{
- dir = 8
- },
-/obj/machinery/flasher{
- id = "AI";
- pixel_x = -26;
- pixel_y = 26
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
/area/engine/transit_tube)
"bTN" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/door/airlock/hatch{
+ name = "MiniSat Transit Tube Access";
+ req_one_access_txt = "32;19"
+ },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -57437,22 +57310,13 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bTO" = (
-/obj/item/kirbyplants/random,
+/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/engine/transit_tube)
"bTP" = (
/obj/machinery/computer/station_alert{
@@ -59145,9 +59009,6 @@
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bWc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -59158,10 +59019,15 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1
+ },
+/obj/structure/chair/office/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bWd" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -59172,6 +59038,12 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bWe" = (
@@ -60847,6 +60719,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/engine/transit_tube)
"bYp" = (
@@ -72264,7 +72139,7 @@
pixel_y = 32
},
/turf/open/space,
-/area/space/nearstation)
+/area/space)
"crE" = (
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
@@ -83035,22 +82910,16 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"cJI" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/structure/cable/white,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/sign/warning/electricshock{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/maintenance/port)
+/turf/open/floor/plating,
+/area/engine/gravity_generator)
"cJJ" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -108364,19 +108233,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "External Solar Access";
- req_access_txt = "10; 13"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/maintenance/solars/starboard/aft)
"dBN" = (
@@ -115581,6 +115438,10 @@
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"dOc" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/maintenance/port/aft)
+"dOd" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
@@ -115597,11 +115458,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
-"dOd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/maintenance/port/aft)
"dOe" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -115610,6 +115466,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel{
heat_capacity = 1e+006
},
@@ -122648,19 +122505,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "External Solar Access";
- req_access_txt = "10; 13"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/maintenance/solars/port/aft)
"ebE" = (
@@ -124004,14 +123849,16 @@
/turf/open/floor/plasteel/grimy,
/area/chapel/office)
"edX" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_access_txt = "12"
- },
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"edY" = (
@@ -124731,16 +124578,6 @@
/turf/open/floor/carpet,
/area/chapel/office)
"eft" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"efu" = (
@@ -125581,6 +125418,24 @@
/obj/machinery/chem_dispenser/apothecary,
/turf/open/floor/plasteel/dark,
/area/medical/medbay/central)
+"eMb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/item/flashlight,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel{
+ heat_capacity = 1e+006
+ },
+/area/maintenance/port)
"eMD" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -125733,6 +125588,9 @@
},
/turf/closed/wall/r_wall,
/area/maintenance/disposal/incinerator)
+"fMf" = (
+/turf/closed/wall,
+/area/engine/transit_tube)
"fRK" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -126016,6 +125874,24 @@
/obj/item/reagent_containers/glass/beaker,
/turf/open/floor/plating,
/area/crew_quarters/abandoned_gambling_den)
+"ikq" = (
+/obj/machinery/light,
+/obj/machinery/status_display/evac{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Engineering - Gravity Generator";
+ dir = 1;
+ name = "engineering camera"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"imI" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -126143,6 +126019,25 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
+"iUc" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Solar Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/solars/port/aft)
"jdx" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -126344,6 +126239,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/science/mixing)
+"jUu" = (
+/turf/closed/wall/r_wall,
+/area/space/nearstation)
"jYx" = (
/obj/effect/turf_decal/bot,
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
@@ -126736,6 +126634,20 @@
},
/turf/open/floor/plasteel/dark,
/area/science/mixing)
+"mte" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/light_switch{
+ pixel_y = -26
+ },
+/obj/structure/table/reinforced,
+/obj/item/stack/sheet/plasteel/twenty,
+/obj/item/wrench,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"mvm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable/white{
@@ -126877,6 +126789,18 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
+"nYv" = (
+/obj/machinery/newscaster{
+ pixel_y = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"odz" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
@@ -127171,6 +127095,25 @@
dir = 9
},
/area/science/circuit)
+"qhB" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/transit_tube)
"qnx" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input,
/turf/open/floor/engine/vacuum,
@@ -127408,6 +127351,25 @@
},
/turf/open/floor/plasteel/grimy,
/area/library)
+"tML" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Solar Access";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/solars/starboard/aft)
"tNT" = (
/obj/effect/landmark/carpspawn,
/turf/open/space,
@@ -127653,6 +127615,32 @@
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
+"vFT" = (
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/hatch{
+ name = "MiniSat Exterior Access";
+ req_one_access_txt = "32;19"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/engine/transit_tube)
"vHN" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -127688,6 +127676,18 @@
},
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
+"vYo" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel,
+/area/engine/gravity_generator)
"wei" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
@@ -127750,6 +127750,16 @@
/obj/effect/turf_decal/tile/purple,
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"wFK" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable/white{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/space,
+/area/space/nearstation)
"wZT" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -127972,6 +127982,23 @@
},
/turf/open/floor/plating,
/area/engine/atmos)
+"yja" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/port)
"yjc" = (
/obj/machinery/power/apc{
areastring = "/area/science/research/abandoned";
@@ -145314,12 +145341,12 @@ aaa
aaa
aaa
aaa
+aaa
ajr
ajr
aad
ajr
ajr
-ajr
aad
ajr
ajr
@@ -145571,11 +145598,11 @@ aaa
aaa
aaa
aaa
+aaa
ajr
aaa
aaa
aad
-aaa
aad
aaa
aad
@@ -145828,11 +145855,11 @@ aaa
aaa
aaa
aaa
+aaa
ajr
aad
ajr
ajr
-aad
ajr
ajr
ajr
@@ -146085,6 +146112,7 @@ aaa
aaa
aaa
aaa
+aaa
ajr
aaa
ajr
@@ -146096,7 +146124,6 @@ aad
aad
aad
aad
-aad
ajr
aaa
bNF
@@ -146342,6 +146369,7 @@ aaa
aaa
aaa
aaa
+aaa
aad
aaa
ajr
@@ -146352,12 +146380,11 @@ bxC
bxC
bxC
bxC
-bxC
-aad
+jUu
aad
aad
bNF
-aad
+qgU
bVZ
aad
aad
@@ -146599,20 +146626,20 @@ aaa
aaa
aaa
aaa
-ajr
-aad
-ajr
-aad
-bxC
-bAH
-bAH
-bEn
-bAH
-bAH
-bxC
-aad
-ajr
aaa
+ajr
+aad
+ajr
+aad
+bxC
+bAH
+bAH
+bFX
+bAH
+bAH
+jUu
+aad
+ajr
bNF
aaa
bVZ
@@ -146856,20 +146883,20 @@ aaa
aaa
aaa
aaa
+aaa
ajr
aaa
aad
aad
bxC
bAH
-bCw
bCx
-bCy
+bEo
+bCF
bAH
-bxC
+jUu
aad
ajr
-aaa
bNF
aaa
bVZ
@@ -146896,8 +146923,8 @@ cdB
cdB
cdB
car
-aad
-abj
+caE
+yja
caE
caE
cOj
@@ -147090,7 +147117,7 @@ aAP
aAP
avY
ask
-ask
+bAL
aad
abj
abj
@@ -147113,22 +147140,22 @@ aaa
aaa
aaa
aaa
+aaa
ajr
aad
ajr
aad
bxC
bAH
-bCx
bEo
bFW
+bLI
bAH
-bxC
-aad
+jUu
aad
aad
bNF
-aad
+qgU
bVY
aad
aad
@@ -147153,8 +147180,8 @@ car
car
car
car
-caE
-cJI
+eMb
+cqI
caE
cme
cOk
@@ -147346,9 +147373,9 @@ aad
aad
aad
aad
-aad
-apK
-aad
+aFp
+bAM
+aFp
aLb
aad
aaa
@@ -147370,20 +147397,20 @@ aaa
aaa
aaa
aaa
+aaa
aad
aaa
ajr
aad
bxC
bAH
-bCy
+bCF
+bEo
bCx
-bCw
bAH
-bxC
+jUu
aad
ajr
-aaa
bNF
aaa
bVZ
@@ -147628,19 +147655,19 @@ ajr
ajr
aad
ajr
+ajr
aad
ajr
aad
bxC
-bAI
bCz
+bEn
bAH
-bFX
bHN
-bxC
+bTL
+jUu
aad
aad
-aaa
bNF
aaa
bVZ
@@ -147888,18 +147915,18 @@ aad
aaa
aaa
aad
+aad
bxC
-bAJ
-bCA
-bEp
bCA
bHO
-bxC
+bLG
+bHO
+cJI
+jUu
aad
-bNH
-bPK
+wFK
bRU
-aad
+qgU
bVZ
aad
car
@@ -148145,18 +148172,18 @@ ajr
ajr
aad
aad
+aad
bxC
-bAK
bCB
bEq
bFY
bHP
-bxC
-aad
-bNF
-aad
-aad
-aad
+ikq
+bLF
+bLF
+vFT
+bLF
+qgU
bVZ
aad
car
@@ -148402,18 +148429,18 @@ aad
aad
aad
aad
+aad
bxC
-bAL
bCC
bEr
bFZ
bHQ
-bxC
+vYo
bLF
bNI
+qhB
bLF
-bLF
-aad
+qgU
bVZ
aad
car
@@ -148659,18 +148686,18 @@ aRF
aRF
aad
aad
+aad
bxC
-bAM
bCD
bEs
bGa
bHR
-bxC
-bLG
+nYv
+bLF
bNJ
bPL
bLF
-bTK
+qgU
bWa
bTK
car
@@ -148916,18 +148943,18 @@ bpO
aRF
aad
aad
+aad
bxC
-bAN
bCE
bEt
bGb
bHS
-bxC
-bLH
+mte
+bLF
bNK
bPM
+fMf
bLF
-bTL
bWb
bYn
car
@@ -149172,15 +149199,15 @@ bpO
btK
aRF
aad
+qgU
+qgU
bxC
bxC
-bxC
-bCF
bEu
bGc
+bNH
bxC
-bxC
-bLI
+bLF
bNL
bPN
bRV
@@ -149430,9 +149457,9 @@ btL
aRF
abj
bxC
-bzd
-bAO
-bCG
+bxC
+bxC
+bCI
bEv
bGd
bHT
@@ -150203,9 +150230,9 @@ aMG
bxE
bzg
bzg
-bCJ
-bEy
bzg
+bEy
+bLH
bHV
bJQ
bLL
@@ -154660,7 +154687,7 @@ aaa
aad
aad
aad
-ajr
+qgU
aad
ebC
aad
@@ -154918,9 +154945,9 @@ ajr
aad
aad
aad
-aad
-ebC
-aad
+eak
+iUc
+eak
aad
aaa
aac
@@ -169915,8 +169942,8 @@ aaa
aaa
aaa
aad
-aad
abi
+bAI
abR
abi
acp
@@ -170172,9 +170199,9 @@ aaa
aaa
aaa
abj
-abj
abH
abS
+abS
acd
acq
acH
@@ -170428,9 +170455,9 @@ aaa
aaa
aaa
aaa
-aaa
-aad
+qgU
abi
+bAJ
abT
abi
acr
@@ -170684,9 +170711,9 @@ aaa
aaa
aaa
aaa
-aaa
-aac
+jdx
aad
+bzd
abi
abi
ace
@@ -170941,8 +170968,8 @@ aaa
aaa
aaa
aaa
-aaa
-aac
+jdx
+aad
aad
aad
aad
@@ -171198,7 +171225,7 @@ aaa
aaa
aaa
aaa
-aaa
+aac
aac
aac
aad
@@ -172489,9 +172516,9 @@ aac
aaa
aad
aad
-aad
-acQ
-aad
+acf
+bAK
+acf
aad
aaa
abi
@@ -172745,7 +172772,7 @@ aaa
aac
aac
aad
-aac
+aad
aad
aaj
aad
@@ -182646,9 +182673,9 @@ aaA
aaa
aaa
aad
-aaa
-dBN
-aad
+dyV
+tML
+dyV
aad
aaa
aad
@@ -182902,9 +182929,9 @@ aci
aaA
aaa
aaa
-ajr
-aad
-dBO
+qgU
+qgU
+dBN
aad
aaa
dFy
@@ -184873,7 +184900,7 @@ aaa
ajr
ajr
ajr
-aaa
+qgU
aKZ
aKZ
aKZ
@@ -185130,9 +185157,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+qgU
abj
+bAN
aUK
aWs
aXT
@@ -185388,11 +185415,11 @@ aaa
aaa
aaa
aaa
-aaa
aad
aKV
aKV
aKV
+aKV
aZK
bbt
aNJ
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index e848fd87d1..518fa4e81e 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -2134,14 +2134,11 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/port)
"adM" = (
-/obj/machinery/door/airlock/external{
- name = "Abandoned External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
/area/maintenance/fore)
"adN" = (
/obj/effect/turf_decal/loading_area{
@@ -2160,11 +2157,16 @@
/turf/open/floor/engine,
/area/ai_monitored/storage/satellite)
"adO" = (
+/obj/machinery/door/airlock/external{
+ name = "Satellite External Airlock";
+ req_one_access_txt = "32;19"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/engine,
+/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/atmos)
"adP" = (
/obj/machinery/status_display/ai,
@@ -2513,6 +2515,9 @@
/turf/open/floor/plating,
/area/security/execution/education)
"aeD" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -2598,13 +2603,20 @@
},
/obj/machinery/light/small,
/turf/open/floor/plating/airless,
-/area/maintenance/starboard/fore)
+/area/space/nearstation)
"aeL" = (
+/obj/machinery/door/airlock/external{
+ name = "Abandoned External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable{
- icon_state = "2-8"
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
},
/obj/structure/disposalpipe/segment,
-/turf/open/floor/plating/airless,
+/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"aeM" = (
/obj/machinery/photocopier,
@@ -5704,13 +5716,6 @@
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"ajI" = (
-/obj/machinery/door/airlock/external{
- name = "Abandoned External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -6935,7 +6940,6 @@
dir = 4
},
/obj/structure/closet/emcloset/anchored,
-/obj/effect/decal/cleanable/cobweb,
/obj/machinery/light/small{
dir = 8
},
@@ -9658,12 +9662,19 @@
/turf/open/floor/plasteel/showroomfloor,
/area/medical/genetics)
"aqp" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless,
-/area/solar/port/fore)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/solars/port/fore)
"aqq" = (
/obj/machinery/status_display/ai{
pixel_x = -32
@@ -12462,12 +12473,18 @@
/turf/open/floor/plasteel,
/area/bridge)
"auN" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless,
-/area/solar/starboard/fore)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/fore)
"auO" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable{
@@ -64779,11 +64796,15 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
"bZG" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
+/obj/machinery/door/airlock/external{
+ name = "Abandoned External Airlock"
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/fore)
"bZH" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -64902,9 +64923,18 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"bZP" = (
-/obj/structure/cable,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ name = "Prison External Airlock";
+ req_access_txt = "2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/security/prison)
"bZQ" = (
/obj/structure/closet/l3closet/janitor,
/obj/structure/window/reinforced,
@@ -67690,11 +67720,6 @@
},
/area/ai_monitored/turret_protected/ai)
"ceA" = (
-/obj/machinery/door/airlock/external{
- name = "Satellite External Airlock";
- req_one_access_txt = "32;19"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
icon_state = "1-2"
@@ -69610,15 +69635,12 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"chO" = (
-/obj/structure/sign/warning/vacuum/external,
-/turf/closed/wall,
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/atmos)
"chP" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/turf_decal/delivery,
-/obj/machinery/light,
-/turf/open/floor/plasteel/dark,
+/obj/structure/sign/warning/vacuum/external,
+/turf/closed/wall,
/area/ai_monitored/turret_protected/aisat/atmos)
"chQ" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -69697,12 +69719,19 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"chU" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless,
-/area/solar/port/aft)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/solars/port/aft)
"chW" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/hatch{
@@ -71343,16 +71372,9 @@
/turf/open/floor/plating,
/area/engine/engineering)
"ckJ" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
"ckK" = (
@@ -71763,16 +71785,9 @@
/turf/open/space/basic,
/area/space/nearstation)
"clx" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
@@ -74873,6 +74888,9 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plating{
icon_state = "platingdmg1"
},
@@ -74942,6 +74960,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal)
"crg" = (
@@ -76410,14 +76431,12 @@
/turf/open/floor/plating/airless,
/area/solar/starboard/aft)
"ctO" = (
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
/area/maintenance/disposal)
"ctP" = (
/obj/structure/cable{
@@ -76438,16 +76457,9 @@
/turf/open/floor/plating/airless,
/area/solar/starboard/aft)
"ctS" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
@@ -77673,12 +77685,18 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"cwb" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/floor/plating/airless,
-/area/solar/starboard/aft)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/aft)
"cwc" = (
/obj/machinery/atmospherics/components/binary/pump/on,
/obj/machinery/airlock_sensor/incinerator_atmos{
@@ -77774,9 +77792,9 @@
/area/maintenance/starboard/aft)
"cwk" = (
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "2-8"
},
-/turf/open/floor/plating/asteroid/airless,
+/turf/open/floor/plating/airless,
/area/space/nearstation)
"cwl" = (
/obj/structure/cable{
@@ -77954,13 +77972,6 @@
/turf/open/floor/plating,
/area/maintenance/starboard)
"cwD" = (
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard)
"cwE" = (
@@ -78131,6 +78142,9 @@
icon_state = "1-8"
},
/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/maintenance/disposal)
"cwQ" = (
@@ -78244,6 +78258,9 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -78301,6 +78318,9 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
/turf/open/floor/plating,
/area/maintenance/disposal)
"cxh" = (
@@ -78340,6 +78360,9 @@
/area/maintenance/disposal)
"cxj" = (
/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -78387,17 +78410,21 @@
},
/area/maintenance/port/fore)
"cxp" = (
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/disposal)
"cxq" = (
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/area/maintenance/fore)
"cxr" = (
/obj/structure/sign/poster/contraband/clown,
/turf/closed/wall/rust,
@@ -83810,16 +83837,9 @@
},
/area/maintenance/starboard)
"cMH" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"cMI" = (
@@ -84487,13 +84507,6 @@
/turf/open/space/basic,
/area/space/nearstation)
"cUD" = (
-/obj/machinery/door/airlock/external{
- name = "Prison External Airlock";
- req_access_txt = "2"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -84511,6 +84524,10 @@
icon_state = "wood-broken"
},
/area/security/vacantoffice)
+"dky" = (
+/obj/structure/cable,
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"dlg" = (
/obj/machinery/light,
/turf/open/floor/wood,
@@ -84662,6 +84679,12 @@
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/closed/mineral/random/labormineral,
/area/space/nearstation)
+"fAn" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = 32
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"fXq" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -85114,6 +85137,16 @@
/obj/structure/sign/poster/ripped,
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
+"lqz" = (
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/maintenance/starboard)
"lKu" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko,
@@ -85171,6 +85204,9 @@
},
/turf/open/floor/plasteel/dark,
/area/science/research)
+"mKj" = (
+/turf/closed/wall/rust,
+/area/security/execution/education)
"mKp" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -85537,6 +85573,12 @@
icon_state = "wood-broken4"
},
/area/maintenance/port/fore)
+"yaV" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/airless,
+/area/space/nearstation)
"ydo" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -99350,9 +99392,9 @@ bTK
bVs
hNk
bXG
+abp
cZm
-bZG
-aeU
+fAn
aeU
aeU
aeU
@@ -99609,7 +99651,7 @@ cTF
bXH
cUD
bZP
-aeU
+dky
coy
aeU
aeU
@@ -99862,19 +99904,19 @@ aaG
aez
cIj
aeB
-cZm
+mKj
+aez
aez
aez
cko
cko
-cko
-aeU
aeU
aeU
aeU
aeU
+cnS
chU
-aeU
+cnS
aUz
aeU
aeu
@@ -100317,9 +100359,9 @@ aeu
aeU
aeU
aeU
-aeU
+ctH
aqp
-aeU
+ctH
aeu
aeu
aeu
@@ -112391,7 +112433,7 @@ aaa
aaa
aeU
aUz
-aeu
+adH
adH
adH
adH
@@ -112648,8 +112690,8 @@ aaa
aaa
acm
aeU
-aeU
adQ
+cxq
alN
chj
aoc
@@ -112905,7 +112947,7 @@ aeR
aeR
aes
aes
-aes
+bZG
adM
alO
amL
@@ -113162,7 +113204,7 @@ aaa
aaa
acm
aaa
-aaa
+adH
adH
adH
adQ
@@ -120603,9 +120645,9 @@ aaa
aaa
aaa
aaa
-aeU
aeK
baH
+baH
afb
baH
baH
@@ -124312,9 +124354,9 @@ cpb
crf
cnu
cnu
+cnu
cko
aeu
-aeu
aaa
aaa
aaa
@@ -124570,7 +124612,7 @@ cxg
cxj
ctO
cxp
-aeU
+yaV
ciQ
aeU
aaa
@@ -124826,7 +124868,7 @@ cnu
cnd
cnu
cnu
-cxq
+cnu
cwk
cxu
aeU
@@ -126360,9 +126402,9 @@ bzG
bzG
aeu
aeu
-aeU
+ckz
cwb
-aeU
+ckz
aeU
aUz
aeU
@@ -129382,9 +129424,9 @@ aaQ
aeo
aeo
acm
-acm
-acK
-acm
+bkd
+lqz
+bkd
aaa
aaa
aaa
@@ -129617,9 +129659,9 @@ aeu
aeu
aeu
aeu
-aeU
+cLM
auN
-aeU
+cLM
aeu
aeu
aeu
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 16659f3e7a..fdc313c30a 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -793,10 +793,16 @@
/turf/open/floor/plating,
/area/security/prison)
"abN" = (
-/turf/open/floor/plating{
- icon_state = "platingdmg3"
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
},
-/area/security/prison)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating,
+/area/maintenance/solars/port/fore)
"abO" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -954,6 +960,9 @@
/area/security/prison)
"acg" = (
/obj/machinery/light/small,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -962,18 +971,22 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/turf/open/floor/plating,
-/area/security/prison)
-"aci" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
req_access_txt = "1"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/turf/open/floor/plating,
/area/security/prison)
+"aci" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/door/airlock/external{
+ req_one_access_txt = "13,8"
+ },
+/turf/open/space,
+/area/maintenance/starboard/fore)
"acj" = (
/obj/machinery/light/small{
dir = 1
@@ -2047,14 +2060,12 @@
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"aef" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"aeg" = (
@@ -2310,9 +2321,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"aeH" = (
@@ -7006,15 +7014,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
-"amG" = (
-/obj/machinery/light/small{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
"amH" = (
/obj/machinery/door/airlock/external{
req_one_access_txt = "13,8"
@@ -11553,19 +11552,15 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"avJ" = (
-/obj/machinery/door/airlock/external,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
},
/turf/open/floor/plating,
-/area/maintenance/port/fore)
+/area/maintenance/starboard/fore)
"avK" = (
/obj/structure/sign/warning/vacuum/external{
pixel_y = 32
},
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
/turf/open/floor/plating,
/area/maintenance/port/fore)
"avL" = (
@@ -37959,12 +37954,8 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"bwl" = (
-/obj/machinery/door/airlock/hatch{
- name = "MiniSat Space Access Airlock";
- req_one_access_txt = "32;19"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plasteel/dark,
/area/engine/break_room)
@@ -38524,9 +38515,6 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plasteel/dark,
/area/engine/break_room)
"bxn" = (
@@ -44779,7 +44767,7 @@
dir = 8
},
/turf/open/space,
-/area/aisat)
+/area/space/nearstation)
"bKR" = (
/obj/structure/window/reinforced{
dir = 8
@@ -46796,11 +46784,11 @@
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
"bOY" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 1
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
@@ -53609,9 +53597,6 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plating,
/area/engine/atmos)
"ccY" = (
@@ -54894,17 +54879,12 @@
/turf/open/space,
/area/solar/port/aft)
"cfA" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
+/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/turf/open/floor/plating,
-/area/maintenance/port/aft)
+/area/maintenance/port/fore)
"cfB" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable/yellow{
@@ -63173,12 +63153,9 @@
/turf/open/space,
/area/solar/port/aft)
"cvj" = (
-/obj/structure/closet/emcloset,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
+/obj/structure/lattice,
+/turf/closed/wall/r_wall,
+/area/engine/break_room)
"cvk" = (
/obj/structure/closet/crate,
/obj/item/crowbar/red,
@@ -63664,7 +63641,10 @@
/turf/open/floor/plasteel,
/area/science/circuit)
"cwc" = (
-/obj/effect/turf_decal/stripes/line,
+/obj/machinery/door/airlock/external{
+ name = "Auxiliary Escape Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/aft)
"cwd" = (
@@ -63693,9 +63673,14 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"cwh" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -70269,7 +70254,7 @@
pixel_x = -32
},
/turf/open/space,
-/area/space/nearstation)
+/area/space)
"cIz" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -70553,18 +70538,20 @@
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"cJf" = (
/obj/structure/cable/yellow{
- icon_state = "0-8"
+ icon_state = "4-8"
},
-/obj/structure/lattice/catwalk,
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"cJg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/item/bedsheet/medical,
@@ -71813,6 +71800,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
/area/maintenance/aft)
"cLA" = (
@@ -72157,15 +72145,12 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"cMk" = (
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/maintenance/aft";
- name = "Aft Maintenance APC";
- pixel_y = -24
+/obj/structure/window/reinforced{
+ dir = 1;
+ pixel_y = 1
},
-/obj/structure/cable/yellow,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/maintenance/aft)
+/turf/open/space,
+/area/space)
"cMl" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty{
@@ -72750,10 +72735,6 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"cNe" = (
-/obj/machinery/door/airlock/external{
- name = "Auxiliary Escape Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/aft)
"cNf" = (
@@ -76631,9 +76612,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
"dbR" = (
@@ -81171,10 +81149,6 @@
/obj/machinery/vr_sleeper,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
-"evy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/space)
"eEe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -81313,6 +81287,19 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
+"gsT" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/solar/starboard/aft)
"gEk" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -81350,9 +81337,7 @@
/turf/open/floor/plasteel,
/area/science/misc_lab)
"gNe" = (
-/obj/machinery/light/small{
- dir = 8
- },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/aft)
"gRS" = (
@@ -81526,13 +81511,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
"jAj" = (
@@ -81656,17 +81634,15 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"kDM" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
+/obj/machinery/door/airlock/hatch{
+ name = "MiniSat Space Access Airlock";
+ req_one_access_txt = "32;19"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
+/turf/open/floor/plasteel/dark,
+/area/engine/break_room)
"kJW" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 1;
@@ -81775,14 +81751,9 @@
/turf/open/space/basic,
/area/space/nearstation)
"lNZ" = (
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/fore)
+/obj/structure/lattice/catwalk,
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"lOi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -81902,6 +81873,12 @@
},
/turf/open/floor/plating,
/area/maintenance/port)
+"mSd" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"mWg" = (
/obj/structure/girder,
/obj/structure/grille,
@@ -82477,8 +82454,9 @@
/turf/open/floor/plasteel,
/area/science/circuit)
"sdw" = (
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/window/reinforced,
+/turf/open/space,
+/area/space)
"siF" = (
/obj/structure/grille,
/turf/open/floor/plating/airless,
@@ -82576,6 +82554,12 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
+"sUM" = (
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
"sZN" = (
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
@@ -82662,6 +82646,13 @@
/obj/machinery/cryopod,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
+"uim" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/structure/lattice/catwalk,
+/turf/open/space,
+/area/space/nearstation)
"uku" = (
/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
/turf/open/floor/plasteel,
@@ -82853,12 +82844,8 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"wxc" = (
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plating,
/area/engine/atmos)
@@ -82869,10 +82856,13 @@
/turf/open/floor/plating,
/area/crew_quarters/cryopod)
"wFH" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/maintenance/aft";
+ name = "Aft Maintenance APC";
+ pixel_y = -24
},
-/obj/effect/landmark/blobstart,
+/obj/structure/cable/yellow,
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"wKo" = (
@@ -82880,8 +82870,15 @@
/turf/closed/wall,
/area/science/circuit)
"wOE" = (
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Airlock";
+ req_access_txt = "24"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
/turf/open/floor/plating,
-/area/maintenance/aft)
+/area/engine/atmos)
"wOY" = (
/obj/structure/fans/tiny/invisible,
/turf/open/space/basic,
@@ -82940,15 +82937,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"xse" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
@@ -83056,6 +83049,19 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"yfW" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/port/aft)
"ygk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -95238,9 +95244,9 @@ anS
anS
aaf
aaf
-aqB
-anS
-aaf
+dne
+cfA
+dne
aaf
aaf
aaf
@@ -95496,7 +95502,7 @@ aaa
aaa
aaf
dne
-avJ
+avL
dne
aaf
aaa
@@ -96581,7 +96587,7 @@ bXt
bYC
bYC
bYC
-aaa
+bYC
aaa
aaf
aaa
@@ -96838,8 +96844,8 @@ bXu
bYD
bZN
jyQ
+yfW
cda
-cej
cfz
cED
chY
@@ -97095,7 +97101,7 @@ bXv
bYC
bYC
bYC
-aaa
+bYC
aaa
aaf
aaa
@@ -99168,7 +99174,7 @@ ckN
aaa
aaf
aaf
-aaa
+lMJ
aaa
aaf
aaa
@@ -99423,7 +99429,7 @@ ckQ
cjt
ckN
aaf
-aaf
+ack
cwf
ack
aaf
@@ -99680,10 +99686,10 @@ cjt
diJ
dux
dux
-ack
+dux
cwg
-ack
-ack
+dux
+dux
aaf
aaa
aaa
@@ -99937,9 +99943,9 @@ crh
dxv
ctn
dux
-dux
-cfA
-dux
+sUM
+cwh
+dyw
dux
aaf
aaf
@@ -100194,8 +100200,8 @@ dvt
csf
cto
dux
-cvj
-cwh
+cfF
+mSd
cxb
dux
aaa
@@ -101647,7 +101653,7 @@ aaa
aaa
acT
aaa
-aaf
+aee
aee
aee
aee
@@ -101904,7 +101910,7 @@ aaf
aaf
acU
aak
-aak
+abN
aef
aeG
afE
@@ -102161,7 +102167,7 @@ aaa
aaa
aaf
aaa
-aaf
+aee
aee
aee
aee
@@ -108580,7 +108586,7 @@ aaa
aaa
aaa
wOY
-abN
+abe
ach
aax
acN
@@ -108838,7 +108844,7 @@ urv
abe
abe
abe
-aci
+abL
aax
acO
adh
@@ -112806,7 +112812,7 @@ cFh
cKH
cLz
wFH
-cMk
+bTs
bTs
bTs
bTs
@@ -113063,8 +113069,8 @@ cJN
cCq
cgN
cMl
-wOE
bTs
+lMJ
aaf
aaf
aaf
@@ -113321,7 +113327,7 @@ cCq
cLA
bTs
bTs
-bTs
+lMJ
aaf
aaa
aaa
@@ -119485,7 +119491,7 @@ aaf
aaa
aaf
dvY
-kDM
+cJd
dvY
aaa
dbN
@@ -119741,13 +119747,13 @@ cEA
aaf
aaa
aaa
-ack
+dvY
cJf
-ack
-aaa
-aaf
-dbR
+dvY
aaa
+dbN
+gsT
+dbN
aaa
aaa
aaa
@@ -119893,7 +119899,7 @@ aaf
aaa
aaa
aaa
-sdw
+aaa
aaa
acP
acP
@@ -119998,9 +120004,9 @@ blx
aaa
aaa
aaa
-aaa
-aaf
-aaa
+ack
+uim
+ack
aaa
aaf
dbR
@@ -121266,7 +121272,7 @@ ciL
cgs
csc
dvY
-evy
+dxk
krD
lsv
txj
@@ -121523,7 +121529,7 @@ cpK
ciL
csc
dvY
-vLD
+lMJ
krD
jyv
ohj
@@ -121780,7 +121786,7 @@ cpL
crb
csd
dvY
-vLD
+lMJ
krD
krD
noG
@@ -123501,7 +123507,7 @@ aaa
aaa
aaf
dni
-amG
+asB
amH
anN
dnS
@@ -123758,7 +123764,7 @@ aaf
aaf
aaf
dnh
-amH
+avG
dnh
apd
dnS
@@ -124014,8 +124020,8 @@ aaa
aaf
aaa
aaf
-aaa
-ack
+dnh
+aci
dnh
ape
dnS
@@ -127140,8 +127146,8 @@ aaa
aaf
bpw
aaf
-aaf
-ack
+cvj
+kDM
bxc
bzg
bAP
@@ -127398,7 +127404,7 @@ aaf
bpw
aaa
aaf
-aaf
+ack
bxc
bzh
bAQ
@@ -128190,9 +128196,9 @@ gJs
bFZ
bAR
aaf
-bxc
+lNZ
wxc
-bxc
+lNZ
aaf
aaa
aaf
@@ -128447,9 +128453,9 @@ bVN
bXr
bAR
aaf
-aMr
-ccY
-bBb
+lNZ
+wOE
+lNZ
aaf
aaa
aaf
@@ -128704,7 +128710,7 @@ bVO
bUJ
bAR
aaf
-aMq
+sdw
ccY
bgo
aTQ
@@ -129161,8 +129167,8 @@ aaa
ack
ack
atn
-bOY
-avG
+anN
+dnS
dqT
aaf
aaa
@@ -129218,7 +129224,7 @@ bAR
bAR
bAR
aaf
-aMq
+sdw
ccY
aVk
aNC
@@ -129418,8 +129424,8 @@ aaf
aaf
aaf
dnh
-dnh
-lNZ
+avJ
+avG
dqT
aaf
aaa
@@ -129674,9 +129680,9 @@ aaa
aaa
aaf
aaa
-aaa
-aaf
-ack
+dnh
+dnh
+bOY
dqT
aaf
anT
@@ -135878,7 +135884,7 @@ blA
bnu
bpH
brU
-aOV
+cMk
aaa
aMq
bzm
@@ -136120,7 +136126,7 @@ aOU
aOY
aOY
aOY
-aTT
+aNC
aaa
aaa
aaa
@@ -136138,7 +136144,7 @@ brV
aRy
aaa
aaa
-aTT
+aNC
aOY
aOY
aOY
@@ -136377,7 +136383,7 @@ aOV
aaa
aaa
aaa
-aTU
+aaf
aaa
aRy
aRy
@@ -136402,7 +136408,7 @@ aaa
aaa
aaa
aaa
-aTU
+aaf
aaa
aaa
aaa
@@ -139461,7 +139467,7 @@ aOV
aaa
aaa
aaa
-aTU
+aaf
aaa
aRy
aRy
@@ -139479,14 +139485,14 @@ bsh
aRy
bvt
aaa
-aTU
+aaf
aaa
aaa
aaa
aaa
aaa
aaa
-aTU
+aaf
aaa
aaa
aaa
@@ -139718,7 +139724,7 @@ aOX
aNw
aNw
aNw
-aTY
+bJl
aaa
aaa
aaa
@@ -139736,14 +139742,14 @@ bsi
aRy
aaa
aaa
-aTY
+bJl
aNw
aNw
aNw
aNw
aNw
aNw
-aTY
+bJl
aNw
aNw
aNw
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index e07873089a..db44dfb92a 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -1244,15 +1244,7 @@
/turf/closed/wall,
/area/maintenance/starboard/fore)
"abM" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"abN" = (
@@ -23608,22 +23600,9 @@
/turf/open/floor/engine,
/area/engine/supermatter)
"aKB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"aKC" = (
@@ -23645,14 +23624,23 @@
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"aKF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/sign/warning/vacuum{
- pixel_x = -32;
- pixel_y = 32
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
},
-/turf/open/floor/plating,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
/area/maintenance/port/aft)
"aKG" = (
/obj/structure/cable/white{
@@ -39608,9 +39596,17 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"edA" = (
-/obj/structure/lattice,
-/turf/open/space/basic,
-/area/space)
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/maintenance/starboard/fore)
"eew" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/cable{
@@ -42876,9 +42872,6 @@
/obj/structure/sign/warning/securearea,
/turf/closed/wall/rust,
/area/maintenance/starboard)
-"sIO" = (
-/turf/open/space/basic,
-/area/space/nearstation)
"sIP" = (
/obj/machinery/vending/cola/random,
/obj/effect/turf_decal/bot,
@@ -71461,7 +71454,7 @@ aaa
aaa
aaa
aaa
-aaa
+sdX
uhz
uhz
oxn
@@ -71718,7 +71711,7 @@ aac
aac
aac
aac
-aaa
+sdX
uhz
iye
mJP
@@ -91220,7 +91213,7 @@ aaa
aae
aaa
aaa
-aac
+bxZ
abL
bxZ
swz
@@ -91477,7 +91470,7 @@ aaa
aae
aad
aac
-bvg
+edA
abM
acu
adt
@@ -91734,7 +91727,7 @@ aad
aah
aad
aad
-aad
+bxZ
bxZ
adq
bxZ
@@ -93059,7 +93052,7 @@ aRz
sIc
sIv
sFs
-sIO
+aaa
sIU
sJe
sIU
@@ -98477,9 +98470,9 @@ aac
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aac
aac
aac
@@ -98734,9 +98727,9 @@ aac
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aac
aaa
@@ -98991,9 +98984,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -99248,9 +99241,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -99505,9 +99498,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -99762,9 +99755,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -100019,9 +100012,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -100276,9 +100269,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -100533,9 +100526,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -100790,9 +100783,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -101047,9 +101040,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -101304,9 +101297,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -101561,9 +101554,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -101818,9 +101811,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -102075,9 +102068,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -102332,9 +102325,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -102589,9 +102582,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -102846,9 +102839,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -103103,9 +103096,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -103360,9 +103353,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -103617,9 +103610,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -103874,9 +103867,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -104131,9 +104124,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -104388,9 +104381,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -104645,9 +104638,9 @@ jFP
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -104902,9 +104895,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -105159,9 +105152,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
@@ -105416,9 +105409,9 @@ aaa
aaa
aaa
aaa
-edA
+sdX
aaa
-edA
+sdX
aaa
aaa
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index e6f14badd9..263cb44144 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -1846,7 +1846,7 @@
network = list("minisat")
},
/turf/open/space,
-/area/ai_monitored/turret_protected/AIsatextAS)
+/area/ai_monitored/turret_protected/AIsatextAP)
"aeA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
@@ -2622,9 +2622,6 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = 32
- },
/obj/structure/sign/warning/vacuum/external{
pixel_x = -32
},
@@ -2744,12 +2741,8 @@
/turf/open/floor/plating,
/area/security/main)
"agR" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- name = "MiniSat External Access";
- req_access_txt = "65"
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = 32
},
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/aisat_interior)
@@ -2821,12 +2814,15 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"ahh" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/showcase/cyborg/old{
- pixel_y = 20
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ name = "MiniSat External Access";
+ req_access_txt = "65"
+ },
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/aisat_interior)
"ahi" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -2927,13 +2923,15 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"ahr" = (
-/obj/structure/lattice,
-/obj/machinery/camera/motion{
- c_tag = "MiniSat Entrance";
- network = list("minisat")
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ name = "Security External Airlock";
+ req_access_txt = "63"
+ },
+/turf/open/floor/plating,
+/area/maintenance/fore)
"ahs" = (
/obj/structure/lattice/catwalk,
/obj/structure/transit_tube,
@@ -4690,8 +4688,12 @@
/turf/open/space/basic,
/area/space/nearstation)
"alb" = (
-/turf/open/floor/wood,
-/area/maintenance/department/crew_quarters/dorms)
+/obj/structure/lattice/catwalk,
+/obj/structure/showcase/cyborg/old{
+ pixel_y = 20
+ },
+/turf/open/space,
+/area/space/nearstation)
"alc" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/cigars,
@@ -6634,13 +6636,6 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"apn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Security External Airlock";
- req_access_txt = "63"
- },
/turf/open/floor/plating,
/area/maintenance/fore)
"apo" = (
@@ -8703,13 +8698,18 @@
/turf/closed/wall,
/area/bridge)
"atZ" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
/obj/machinery/door/airlock/external{
- name = "Bridge External Access";
- req_access_txt = "10;13"
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
},
/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/aisat_interior)
+/area/maintenance/solars/starboard)
"aua" = (
/obj/structure/closet/secure_closet/freezer/money,
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
@@ -9124,9 +9124,6 @@
/obj/structure/sign/warning/vacuum/external{
pixel_x = -32
},
-/obj/machinery/light/small{
- dir = 1
- },
/turf/open/floor/plating,
/area/bridge)
"auV" = (
@@ -13689,14 +13686,13 @@
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"aFj" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/structure/lattice,
+/obj/machinery/camera/motion{
+ c_tag = "MiniSat Entrance";
+ network = list("minisat")
},
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/department/cargo)
+/turf/open/space,
+/area/space/nearstation)
"aFk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/spawner/lootdrop/minor/bowler_or_that,
@@ -22864,11 +22860,13 @@
/turf/closed/wall,
/area/maintenance/solars/starboard)
"baH" = (
-/obj/structure/rack,
-/obj/item/clothing/mask/gas,
-/obj/item/multitool,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "Bridge External Access";
+ req_access_txt = "10;13"
+ },
/turf/open/floor/plating,
-/area/maintenance/solars/starboard)
+/area/ai_monitored/turret_protected/aisat_interior)
"baI" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -23315,13 +23313,6 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"bbL" = (
-/obj/machinery/power/smes,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard)
-"bbM" = (
/obj/machinery/power/terminal{
dir = 8
},
@@ -23333,17 +23324,10 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
-"bbO" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
+"bbM" = (
+/obj/structure/rack,
+/obj/item/clothing/mask/gas,
+/obj/item/multitool,
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"bbP" = (
@@ -23757,16 +23741,6 @@
/turf/open/floor/plating,
/area/maintenance/department/cargo)
"bcJ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/door/airlock/engineering{
- name = "Starboard Solar Access";
- req_access_txt = "10"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard)
-"bcK" = (
/obj/structure/cable{
icon_state = "1-2"
},
@@ -23775,27 +23749,35 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
-"bcL" = (
+"bcK" = (
/obj/structure/cable{
icon_state = "1-4"
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
-"bcN" = (
-/obj/machinery/power/solar_control{
- dir = 8;
- id = "starboardsolar";
- name = "Starboard Solar Control"
+"bcL" = (
+/obj/structure/cable{
+ icon_state = "2-4"
},
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard)
-"bcO" = (
/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
+"bcN" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plating,
+/area/bridge)
+"bcO" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/turf/open/space,
+/area/space/nearstation)
"bcQ" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -24156,17 +24138,17 @@
},
/area/maintenance/department/cargo)
"bdR" = (
-/obj/structure/cable,
-/obj/machinery/power/apc{
- dir = 8;
- name = "Starboard Solar APC";
- pixel_x = -24
- },
+/obj/structure/chair/stool,
+/obj/item/cigbutt/cigarbutt,
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"bdS" = (
-/obj/structure/chair/stool,
-/obj/item/cigbutt/cigarbutt,
+/obj/machinery/power/solar_control{
+ dir = 8;
+ id = "starboardsolar";
+ name = "Starboard Solar Control"
+ },
+/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"bdU" = (
@@ -27986,7 +27968,7 @@
dir = 8
},
/turf/open/floor/plasteel/white,
-/area/storage/emergency/port)
+/area/medical/medbay/zone3)
"bny" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/firealarm{
@@ -28005,7 +27987,7 @@
dir = 4
},
/turf/open/floor/plasteel/white,
-/area/storage/emergency/port)
+/area/medical/medbay/zone3)
"bnz" = (
/obj/structure/table,
/obj/item/folder/white,
@@ -39909,12 +39891,6 @@
/area/science/mixing)
"bMp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/machinery/door/airlock/external{
- req_access_txt = "8"
- },
/turf/open/floor/plating,
/area/science/mixing)
"bMq" = (
@@ -40394,11 +40370,10 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bNq" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 6
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 1
},
-/turf/open/space,
+/turf/open/floor/plating/airless,
/area/science/mixing)
"bNr" = (
/obj/structure/window/reinforced{
@@ -40834,10 +40809,11 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bOu" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on{
- dir = 1
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 6
},
-/turf/open/floor/plating/airless,
+/turf/open/space,
/area/science/mixing)
"bOv" = (
/obj/structure/window/reinforced{
@@ -41125,12 +41101,15 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bPl" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
},
-/turf/open/space,
-/area/space/nearstation)
+/obj/machinery/door/airlock/external{
+ req_access_txt = "8"
+ },
+/turf/open/floor/plating,
+/area/science/mixing)
"bPn" = (
/obj/machinery/door/airlock/grunge{
name = "Chapel"
@@ -43266,7 +43245,7 @@
/obj/structure/closet/firecloset,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
-/area/engine/atmos)
+/area/engine/break_room)
"bTR" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
@@ -43455,7 +43434,7 @@
/obj/effect/turf_decal/delivery,
/obj/structure/closet/firecloset,
/turf/open/floor/plasteel,
-/area/engine/atmos)
+/area/engine/break_room)
"bUp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
@@ -43848,7 +43827,7 @@
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers,
/turf/open/floor/plasteel,
-/area/engine/atmos)
+/area/engine/break_room)
"bVd" = (
/obj/machinery/door/airlock/atmos{
name = "Atmospherics";
@@ -45016,10 +44995,6 @@
/turf/open/floor/plating,
/area/chapel/asteroid/monastery)
"bXN" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external,
/turf/open/floor/plating,
/area/chapel/asteroid/monastery)
"bXS" = (
@@ -45926,12 +45901,21 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{
dir = 8
},
+/obj/machinery/air_sensor/atmos/incinerator_tank{
+ pixel_x = 32;
+ pixel_y = -32
+ },
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
"bZV" = (
-/obj/structure/sign/warning/fire,
-/turf/closed/wall/r_wall,
-/area/maintenance/disposal/incinerator)
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/cargo)
"bZY" = (
/turf/closed/wall,
/area/chapel/office)
@@ -46149,13 +46133,15 @@
icon_state = "4-8"
},
/obj/machinery/igniter/incinerator_atmos,
-/obj/machinery/air_sensor/atmos/incinerator_tank{
- pixel_x = 32;
- pixel_y = -32
- },
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
"caP" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/maintenance/disposal/incinerator)
+"caQ" = (
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -46167,13 +46153,9 @@
dir = 8;
luminosity = 2
},
-/obj/machinery/camera{
- c_tag = "Turbine Chamber";
- network = list("turbine")
- },
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
-"caQ" = (
+"caR" = (
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -46183,10 +46165,6 @@
},
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
-"caR" = (
-/obj/machinery/door/poddoor/incinerator_atmos_main,
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
"caS" = (
/turf/closed/wall,
/area/chapel/asteroid/monastery)
@@ -46611,9 +46589,9 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/disposal/incinerator)
"ccs" = (
-/obj/machinery/door/poddoor/incinerator_atmos_aux,
-/turf/open/floor/engine/vacuum,
-/area/maintenance/disposal/incinerator)
+/obj/structure/lattice,
+/turf/closed/wall,
+/area/maintenance/department/cargo)
"ccu" = (
/obj/structure/flora/ausbushes/leafybush,
/turf/open/floor/plating/asteroid,
@@ -46786,13 +46764,6 @@
/turf/open/floor/plating,
/area/maintenance/disposal/incinerator)
"cdl" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Access";
- req_access_txt = "24"
- },
/turf/open/floor/plating,
/area/maintenance/disposal/incinerator)
"cdm" = (
@@ -47328,6 +47299,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"cfu" = (
@@ -47446,14 +47420,12 @@
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"cfQ" = (
-/obj/structure/chair{
- dir = 8
+/obj/machinery/power/smes,
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel/dark,
-/area/engine/engineering)
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard)
"cfS" = (
/obj/structure/table/reinforced,
/obj/item/tank/internals/emergency_oxygen/engi,
@@ -47579,14 +47551,12 @@
/turf/open/floor/plating,
/area/engine/engineering)
"cgs" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "Engineering External Access";
- req_access_txt = "61"
- },
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/light/small{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/engine/engineering)
"cgu" = (
@@ -47678,9 +47648,6 @@
/turf/open/floor/plating/airless,
/area/space/nearstation)
"cgQ" = (
-/obj/machinery/light/small{
- dir = 8
- },
/obj/structure/sign/warning/vacuum/external{
pixel_x = -32
},
@@ -49453,7 +49420,7 @@
/obj/structure/lattice,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/space/basic,
-/area/ai_monitored/turret_protected/AIsatextAS)
+/area/ai_monitored/turret_protected/AIsatextAP)
"cnJ" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/vending/wardrobe/sec_wardrobe,
@@ -50434,6 +50401,15 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"crB" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
+"crC" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
@@ -50445,15 +50421,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
-"crC" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
"crD" = (
/obj/structure/table/wood/fancy,
/obj/item/storage/box/bodybags,
@@ -53580,13 +53547,15 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"dWp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/airlock/external{
+ name = "Engineering External Access";
+ req_access_txt = "61"
},
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plating,
/area/engine/engineering)
"dYe" = (
/obj/structure/cable{
@@ -53959,6 +53928,9 @@
/obj/effect/turf_decal/arrows{
dir = 8
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"eWi" = (
@@ -54360,6 +54332,9 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
+"fRr" = (
+/turf/open/floor/engine/vacuum,
+/area/maintenance/disposal/incinerator)
"fRs" = (
/turf/closed/wall,
/area/crew_quarters/heads/hor)
@@ -54572,6 +54547,16 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"gmZ" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Access";
+ req_access_txt = "24"
+ },
+/turf/open/floor/plating,
+/area/maintenance/disposal/incinerator)
"gna" = (
/turf/open/floor/plasteel/stairs/medium,
/area/maintenance/department/crew_quarters/dorms)
@@ -54932,6 +54917,10 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"hbl" = (
+/obj/machinery/door/poddoor/incinerator_atmos_main,
+/turf/open/floor/engine/vacuum,
+/area/space)
"heC" = (
/obj/machinery/power/apc/highcap/five_k{
dir = 8;
@@ -55279,14 +55268,15 @@
/turf/open/floor/engine,
/area/engine/engineering)
"hSM" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
+/obj/machinery/door/airlock/engineering{
+ name = "Starboard Solar Access";
+ req_access_txt = "10"
},
/turf/open/floor/plating,
-/area/maintenance/department/science)
+/area/maintenance/solars/starboard)
"hTl" = (
/obj/structure/sink{
dir = 4;
@@ -55395,6 +55385,13 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/engine/engineering)
+"igB" = (
+/obj/machinery/camera{
+ c_tag = "Turbine Chamber";
+ network = list("turbine")
+ },
+/turf/open/floor/engine,
+/area/maintenance/disposal/incinerator)
"igE" = (
/obj/structure/table/reinforced,
/obj/machinery/button/door{
@@ -55667,7 +55664,7 @@
dir = 9
},
/turf/open/floor/plasteel/white,
-/area/storage/emergency/port)
+/area/medical/medbay/zone3)
"iJi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
@@ -57269,6 +57266,15 @@
},
/turf/open/floor/plasteel,
/area/science/xenobiology)
+"mvm" = (
+/obj/structure/cable,
+/obj/machinery/power/apc{
+ dir = 8;
+ name = "Starboard Solar APC";
+ pixel_x = -24
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard)
"mwg" = (
/obj/structure/closet/crate{
icon_state = "crateopen"
@@ -57459,6 +57465,10 @@
/obj/effect/landmark/start/paramedic,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"nbu" = (
+/obj/structure/sign/warning/fire,
+/turf/closed/wall/r_wall,
+/area/space)
"ncm" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
@@ -58035,6 +58045,10 @@
},
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
+"ore" = (
+/obj/structure/closet/firecloset,
+/turf/open/floor/plating,
+/area/engine/engineering)
"ost" = (
/obj/structure/table/glass,
/obj/item/paper_bin{
@@ -58146,13 +58160,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"oDP" = (
@@ -58221,6 +58228,12 @@
/obj/item/stack/sheet/mineral/wood,
/turf/open/floor/plasteel,
/area/maintenance/department/engine)
+"oGw" = (
+/obj/item/clothing/mask/gas,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/disposal/incinerator)
"oHa" = (
/obj/machinery/power/emitter/anchored{
dir = 8;
@@ -59255,6 +59268,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+"qVk" = (
+/obj/machinery/door/poddoor/incinerator_atmos_aux,
+/turf/open/space/basic,
+/area/maintenance/disposal/incinerator)
"qVP" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -59563,6 +59580,13 @@
icon_state = "panelscorched"
},
/area/maintenance/department/engine)
+"rzF" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external,
+/turf/open/floor/plating,
+/area/chapel/asteroid/monastery)
"rBh" = (
/obj/structure/mopbucket,
/obj/item/mop,
@@ -60877,12 +60901,16 @@
/turf/open/floor/plasteel,
/area/science/xenobiology)
"uXH" = (
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"uZb" = (
@@ -61180,6 +61208,15 @@
},
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"vHf" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ req_access_txt = "13"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/science)
"vIc" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -62245,7 +62282,9 @@
/obj/structure/chair{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
@@ -77500,9 +77539,9 @@ rLi
tlc
aiu
aht
-aaa
-azH
-aaa
+axB
+rKr
+axB
aaa
aaa
aaa
@@ -77758,9 +77797,9 @@ aiu
aiu
axC
axB
-rKr
+azN
axB
-axC
+aaa
aaa
aaa
aaa
@@ -78017,7 +78056,7 @@ axC
ayz
azN
axB
-axC
+aaa
aaa
aaa
aaa
@@ -81853,7 +81892,7 @@ ahB
ahZ
aiB
ajc
-agy
+ajM
akB
alq
alZ
@@ -82110,7 +82149,7 @@ ahC
aia
aiC
ajc
-agy
+ajM
akC
alr
ama
@@ -82367,7 +82406,7 @@ ahD
aib
aiD
ajc
-agy
+ajM
akD
als
amb
@@ -82458,9 +82497,9 @@ aht
aaa
aaa
abI
-aaa
-bSZ
-ahi
+bGI
+bNs
+rzF
bNs
bOw
bOw
@@ -82624,7 +82663,7 @@ ahB
aic
aiE
agy
-agy
+ajM
akE
alt
amc
@@ -82716,7 +82755,7 @@ abI
abI
abI
aaa
-aht
+bSZ
ahi
bNs
bNs
@@ -84536,8 +84575,8 @@ aaa
aaa
aaa
aaa
-kSb
-kSb
+fon
+fon
aht
aht
nKo
@@ -88120,7 +88159,7 @@ bDi
bDi
bDi
bIZ
-mZE
+aaa
aaa
aaa
aaa
@@ -88377,8 +88416,8 @@ wNq
bva
gMO
bBX
-mZE
-mZE
+aaa
+aaa
aaa
aaa
aaa
@@ -88635,7 +88674,7 @@ bBX
fdS
bBX
bBX
-mZE
+aaa
aaa
aaa
aaa
@@ -90436,7 +90475,7 @@ gnq
bXk
ceU
eVy
-cfP
+bXk
bXk
bXk
bXk
@@ -90597,9 +90636,9 @@ aaa
aaa
aaa
aaa
-aaa
-ahi
-ahi
+aoz
+ahr
+aoz
aqG
arD
asO
@@ -90855,8 +90894,8 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
+cdm
+cdm
aqG
arE
arA
@@ -90950,8 +90989,8 @@ cdM
bXq
xmE
ymb
-cfQ
bXk
+ore
qWG
bXk
paU
@@ -94698,7 +94737,7 @@ ags
adX
adX
adX
-aaa
+adX
aaa
aaa
aaa
@@ -94954,8 +94993,8 @@ cnC
adX
adX
adX
-ahh
-aaa
+adX
+alb
aaa
aaa
aaa
@@ -94970,9 +95009,9 @@ aaa
aaa
aaa
aaa
-aaa
ahi
atY
+bcN
auU
atY
lQQ
@@ -95211,6 +95250,7 @@ bIK
agt
agD
agR
+ahh
ahi
aaa
aaa
@@ -95218,7 +95258,6 @@ aaa
aaa
aaa
aaa
-aaa
aht
amC
aht
@@ -95227,9 +95266,9 @@ aaa
aaa
aaa
aaa
-aaa
ahi
-atZ
+baH
+auV
auV
awc
axg
@@ -95468,8 +95507,8 @@ agg
adX
adX
adX
-ahh
-aaa
+adX
+alb
aaa
aaa
aaa
@@ -95484,11 +95523,11 @@ aaa
aaa
aaa
aaa
-aaa
ahi
atY
atY
atY
+atY
axh
axh
axh
@@ -95726,8 +95765,8 @@ ags
adX
adX
adX
-ahr
-aht
+adX
+aFj
aht
aht
aht
@@ -98814,7 +98853,7 @@ iqc
ngp
cBr
cBs
-alb
+tap
gna
klV
xbJ
@@ -99584,7 +99623,7 @@ aju
ajt
alQ
mnG
-alb
+tap
tap
aiS
anY
@@ -99842,7 +99881,7 @@ alc
alR
amF
pzF
-alb
+tap
anm
ajv
ajv
@@ -101740,7 +101779,7 @@ caN
bZT
bYw
cdl
-bYw
+oGw
bYw
aaa
mau
@@ -101995,9 +102034,9 @@ bYw
bZU
caO
cbF
-ccs
-cdm
-cdm
+bYw
+gmZ
+bYw
bYw
aht
fon
@@ -102249,13 +102288,13 @@ bVo
bJP
aht
bYw
-bYw
+igB
caP
+fRr
+qVk
+cdm
+cdm
bYw
-bYw
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -102505,11 +102544,11 @@ bWg
bVo
bJP
aaa
-aaa
+bYw
bYw
caQ
bYw
-aaa
+bYw
aaa
aaa
aaa
@@ -102762,10 +102801,10 @@ bJP
bJP
bJP
abI
-abI
-bZV
+aaa
+bYw
caR
-bZV
+bYw
aaa
aaa
aaa
@@ -103019,10 +103058,10 @@ aaa
aaa
abI
aaa
-aaa
-aaa
-aaa
-aaa
+abI
+nbu
+hbl
+nbu
aaa
aaa
aaa
@@ -105574,9 +105613,9 @@ bIN
dAF
bCV
bCV
-bNq
+bCV
bOu
-aht
+bNq
aaa
aaa
aaa
@@ -105832,8 +105871,8 @@ bJT
wOS
bMp
bPl
-mZE
-aht
+bcO
+aaa
aaa
aaa
aaa
@@ -106088,9 +106127,9 @@ fBz
bCV
bCV
bCV
+bCV
ahi
aht
-aht
abI
abI
abI
@@ -106822,7 +106861,7 @@ aEl
aEj
aEj
aht
-aht
+ccs
aEj
aEl
aEl
@@ -107079,10 +107118,10 @@ aTu
aUB
aEl
aaa
-aaa
-aEl
+aEj
aZv
aUC
+aUC
bcH
aUC
aZw
@@ -107337,8 +107376,8 @@ aGO
aEj
aEj
aEj
-aEj
aTx
+aFi
aGO
bcI
aFi
@@ -107574,10 +107613,10 @@ aaa
aaa
aaa
aaa
+aEl
+aFi
aEj
-aFj
-aEj
-aEj
+aaa
aEj
aEl
aEj
@@ -107594,12 +107633,12 @@ aUC
aVE
aUC
aUC
-aUC
aZw
-aFi
-bcI
-aFi
-aFi
+aEj
+aEj
+hSM
+aEj
+aEj
kIo
bfN
aEj
@@ -107831,9 +107870,9 @@ aaa
aaa
aaa
aaa
-ahi
-ahi
-ahi
+aEj
+bZV
+aEj
aaa
aaa
aaa
@@ -107853,9 +107892,9 @@ aEj
aEj
aYC
baG
-baG
+cfQ
bcJ
-baG
+mvm
baG
aEj
aEj
@@ -108088,9 +108127,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+ahi
+ahi
+ahi
aaa
aaa
aaa
@@ -108624,9 +108663,9 @@ aFi
aFi
aYD
baG
-baH
+rWE
uXH
-bcN
+rWE
baG
eZA
tDn
@@ -108882,7 +108921,7 @@ aXC
aYE
baG
rWE
-bbO
+oCX
rWE
baG
vzT
@@ -109139,7 +109178,7 @@ aXC
aYF
baG
sut
-bcO
+oCX
rWE
baG
dsv
@@ -109396,7 +109435,7 @@ aEl
aEl
baG
rWE
-oCX
+atZ
rWE
baG
aEj
@@ -109902,7 +109941,7 @@ aaa
aaa
aaa
aaa
-mZE
+aaa
aaa
aaa
aaa
@@ -112504,7 +112543,7 @@ qcH
bnd
nNN
bwm
-hSM
+lWy
bwm
bwm
aaa
@@ -112760,10 +112799,10 @@ riW
jtf
bnd
aht
-ahi
-ahi
-ahi
-aht
+bwm
+vHf
+bwm
+aaa
aht
aby
aht
@@ -113017,9 +113056,9 @@ cOp
lGS
bnd
aaa
-aaa
-aaa
-aaa
+ahi
+ahi
+ahi
aht
aaa
aed
diff --git a/byond-extools.dll b/byond-extools.dll
index 4910fad01b..bd6b34c48e 100644
Binary files a/byond-extools.dll and b/byond-extools.dll differ
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index bdee4cdcd5..65994dda5a 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -312,6 +312,7 @@
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
+#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //called exclusively in plumbing, for now
#define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user)
#define COMPONENT_STOP_GENERIC_ATTACK 1
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 6ddd269b4b..9c39446a67 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -64,7 +64,6 @@
#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
-#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
@@ -333,4 +332,4 @@
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
-#define SILENCE_RANGED_MESSAGE (1<<0)
+#define SILENCE_RANGED_MESSAGE (1<<0)
diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm
new file mode 100644
index 0000000000..5ea7c46b42
--- /dev/null
+++ b/code/__DEFINES/plumbing.dm
@@ -0,0 +1,9 @@
+#define FIRST_DUCT_LAYER 1
+#define SECOND_DUCT_LAYER 2
+#define THIRD_DUCT_LAYER 4
+#define FOURTH_DUCT_LAYER 8
+#define FIFTH_DUCT_LAYER 16
+
+#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER
+
+#define MACHINE_REAGENT_TRANSFER 10
diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm
index 4296e3c2e9..63259774fa 100644
--- a/code/__DEFINES/qdel.dm
+++ b/code/__DEFINES/qdel.dm
@@ -6,10 +6,17 @@
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference.
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
-#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
- //if TESTING is enabled, qdel will call this object's find_references() verb.
-#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails.
-//defines for the gc_destroyed var
+
+#ifdef LEGACY_REFERENCE_TRACKING
+/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb.
+ *
+ * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm.
+*/
+#define QDEL_HINT_FINDREFERENCE 5
+/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced.
+#define QDEL_HINT_IFFAIL_FINDREFERENCE 6
+#endif
+
#define GC_QUEUE_CHECK 1
#define GC_QUEUE_HARDDELETE 2
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index f4beef7ee8..44e97ef345 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -57,6 +57,10 @@
#define ADD_REAGENT 2 // reagent added
#define REM_REAGENT 3 // reagent removed (may still exist)
+
+#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die (literally, we'll toss a nuke at whever your ip turns up)
+#define RANDOM_PILL_STYLE 22 //Dont change this one though
+
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
//reagent bitflags, used for altering how they works
diff --git a/code/__DEFINES/rockpaperscissors.dm b/code/__DEFINES/rockpaperscissors.dm
new file mode 100644
index 0000000000..77ba81938d
--- /dev/null
+++ b/code/__DEFINES/rockpaperscissors.dm
@@ -0,0 +1,7 @@
+#define ROCKPAPERSCISSORS_RANGE 3
+#define ROCKPAPERSCISSORS_TIME_LIMIT 20 SECONDS
+
+#define ROCKPAPERSCISSORS_LOSE "lose"
+#define ROCKPAPERSCISSORS_WIN "win"
+#define ROCKPAPERSCISSORS_TIE "tie"
+#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided"
\ No newline at end of file
diff --git a/code/__DEFINES/storage/volumetrics.dm b/code/__DEFINES/storage/volumetrics.dm
index c3f45976ce..e6b732e083 100644
--- a/code/__DEFINES/storage/volumetrics.dm
+++ b/code/__DEFINES/storage/volumetrics.dm
@@ -24,7 +24,10 @@ GLOBAL_LIST_INIT(default_weight_class_to_volume, list(
// Let's keep all of this in one place. given what we put above anyways..
// volume amount for items
+/// volume for a data disk
#define ITEM_VOLUME_DISK 1
+/// volume for a shotgun stripper clip holding 4 shells
+#define ITEM_VOLUME_STRIPPER_CLIP (DEFAULT_VOLUME_NORMAL * 0.5)
// #define SAMPLE_VOLUME_AMOUNT 2
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 7a188281d0..81b5c5620f 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -146,11 +146,11 @@
#define SSAIR_EQUALIZE 8
#define SSAIR_ACTIVETURFS 9
+// |= on overlays is not actually guaranteed to not add same appearances but we're optimistically using it anyway.
#define COMPILE_OVERLAYS(A)\
if (TRUE) {\
var/list/ad = A.add_overlays;\
var/list/rm = A.remove_overlays;\
- var/list/po = A.priority_overlays;\
if(LAZYLEN(rm)){\
A.overlays -= rm;\
A.remove_overlays = null;\
@@ -159,11 +159,5 @@
A.overlays |= ad;\
A.add_overlays = null;\
}\
- if(LAZYLEN(po)){\
- A.overlays |= po;\
- }\
- else{\
- A.priority_overlays = null;\
- }\
A.flags_1 &= ~OVERLAY_QUEUED_1;\
}
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index 101330cc8b..fe46fdc710 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -75,6 +75,7 @@
#define VV_HK_MARK "mark"
#define VV_HK_ADDCOMPONENT "addcomponent"
#define VV_HK_MODIFY_TRAITS "modtraits"
+#define VV_HK_VIEW_REFERENCES "viewreferences"
// /datum/gas_mixture
#define VV_HK_SET_MOLES "set_moles"
diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm
index bdff20553a..4305fb1ed5 100644
--- a/code/__HELPERS/donator_groupings.dm
+++ b/code/__HELPERS/donator_groupings.dm
@@ -17,9 +17,9 @@ For fast lookups, this is generated using regenerate_donator_grouping_list()
/proc/regenerate_donator_grouping_list()
GLOB.donators_by_group = list() //reinit everything
var/list/donator_list = GLOB.donators_by_group //cache
- var/list/tier_1 = TIER_1_DONATORS
- donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
- var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
+ var/list/tier_3 = TIER_3_DONATORS
+ donator_list[DONATOR_GROUP_TIER_3] = tier_3.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
+ var/list/tier_2 = tier_3 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
donator_list[DONATOR_GROUP_TIER_2] = tier_2
- var/list/tier_3 = tier_2 + TIER_3_DONATORS
- donator_list[DONATOR_GROUP_TIER_3] = tier_3
+ var/list/tier_1 = tier_2 + TIER_1_DONATORS
+ donator_list[DONATOR_GROUP_TIER_1] = tier_1
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 9a36c626ba..0e0bd4ffaa 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -11,15 +11,28 @@
#ifdef TESTING
#define DATUMVAR_DEBUGGING_MODE
-//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
- //implies FIND_REF_NO_CHECK_TICK
+/*
+* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete.
+*
+* * Requires TESTING to be defined to work.
+*/
+//#define REFERENCE_TRACKING
-//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping
+///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools.
+//#define LEGACY_REFERENCE_TRACKING
+#ifdef LEGACY_REFERENCE_TRACKING
+///Use the legacy reference on things hard deleting by default.
+//#define GC_FAILURE_HARD_LOOKUP
+#ifdef GC_FAILURE_HARD_LOOKUP
+#define FIND_REF_NO_CHECK_TICK
+#endif //ifdef GC_FAILURE_HARD_LOOKUP
+
+#endif //ifdef LEGACY_REFERENCE_TRACKING
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
-#endif
+#endif //ifdef TESTING
//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER
#ifndef PRELOAD_RSC //set to:
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 8225725ffd..71c2b2e13b 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -278,3 +278,8 @@ GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Ta
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
//parts in either of the above two lists that require a second option that allows them to be coloured
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
+
+//species ids that have greyscale sprites
+GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic"))
+
+//species ids that need snowflake coloring applied
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 4de7c88bf7..fee70ee3d5 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -41,3 +41,6 @@ GLOBAL_LIST_EMPTY(ai_status_displays)
GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert
+
+//list of everyone playing rock paper scissors
+GLOBAL_LIST_EMPTY(rockpaperscissors_players)
diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm
index ce7bc96c96..72b2d035a3 100644
--- a/code/_onclick/hud/screen_objects/storage.dm
+++ b/code/_onclick/hud/screen_objects/storage.dm
@@ -122,13 +122,13 @@
if(pixel_size == pixels)
return
pixel_size = pixels
- cut_overlays(TRUE)
+ cut_overlays()
//our icon size is 32 pixels.
transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0)
left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE
- add_overlay(left, TRUE)
- add_overlay(right, TRUE)
+ add_overlay(left)
+ add_overlay(right)
/obj/screen/storage/volumetric_edge
layer = VOLUMETRIC_STORAGE_BOX_LAYER
diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm
index 8ace273dd8..419524c871 100644
--- a/code/_onclick/overmind.dm
+++ b/code/_onclick/overmind.dm
@@ -32,4 +32,4 @@
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
var/turf/T = get_turf(A)
if(T)
- remove_blob(T)
\ No newline at end of file
+ remove_blob(T)
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index cc9c067b5d..2e3cb1ea46 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -534,4 +534,4 @@
config_entry_value = 6
/datum/config_entry/number/max_shuttle_size
- config_entry_value = 250
+ config_entry_value = 500
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
index e3c415960b..7c9e7634ab 100644
--- a/code/controllers/subsystem/acid.dm
+++ b/code/controllers/subsystem/acid.dm
@@ -29,7 +29,7 @@ SUBSYSTEM_DEF(acid)
if(O.acid_level && O.acid_processing())
else
- O.cut_overlay(GLOB.acid_overlay, TRUE)
+ O.update_icon()
processing -= O
if (MC_TICK_CHECK)
diff --git a/code/controllers/subsystem/fluid.dm b/code/controllers/subsystem/fluid.dm
new file mode 100644
index 0000000000..c4fa13d693
--- /dev/null
+++ b/code/controllers/subsystem/fluid.dm
@@ -0,0 +1,5 @@
+PROCESSING_SUBSYSTEM_DEF(fluids)
+ name = "Fluids"
+ wait = 20
+ stat_tag = "FD" //its actually Fluid Ducts
+ flags = SS_NO_INIT | SS_TICKER
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 8a1c08bc35..b46e22c1fa 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -25,7 +25,7 @@ SUBSYSTEM_DEF(garbage)
//Queue
var/list/queues
- #ifdef TESTING
+ #ifdef LEGACY_REFERENCE_TRACKING
var/list/reference_find_on_fail = list()
var/list/reference_find_on_fail_types = list()
#endif
@@ -134,7 +134,7 @@ SUBSYSTEM_DEF(garbage)
++gcedlasttick
++totalgcs
pass_counts[level]++
- #ifdef TESTING
+ #ifdef LEGACY_REFERENCE_TRACKING
reference_find_on_fail -= refID //It's deleted we don't care anymore.
#endif
if (MC_TICK_CHECK)
@@ -145,7 +145,9 @@ SUBSYSTEM_DEF(garbage)
fail_counts[level]++
switch (level)
if (GC_QUEUE_CHECK)
- #ifdef TESTING
+ #ifdef REFERENCE_TRACKING
+ D.find_references()
+ #elif defined(LEGACY_REFERENCE_TRACKING)
if(reference_find_on_fail[refID])
D.find_references()
#ifdef GC_FAILURE_HARD_LOOKUP
@@ -156,7 +158,19 @@ SUBSYSTEM_DEF(garbage)
#endif
var/type = D.type
var/datum/qdel_item/I = items[type]
+ #ifdef TESTING
+ log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --")
+ for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage
+ var/client/admin = c
+ if(!check_rights_for(admin, R_ADMIN))
+ continue
+ to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --")
testing("GC: -- \ref[src] | [type] was unable to be GC'd --")
+ #endif
+ #ifdef REFERENCE_TRACKING
+ GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only.
+ continue
+ #endif
I.failures++
if (GC_QUEUE_HARDDELETE)
HardDelete(D)
@@ -181,7 +195,7 @@ SUBSYSTEM_DEF(garbage)
var/gctime = world.time
var/refid = "\ref[D]"
-#ifdef TESTING
+#ifdef LEGACY_REFERENCE_TRACKING
if(reference_find_on_fail_types[D.type])
reference_find_on_fail["\ref[D]"] = TRUE
#endif
@@ -193,7 +207,7 @@ SUBSYSTEM_DEF(garbage)
queue[refid] = gctime
-#ifdef TESTING
+#ifdef LEGACY_REFERENCE_TRACKING
/datum/controller/subsystem/garbage/proc/add_type_to_findref(type)
if(!ispath(type))
return "NOT A VAILD PATH"
@@ -260,12 +274,6 @@ SUBSYSTEM_DEF(garbage)
/datum/qdel_item/New(mytype)
name = "[mytype]"
-#ifdef TESTING
-/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE)
- SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE
- qdel(D, force)
-#endif
-
// Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
/proc/qdel(datum/D, force=FALSE, ...)
@@ -319,16 +327,13 @@ SUBSYSTEM_DEF(garbage)
SSgarbage.Queue(D, GC_QUEUE_HARDDELETE)
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
SSgarbage.HardDelete(D)
- if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
+ #ifdef LEGACY_REFERENCE_TRACKING
+ if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion.
SSgarbage.Queue(D)
- #ifdef TESTING
- D.find_references()
- #endif
if (QDEL_HINT_IFFAIL_FINDREFERENCE)
SSgarbage.Queue(D)
- #ifdef TESTING
SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE
- #endif
+ #endif
else
#ifdef TESTING
if(!I.no_hint)
@@ -339,119 +344,6 @@ SUBSYSTEM_DEF(garbage)
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
-#ifdef TESTING
-
-/datum/verb/find_refs()
- set category = "Debug"
- set name = "Find References"
- set src in world
-
- find_references(FALSE)
-
-/datum/proc/find_references(skip_alert)
- running_find_references = type
- if(usr && usr.client)
- if(usr.client.running_find_references)
- testing("CANCELLED search for references to a [usr.client.running_find_references].")
- usr.client.running_find_references = null
- running_find_references = null
- //restart the garbage collector
- SSgarbage.can_fire = 1
- SSgarbage.next_fire = world.time + world.tick_lag
- return
-
- if(!skip_alert)
- if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
- running_find_references = null
- return
-
- //this keeps the garbage collector from failing to collect objects being searched for in here
- SSgarbage.can_fire = 0
-
- if(usr && usr.client)
- usr.client.running_find_references = type
-
- testing("Beginning search for references to a [type].")
- last_find_references = world.time
-
- DoSearchVar(GLOB) //globals
- for(var/datum/thing in world) //atoms (don't beleive it's lies)
- DoSearchVar(thing, "World -> [thing]")
-
- for (var/datum/thing) //datums
- DoSearchVar(thing, "World -> [thing]")
-
- for (var/client/thing) //clients
- DoSearchVar(thing, "World -> [thing]")
-
- testing("Completed search for references to a [type].")
- if(usr && usr.client)
- usr.client.running_find_references = null
- running_find_references = null
-
- //restart the garbage collector
- SSgarbage.can_fire = 1
- SSgarbage.next_fire = world.time + world.tick_lag
-
-/datum/verb/qdel_then_find_references()
- set category = "Debug"
- set name = "qdel() then Find References"
- set src in world
-
- qdel(src, TRUE) //Force.
- if(!running_find_references)
- find_references(TRUE)
-
-/datum/verb/qdel_then_if_fail_find_references()
- set category = "Debug"
- set name = "qdel() then Find References if GC failure"
- set src in world
-
- qdel_and_find_ref_if_fail(src, TRUE)
-
-/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64)
- if(usr && usr.client && !usr.client.running_find_references)
- return
- if (!recursive_limit)
- return
-
- if(istype(X, /datum))
- var/datum/D = X
- if(D.last_find_references == last_find_references)
- return
-
- D.last_find_references = last_find_references
- var/list/L = D.vars
-
- for(var/varname in L)
- if (varname == "vars")
- continue
- var/variable = L[varname]
-
- if(variable == src)
- testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]")
-
- else if(islist(variable))
- DoSearchVar(variable, "[Xname] -> list", recursive_limit-1)
-
- else if(islist(X))
- var/normal = IS_NORMAL_LIST(X)
- for(var/I in X)
- if (I == src)
- testing("Found [src.type] \ref[src] in list [Xname].")
-
- else if (I && !isnum(I) && normal && X[I] == src)
- testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]")
-
- else if (islist(I))
- DoSearchVar(I, "[Xname] -> list", recursive_limit-1)
-
-#ifndef FIND_REF_NO_CHECK_TICK
- CHECK_TICK
-#endif
-
-#endif
-
#ifdef TESTING
/proc/writeDatumCount()
var/list/datums = list()
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index 20eb2af001..ea0f82436c 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -114,67 +114,47 @@ SUBSYSTEM_DEF(overlays)
#define NOT_QUEUED_ALREADY (!(flags_1 & OVERLAY_QUEUED_1))
#define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src;
-/atom/proc/cut_overlays(priority = FALSE)
- LAZYINITLIST(priority_overlays)
+/atom/proc/cut_overlays()
LAZYINITLIST(remove_overlays)
LAZYINITLIST(add_overlays)
remove_overlays = overlays.Copy()
add_overlays.Cut()
- if(priority)
- priority_overlays.Cut()
-
//If not already queued for work and there are overlays to remove
if(NOT_QUEUED_ALREADY && remove_overlays.len)
QUEUE_FOR_COMPILE
-/atom/proc/cut_overlay(list/overlays, priority)
+/atom/proc/cut_overlay(list/overlays)
if(!overlays)
return
overlays = build_appearance_list(overlays)
LAZYINITLIST(add_overlays) //always initialized after this point
- LAZYINITLIST(priority_overlays)
LAZYINITLIST(remove_overlays)
var/a_len = add_overlays.len
var/r_len = remove_overlays.len
- var/p_len = priority_overlays.len
remove_overlays += overlays
add_overlays -= overlays
-
- if(priority)
- var/list/cached_priority = priority_overlays
- LAZYREMOVE(cached_priority, overlays)
-
var/fa_len = add_overlays.len
var/fr_len = remove_overlays.len
- var/fp_len = priority_overlays.len
//If not already queued and there is work to be done
- if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len || fp_len != p_len))
+ if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len))
QUEUE_FOR_COMPILE
-/atom/proc/add_overlay(list/overlays, priority = FALSE)
+/atom/proc/add_overlay(list/overlays)
if(!overlays)
return
overlays = build_appearance_list(overlays)
LAZYINITLIST(add_overlays) //always initialized after this point
- LAZYINITLIST(priority_overlays)
var/a_len = add_overlays.len
- var/p_len = priority_overlays.len
- if(priority)
- priority_overlays += overlays //or in the image. Can we use [image] = image?
- var/fp_len = priority_overlays.len
- if(NOT_QUEUED_ALREADY && fp_len != p_len)
- QUEUE_FOR_COMPILE
- else
- add_overlays += overlays
- var/fa_len = add_overlays.len
- if(NOT_QUEUED_ALREADY && fa_len != a_len)
- QUEUE_FOR_COMPILE
+ add_overlays += overlays
+ var/fa_len = add_overlays.len
+ if(NOT_QUEUED_ALREADY && fa_len != a_len)
+ QUEUE_FOR_COMPILE
/atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom
if(!other)
diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm
index a4e0d7703f..ee0fd1ea00 100644
--- a/code/controllers/subsystem/processing/instruments.dm
+++ b/code/controllers/subsystem/processing/instruments.dm
@@ -4,16 +4,26 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
init_order = INIT_ORDER_INSTRUMENTS
flags = SS_KEEP_TIMING
priority = FIRE_PRIORITY_INSTRUMENTS
- var/static/list/datum/instrument/instrument_data = list() //id = datum
+ /// List of all instrument data, associative id = datum
+ var/static/list/datum/instrument/instrument_data = list()
+ /// List of all song datums.
var/static/list/datum/song/songs = list()
+ /// Max lines in songs
var/static/musician_maxlines = 600
+ /// Max characters per line in songs
var/static/musician_maxlinechars = 300
+ /// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this.
var/static/musician_hearcheck_mindelay = 5
+ /// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels.
var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS
+ /// Current number of channels allocated for instruments
var/static/current_instrument_channels = 0
+ /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer.
+ var/static/list/synthesizer_instrument_ids
/datum/controller/subsystem/processing/instruments/Initialize()
initialize_instrument_data()
+ synthesizer_instrument_ids = get_allowed_instrument_ids()
return ..()
/datum/controller/subsystem/processing/instruments/proc/on_song_new(datum/song/S)
@@ -29,7 +39,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
continue
I = new path
I.Initialize()
- instrument_data[I.id || "[I.type]"] = I
+ if(!I.id)
+ qdel(I)
+ continue
+ instrument_data[I.id] = I
CHECK_TICK
/datum/controller/subsystem/processing/instruments/proc/get_instrument(id_or_path)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 0033df09d7..fbf7487e4d 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -157,7 +157,7 @@
/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE)
if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force))
- current_button.cut_overlays(TRUE)
+ current_button.cut_overlays()
current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state))
current_button.button_icon_state = button_icon_state
diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm
index 2a24c0b451..717e99e8b2 100644
--- a/code/datums/components/crafting/recipes/recipes_clothing.dm
+++ b/code/datums/components/crafting/recipes/recipes_clothing.dm
@@ -40,13 +40,23 @@
reqs = list(/obj/item/paper = 20)
category = CAT_CLOTHING
+/datum/crafting_recipe/balaclavabreath
+ name = "Breathaclava"
+ result = /obj/item/clothing/mask/balaclava/breath
+ time = 10
+ reqs = list(/obj/item/clothing/mask/balaclava = 1,
+ /obj/item/clothing/mask/breath = 1)
+ category = CAT_CLOTHING
+
+
+
/datum/crafting_recipe/armwraps
name = "Armwraps"
result = /obj/item/clothing/gloves/fingerless/pugilist
time = 60
tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/stack/sheet/cloth = 4,
- /obj/item/stack/sheet/durathread = 2,
+ /obj/item/stack/sticky_tape = 2,
/obj/item/stack/sheet/leather = 2)
category = CAT_CLOTHING
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index 2bfb187018..f113be728d 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -2,6 +2,15 @@
//Large Objects//
/////////////////
+/datum/crafting_recipe/plunger
+ name = "Plunger"
+ result = /obj/item/plunger
+ time = 1
+ reqs = list(/obj/item/stack/sheet/plastic = 1,
+ /obj/item/stack/sheet/mineral/wood = 1)
+ category = CAT_MISC
+ subcategory = CAT_TOOL
+
/datum/crafting_recipe/showercurtain
name = "Shower Curtains"
reqs = list(/obj/item/stack/sheet/cloth = 2,
@@ -337,7 +346,7 @@
result = /obj/item/toy/sword/cx
subcategory = CAT_MISCELLANEOUS
category = CAT_MISC
-
+
/datum/crafting_recipe/catgirlplushie
name = "Catgirl Plushie"
reqs = list(/obj/item/toy/plush/hairball = 3)
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index 51098756d3..8c4e62979b 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -119,7 +119,7 @@
UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
if(overlay)
var/atom/A = parent
- A.cut_overlay(overlay, TRUE)
+ UnregisterSignal(A,COMSIG_ATOM_UPDATE_OVERLAYS)
qdel(overlay)
return ..()
@@ -326,7 +326,8 @@
var/matrix/M = matrix()
M.Translate(pixelX, pixelY)
overlay.transform = M
- hit.add_overlay(overlay, TRUE)
+ RegisterSignal(hit,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/apply_overlay)
+ hit.update_icon()
if(harmful)
hit.visible_message("[weapon] embeds itself in [hit]!")
@@ -339,6 +340,8 @@
else
hit.visible_message("[weapon] sticks itself to [hit]!")
+/datum/component/embedded/proc/apply_overlay(atom/source, list/overlay_list)
+ overlay_list += overlay
/datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list)
if(harmful)
diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm
new file mode 100644
index 0000000000..6592e41103
--- /dev/null
+++ b/code/datums/components/plumbing/_plumbing.dm
@@ -0,0 +1,215 @@
+/datum/component/plumbing
+ ///Index with "1" = /datum/ductnet/theductpointingnorth etc. "1" being the num2text from NORTH define
+ var/list/datum/ductnet/ducts = list()
+ ///shortcut to our parents' reagent holder
+ var/datum/reagents/reagents
+ ///TRUE if we wanna add proper pipe outless under our parent object. this is pretty good if i may so so myself
+ var/use_overlays = TRUE
+ ///We can't just cut all of the parents' overlays, so we'll track them here
+ var/list/image/ducterlays
+ ///directions in wich we act as a supplier
+ var/supply_connects
+ ///direction in wich we act as a demander
+ var/demand_connects
+ ///FALSE to pretty much just not exist in the plumbing world so we can be moved, TRUE to go plumbo mode
+ var/active = FALSE
+ ///if TRUE connects will spin with the parent object visually and codually, so you can have it work in any direction. FALSE if you want it to be static
+ var/turn_connects = TRUE
+
+/datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes
+ if(parent && !istype(parent, /atom/movable))
+ return COMPONENT_INCOMPATIBLE
+ var/atom/movable/AM = parent
+ if(!AM.reagents)
+ return COMPONENT_INCOMPATIBLE
+ reagents = AM.reagents
+ turn_connects = _turn_connects
+
+ RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED), .proc/disable)
+ RegisterSignal(parent, list(COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH), .proc/toggle_active)
+
+ if(start)
+ enable()
+
+ if(use_overlays)
+ create_overlays()
+
+/datum/component/plumbing/process()
+ if(!demand_connects || !reagents)
+ STOP_PROCESSING(SSfluids, src)
+ return
+ if(reagents.total_volume < reagents.maximum_volume)
+ for(var/D in GLOB.cardinals)
+ if(D & demand_connects)
+ send_request(D)
+///Can we be added to the ductnet?
+/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir)
+ if(!active)
+ return
+ if(!dir || !D)
+ return FALSE
+ if(num2text(dir) in ducts)
+ return FALSE
+
+ return TRUE
+///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour
+/datum/component/plumbing/proc/send_request(dir)
+ process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir)
+///check who can give us what we want, and how many each of them will give us
+/datum/component/plumbing/proc/process_request(amount, reagent, dir)
+ var/list/valid_suppliers = list()
+ var/datum/ductnet/net
+ if(!ducts.Find(num2text(dir)))
+ return
+ net = ducts[num2text(dir)]
+ for(var/A in net.suppliers)
+ var/datum/component/plumbing/supplier = A
+ if(supplier.can_give(amount, reagent, net))
+ valid_suppliers += supplier
+ for(var/A in valid_suppliers)
+ var/datum/component/plumbing/give = A
+ give.transfer_to(src, amount / valid_suppliers.len, reagent, net)
+///returns TRUE when they can give the specified amount and reagent. called by process request
+/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net)
+ if(amount <= 0)
+ return
+
+ if(reagent) //only asked for one type of reagent
+ for(var/A in reagents.reagent_list)
+ var/datum/reagent/R = A
+ if(R.type == reagent)
+ return TRUE
+ else if(reagents.total_volume > 0) //take whatever
+ return TRUE
+///this is where the reagent is actually transferred and is thus the finish point of our process()
+/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
+ if(!reagents || !target || !target.reagents)
+ return FALSE
+ if(reagent)
+ reagents.trans_id_to(target.parent, reagent, amount)
+ else
+ reagents.trans_to(target.parent, amount)
+///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize()
+/datum/component/plumbing/proc/create_overlays()
+ var/atom/movable/AM = parent
+ for(var/image/I in ducterlays)
+ AM.overlays.Remove(I)
+ qdel(I)
+ ducterlays = list()
+ for(var/D in GLOB.cardinals)
+ var/color
+ var/direction
+ if(D & demand_connects)
+ color = "red" //red because red is mean and it takes
+ else if(D & supply_connects)
+ color = "blue" //blue is nice and gives
+ else
+ continue
+ var/image/I
+ if(turn_connects)
+ switch(D)
+ if(NORTH)
+ direction = "north"
+ if(SOUTH)
+ direction = "south"
+ if(EAST)
+ direction = "east"
+ if(WEST)
+ direction = "west"
+ I = image('icons/obj/plumbing/plumbers.dmi', "[direction]-[color]", layer = AM.layer - 1)
+ else
+ I = image('icons/obj/plumbing/plumbers.dmi', color, layer = AM.layer - 1) //color is not color as in the var, it's just the name
+ I.dir = D
+ AM.add_overlay(I)
+ ducterlays += I
+///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff
+/datum/component/plumbing/proc/disable()
+ if(!active)
+ return
+ STOP_PROCESSING(SSfluids, src)
+ for(var/A in ducts)
+ var/datum/ductnet/D = ducts[A]
+ D.remove_plumber(src)
+ active = FALSE
+ for(var/D in GLOB.cardinals)
+ if(D & (demand_connects | supply_connects))
+ for(var/obj/machinery/duct/duct in get_step(parent, D))
+ duct.attempt_connect()
+
+///settle wherever we are, and start behaving like a piece of plumbing
+/datum/component/plumbing/proc/enable()
+ if(active)
+ return
+ update_dir()
+ active = TRUE
+ var/atom/movable/AM = parent
+ for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self destruct if placed under a plumbing machine. machines disable when they get moved
+ if(D.anchored) //that should cover everything
+ D.disconnect_duct()
+
+ if(demand_connects)
+ START_PROCESSING(SSfluids, src)
+
+ for(var/D in GLOB.cardinals)
+ if(D & (demand_connects | supply_connects))
+ for(var/atom/movable/A in get_step(parent, D))
+ if(istype(A, /obj/machinery/duct))
+ var/obj/machinery/duct/duct = A
+ duct.attempt_connect()
+ else
+ var/datum/component/plumbing/P = A.GetComponent(/datum/component/plumbing)
+ if(P)
+ direct_connect(P, D)
+
+/// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move
+/datum/component/plumbing/proc/toggle_active(obj/O, new_state)
+ if(new_state)
+ enable()
+ else
+ disable()
+/** We update our connects only when we settle down by taking our current and original direction to find our new connects
+* If someone wants it to fucking spin while connected to something go actually knock yourself out
+*/
+/datum/component/plumbing/proc/update_dir()
+ if(!turn_connects)
+ return
+ var/atom/movable/AM = parent
+ var/new_demand_connects
+ var/new_supply_connects
+ var/new_dir = AM.dir
+ var/angle = 180 - dir2angle(new_dir)
+ if(new_dir == SOUTH)
+ demand_connects = initial(demand_connects)
+ supply_connects = initial(supply_connects)
+ else
+ for(var/D in GLOB.cardinals)
+ if(D & initial(demand_connects))
+ new_demand_connects += turn(D, angle)
+ if(D & initial(supply_connects))
+ new_supply_connects += turn(D, angle)
+ demand_connects = new_demand_connects
+ supply_connects = new_supply_connects
+///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH
+/datum/component/plumbing/proc/get_original_direction(dir)
+ var/atom/movable/AM = parent
+ return turn(dir, dir2angle(AM.dir) - 180)
+//special case in-case we want to connect directly with another machine without a duct
+/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir)
+ if(!P.active)
+ return
+ var/opposite_dir = turn(dir, 180)
+ if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands
+ var/datum/ductnet/net = new()
+ net.add_plumber(src, dir)
+ net.add_plumber(P, opposite_dir)
+
+///has one pipe input that only takes, example is manual output pipe
+/datum/component/plumbing/simple_demand
+ demand_connects = NORTH
+///has one pipe output that only supplies. example is liquid pump and manual input pipe
+/datum/component/plumbing/simple_supply
+ supply_connects = NORTH
+///input and output, like a holding tank
+/datum/component/plumbing/tank
+ demand_connects = WEST
+ supply_connects = EAST
diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm
new file mode 100644
index 0000000000..1cbe6ff017
--- /dev/null
+++ b/code/datums/components/plumbing/chemical_acclimator.dm
@@ -0,0 +1,21 @@
+/datum/component/plumbing/acclimator
+ demand_connects = WEST
+ supply_connects = EAST
+ var/obj/machinery/plumbing/acclimator/AC
+
+/datum/component/plumbing/acclimator/Initialize(start=TRUE, _turn_connects=TRUE)
+ . = ..()
+ if(!istype(parent, /obj/machinery/plumbing/acclimator))
+ return COMPONENT_INCOMPATIBLE
+ AC = parent
+
+/datum/component/plumbing/acclimator/can_give(amount, reagent)
+ . = ..()
+ if(. && AC.emptying)
+ return TRUE
+ return FALSE
+///We're overriding process and not send_request, because all process does is do the requests, so we might aswell cut out the middle man and save some code from running
+/datum/component/plumbing/acclimator/process()
+ if(AC.emptying)
+ return
+ . = ..()
diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm
new file mode 100644
index 0000000000..76b76323c5
--- /dev/null
+++ b/code/datums/components/plumbing/filter.dm
@@ -0,0 +1,59 @@
+///The magical plumbing component used by the chemical filters. The different supply connects behave differently depending on the filters set on the chemical filter
+/datum/component/plumbing/filter
+ demand_connects = NORTH
+ supply_connects = SOUTH | EAST | WEST //SOUTH is straight, EAST is left and WEST is right. We look from the perspective of the insert
+
+/datum/component/plumbing/filter/Initialize()
+ . = ..()
+ if(!istype(parent, /obj/machinery/plumbing/filter))
+ return COMPONENT_INCOMPATIBLE
+
+/datum/component/plumbing/filter/can_give(amount, reagent, datum/ductnet/net)
+ . = ..()
+ if(.)
+ var/direction
+ for(var/A in ducts)
+ if(ducts[A] == net)
+ direction = get_original_direction(text2num(A)) //we need it relative to the direction, so filters don't change when we turn the filter
+ break
+ if(!direction)
+ return FALSE
+ if(reagent)
+ if(!can_give_in_direction(direction, reagent))
+ return FALSE
+
+/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
+ if(!reagents || !target || !target.reagents)
+ return FALSE
+ var/direction
+ for(var/A in ducts)
+ if(ducts[A] == net)
+ direction = get_original_direction(text2num(A))
+ break
+ if(reagent)
+ reagents.trans_id_to(target.parent, reagent, amount)
+ else
+ for(var/A in reagents.reagent_list)
+ var/datum/reagent/R = A
+ if(!can_give_in_direction(direction, R.type))
+ continue
+ var/new_amount
+ if(R.volume < amount)
+ new_amount = amount - R.volume
+ reagents.trans_id_to(target.parent, R.type, amount)
+ amount = new_amount
+ if(amount <= 0)
+ break
+///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours
+/datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent)
+ var/obj/machinery/plumbing/filter/F = parent
+ switch(dir)
+ if(SOUTH) //straight
+ if(!F.left.Find(reagent) && !F.right.Find(reagent))
+ return TRUE
+ if(WEST) //right
+ if(F.right.Find(reagent))
+ return TRUE
+ if(EAST) //left
+ if(F.left.Find(reagent))
+ return TRUE
diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm
new file mode 100644
index 0000000000..90f4e621da
--- /dev/null
+++ b/code/datums/components/plumbing/reaction_chamber.dm
@@ -0,0 +1,38 @@
+/datum/component/plumbing/reaction_chamber
+ demand_connects = WEST
+ supply_connects = EAST
+
+/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _turn_connects=TRUE)
+ . = ..()
+ if(!istype(parent, /obj/machinery/plumbing/reaction_chamber))
+ return COMPONENT_INCOMPATIBLE
+
+/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net)
+ . = ..()
+ var/obj/machinery/plumbing/reaction_chamber/RC = parent
+ if(!. || !RC.emptying)
+ return FALSE
+
+/datum/component/plumbing/reaction_chamber/send_request(dir)
+ var/obj/machinery/plumbing/reaction_chamber/RC = parent
+ if(RC.emptying || !LAZYLEN(RC.required_reagents))
+ return
+ for(var/RT in RC.required_reagents)
+ var/has_reagent = FALSE
+ for(var/A in reagents.reagent_list)
+ var/datum/reagent/RD = A
+ if(RT == RD.type)
+ has_reagent = TRUE
+ if(RD.volume < RC.required_reagents[RT])
+ process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir)
+ return
+ if(!has_reagent)
+ process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir)
+ return
+
+ RC.reagent_flags &= ~NO_REACT
+ reagents.handle_reactions()
+
+ RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update
+ //everything for every chemical removed, wich isn't a good option either.
+ RC.on_reagent_change() //We need to check it now, because some reactions leave nothing left.
diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm
new file mode 100644
index 0000000000..7194e8803b
--- /dev/null
+++ b/code/datums/components/plumbing/splitter.dm
@@ -0,0 +1,45 @@
+/datum/component/plumbing/splitter
+ demand_connects = NORTH
+ supply_connects = SOUTH | EAST
+
+/datum/component/plumbing/splitter/Initialize()
+ . = ..()
+ if(. && !istype(parent, /obj/machinery/plumbing/splitter))
+ return FALSE
+
+/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net)
+ . = ..()
+ if(!.)
+ return
+ . = FALSE
+ var/direction
+ for(var/A in ducts)
+ if(ducts[A] == net)
+ direction = get_original_direction(text2num(A))
+ break
+ var/obj/machinery/plumbing/splitter/S = parent
+ switch(direction)
+ if(SOUTH)
+ if(S.turn_straight && S.transfer_straight <= amount)
+ S.turn_straight = FALSE
+ return TRUE
+ if(EAST)
+ if(!S.turn_straight && S.transfer_side <= amount)
+ S.turn_straight = TRUE
+ return TRUE
+
+/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
+ var/direction
+ for(var/A in ducts)
+ if(ducts[A] == net)
+ direction = get_original_direction(text2num(A))
+ break
+ var/obj/machinery/plumbing/splitter/S = parent
+ switch(direction)
+ if(SOUTH)
+ if(amount >= S.transfer_straight)
+ amount = S.transfer_straight
+ if(EAST)
+ if(amount >= S.transfer_side)
+ amount = S.transfer_side
+ . = ..()
diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm
index 2052e57f49..3cf70e80ef 100644
--- a/code/datums/components/shielded.dm
+++ b/code/datums/components/shielded.dm
@@ -14,6 +14,7 @@
var/mob/living/holder //who is currently benefiting from the shield.
var/dissipating = FALSE //Is this shield meant to dissipate over time instead of recharging.
var/del_on_overload = FALSE //will delete itself once it has no charges left.
+ var/cached_vis_overlay //text identifier of the visual overlay.
/datum/component/shielded/Initialize(current, max = 3, delay = 20 SECONDS, rate = 1, slots, state = "shield-old", broken, \
sound = 'sound/magic/charge.ogg', end_sound = 'sound/machines/ding.ogg', diss = FALSE, del_overload = FALSE)
@@ -47,9 +48,8 @@
holder = L
var/to_add = charges >= 1 ? shield_state : broken_state
if(to_add)
- var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add)
- M.layer = (L.layer > MOB_LAYER ? L.layer : MOB_LAYER) + 0.01
- holder.add_overlay(M, TRUE)
+ var/layer = (L.layer > MOB_LAYER ? L.layer : MOB_LAYER) + 0.01
+ SSvis_overlays.add_vis_overlay(L, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, L.dir)
/datum/component/shielded/UnregisterFromParent()
. = ..()
@@ -57,9 +57,9 @@
UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK,COMSIG_ITEM_CHECK_BLOCK,COMSIG_ITEM_EQUIPPED,COMSIG_ITEM_DROPPED))
if(holder)
UnregisterSignal(holder, list(COMSIG_LIVING_RUN_BLOCK, COMSIG_LIVING_GET_BLOCKING_ITEMS))
- var/to_remove = charges >= 1 ? shield_state : broken_state
- if(to_remove)
- holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE)
+ if(cached_vis_overlay)
+ SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay)
+ cached_vis_overlay = null
holder = null
/datum/component/shielded/process()
@@ -80,7 +80,7 @@
holder.visible_message("[holder]'s shield overloads!")
qdel(src)
return
- if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1))
+ if(holder && ((old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)))
update_shield_overlay(charges < 1)
/datum/component/shielded/proc/adjust_charges(amount)
@@ -93,20 +93,19 @@
holder.visible_message("[holder]'s shield overloads!")
qdel(src)
return
- if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1))
+ if(holder && ((old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)))
update_shield_overlay(charges < 1)
/datum/component/shielded/proc/update_shield_overlay(broken)
if(!holder)
return
- var/to_remove = broken ? shield_state : broken_state
var/to_add = broken ? broken_state : shield_state
- if(to_remove)
- holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE)
+ if(cached_vis_overlay)
+ SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay)
+ cached_vis_overlay = null
if(to_add)
- var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add)
- M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01
- holder.add_overlay(M, TRUE)
+ var/layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01
+ SSvis_overlays.add_vis_overlay(holder, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, holder.dir)
/datum/component/shielded/proc/on_equip(obj/item/source, mob/living/equipper, slot)
if(!(accepted_slots & slotdefine2slotbit(slot)))
@@ -117,17 +116,16 @@
RegisterSignal(equipper, COMSIG_LIVING_GET_BLOCKING_ITEMS, .proc/include_shield)
var/to_add = charges >= 1 ? shield_state : broken_state
if(to_add)
- var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add)
- M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01
- equipper.add_overlay(M, TRUE)
+ var/layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01
+ cached_vis_overlay = SSvis_overlays.add_vis_overlay(holder, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, holder.dir)
/datum/component/shielded/proc/on_drop(obj/item/source, mob/dropper)
if(holder == dropper)
UnregisterSignal(holder, COMSIG_LIVING_GET_BLOCKING_ITEMS)
UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK, COMSIG_ITEM_CHECK_BLOCK))
- var/to_remove = charges >= 1 ? shield_state : broken_state
- if(to_remove)
- holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE)
+ if(cached_vis_overlay)
+ SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay)
+ cached_vis_overlay = null
holder = null
/datum/component/shielded/proc/include_shield(mob/source, list/items)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 348f9e6778..a91549ab4c 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -31,6 +31,9 @@
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
+ #ifdef REFERENCE_TRACKING
+ VV_DROPDOWN_OPTION(VV_HK_VIEW_REFERENCES, "View References")
+ #endif
//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm
new file mode 100644
index 0000000000..14a74a67c4
--- /dev/null
+++ b/code/datums/ductnet.dm
@@ -0,0 +1,65 @@
+///We handle the unity part of plumbing. We track who is connected to who.
+/datum/ductnet
+ var/list/suppliers = list()
+ var/list/demanders = list()
+ var/list/obj/machinery/duct/ducts = list()
+
+ var/capacity
+///Add a duct to our network
+/datum/ductnet/proc/add_duct(obj/machinery/duct/D)
+ if(!D || (D in ducts))
+ return
+ ducts += D
+ D.duct = src
+///Remove a duct from our network and commit suicide, because this is probably easier than to check who that duct was connected to and what part of us was lost
+/datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting)
+ destroy_network(FALSE)
+ for(var/obj/machinery/duct/D in ducting.neighbours)
+ addtimer(CALLBACK(D, /obj/machinery/duct/proc/reconnect), 0) //all needs to happen after the original duct that was destroyed finishes destroying itself
+ addtimer(CALLBACK(D, /obj/machinery/duct/proc/generate_connects), 0)
+ qdel(src)
+///add a plumbing object to either demanders or suppliers
+/datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir)
+ if(!P.can_add(src, dir))
+ return FALSE
+ P.ducts[num2text(dir)] = src
+ if(dir & P.supply_connects)
+ suppliers += P
+ else if(dir & P.demand_connects)
+ demanders += P
+ return TRUE
+///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects
+/datum/ductnet/proc/remove_plumber(datum/component/plumbing/P)
+ suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine
+ demanders.Remove(P)
+
+ for(var/dir in P.ducts)
+ if(P.ducts[dir] == src)
+ P.ducts -= dir
+ if(!ducts.len) //there were no ducts, so it was a direct connection. we destroy ourselves since a ductnet with only one plumber and no ducts is worthless
+ destroy_network()
+///we combine ductnets. this occurs when someone connects to seperate sets of fluid ducts
+/datum/ductnet/proc/assimilate(datum/ductnet/D)
+ ducts.Add(D.ducts)
+ suppliers.Add(D.suppliers)
+ demanders.Add(D.demanders)
+ for(var/A in D.suppliers + D.demanders)
+ var/datum/component/plumbing/P = A
+ for(var/s in P.ducts)
+ if(P.ducts[s] != D)
+ continue
+ P.ducts[s] = src //all your ducts are belong to us
+ for(var/A in D.ducts)
+ var/obj/machinery/duct/M = A
+ M.duct = src //forget your old master
+
+ destroy_network()
+///destroy the network and tell all our ducts and plumbers we are gone
+/datum/ductnet/proc/destroy_network(delete=TRUE)
+ for(var/A in suppliers + demanders)
+ remove_plumber(A)
+ for(var/A in ducts)
+ var/obj/machinery/duct/D = A
+ D.duct = null
+ if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide
+ qdel(src)
diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm
index 4bd482915a..50519b08e7 100644
--- a/code/datums/elements/decal.dm
+++ b/code/datums/elements/decal.dm
@@ -33,39 +33,34 @@
if(description)
RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/examine)
- apply(A, TRUE)
-
num_decals_per_atom[A]++
+ apply(A)
/datum/element/decal/Detach(datum/target)
var/atom/A = target
- remove(A, A.dir)
- UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE))
- LAZYREMOVE(num_decals_per_atom, A)
+ num_decals_per_atom[A]--
+ apply(A, TRUE)
+ if(!num_decals_per_atom[A])
+ UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS))
+ LAZYREMOVE(num_decals_per_atom, A)
return ..()
-/datum/element/decal/proc/remove(atom/target, old_dir)
- pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(old_dir))
- for(var/i in 1 to num_decals_per_atom[target])
- target.cut_overlay(pic, TRUE)
+/datum/element/decal/proc/apply(atom/target, removing = FALSE)
+ if(num_decals_per_atom[target] == 1 && !removing)
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlay, TRUE)
+ target.update_icon()
if(isitem(target))
addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
-/datum/element/decal/proc/apply(atom/target, init = FALSE)
- pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(target.dir))
- if(init)
- target.add_overlay(pic, TRUE)
- else
- for(var/i in 1 to num_decals_per_atom[target])
- target.add_overlay(pic, TRUE)
- if(isitem(target))
- addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE)
+/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list)
+ pic.dir = first_dir == NORTH ? source.dir : turn(first_dir, dir2angle(source.dir))
+ for(var/i in 1 to num_decals_per_atom[source])
+ overlay_list += pic
-/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir)
+/datum/element/decal/proc/rotate_react(atom/source, old_dir, new_dir)
if(old_dir == new_dir)
return
- remove(source, old_dir)
- apply(source)
+ source.update_icon()
/datum/element/decal/proc/clean_react(datum/source, strength)
if(strength >= cleanable)
diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm
index 978802fd80..ad08b8ebdc 100644
--- a/code/datums/mutations/antenna.dm
+++ b/code/datums/mutations/antenna.dm
@@ -90,6 +90,8 @@
to_chat(user, "You catch some drifting memories of their past conversations...")
for(var/spoken_memory in recent_speech)
to_chat(user, "[recent_speech[spoken_memory]]")
+ if(usr in GLOB.rockpaperscissors_players)
+ to_chat(user, "They're planning on playing [GLOB.rockpaperscissors_players[usr][1]]")
if(iscarbon(M))
var/mob/living/carbon/human/H = M
to_chat(user, "You find that their intent is to [H.a_intent]...")
diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm
index 6cef7ac50f..179adf46bd 100644
--- a/code/datums/wires/airlock.dm
+++ b/code/datums/wires/airlock.dm
@@ -53,8 +53,6 @@
/datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder
- if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100))
- return FALSE
if(A.panel_open)
return TRUE
@@ -73,6 +71,8 @@
/datum/wires/airlock/on_pulse(wire)
set waitfor = FALSE
var/obj/machinery/door/airlock/A = holder
+ if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
+ return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Pulse to loose power.
A.loseMainPower()
@@ -127,6 +127,8 @@
/datum/wires/airlock/on_cut(wire, mend)
var/obj/machinery/door/airlock/A = holder
+ if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
+ return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power.
if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2))
@@ -174,4 +176,4 @@
A.update_icon()
if(WIRE_ZAP1, WIRE_ZAP2) // Ouch.
if(isliving(usr))
- A.shock(usr, 50)
\ No newline at end of file
+ A.shock(usr, 50)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 6e1692c17e..8a66394ecc 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -26,7 +26,6 @@
var/list/atom_colours //used to store the different colors on an atom
//its inherent color, the colored paint applied on it, special color effect etc...
- var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
var/list/remove_overlays // a very temporary list of overlays to remove
var/list/add_overlays // a very temporary list of overlays to add
@@ -145,7 +144,6 @@
qdel(reagents)
LAZYCLEARLIST(overlays)
- LAZYCLEARLIST(priority_overlays)
for(var/i in targeted_by)
var/mob/M = i
@@ -1128,4 +1126,4 @@
* Override this if you want custom behaviour in whatever gets hit by the rust
*/
/atom/proc/rust_heretic_act()
- return
+ return
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 0238529195..0a6c2b9eca 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -646,3 +646,10 @@
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
sleep(1)
animate(I, alpha = 0, transform = matrix(), time = 1)
+
+/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran
+ SHOULD_CALL_PARENT(TRUE)
+ if(anchored == anchorvalue)
+ return
+ . = anchored
+ anchored = anchorvalue
diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
index 561b38fde1..148de9568a 100644
--- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm
+++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
@@ -50,10 +50,6 @@ Property weights are:
for(var/r in SSevents.running)
var/datum/round_event/R = r
threat += R.threat()
- for(var/mob/living/simple_animal/hostile/H in GLOB.mob_living_list)
- var/turf/T = get_turf(H)
- if(H.stat != DEAD && is_station_level(T.z) && !("Station" in H.faction))
- threat += H.threat()
for(var/obj/item/phylactery/P in GLOB.poi_list)
threat += 25 // can't be giving them too much of a break
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
@@ -91,6 +87,8 @@ Property weights are:
mean += 2.5
if(CHAOS_MAX)
mean += 5
+ else
+ voters += 0.5
if(voters)
GLOB.dynamic_curve_centre += (mean/voters)
if(flags & USE_PREV_ROUND_WEIGHTS)
@@ -128,7 +126,8 @@ Property weights are:
for(var/property in property_weights)
if(property in rule.property_weights) // just treat it as 0 if it's not in there
property_weight += rule.property_weights[property] * property_weights[property]
- drafted_rules[rule] = (rule.get_weight() * property_weight)*rule.weight_mult
+ if(property_weight > 0)
+ drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult
return drafted_rules
/datum/dynamic_storyteller/proc/midround_draft()
@@ -140,25 +139,26 @@ Property weights are:
if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)))
continue
rule.trim_candidates()
- var/threat_weight = 1
- if(!(rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway
- var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
- /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to
- pick this particular ruleset.
- Let's use a toy example: there's 60 threat level and 10 threat spent.
- We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets.
- Ruleset 1 has 30 cost, ruleset 2 has 5 cost.
- When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1
- is 2.26 times as likely to be picked, all other things considered.
- Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
- */
- threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
- if(property in rule.property_weights)
+ if(property in rule.property_weights) // just treat it as 0 if it's not in there
property_weight += rule.property_weights[property] * property_weights[property]
- drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1)
+ if(property_weight > 0)
+ var/threat_weight = 1
+ if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway
+ var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
+ /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to
+ pick this particular ruleset.
+ Let's use a toy example: there's 60 threat level and 10 threat spent.
+ We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets.
+ Ruleset 1 has 30 cost, ruleset 2 has 5 cost.
+ When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1
+ is 2.26 times as likely to be picked, all other things considered.
+ Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight.
+ */
+ threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
+ drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight
return drafted_rules
/datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer)
@@ -175,28 +175,29 @@ Property weights are:
rule.candidates = list(newPlayer)
rule.trim_candidates()
- var/threat_weight = 1
- if(!(rule.flags & MINOR_RULESET))
- var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
- threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights)
property_weight += rule.property_weights[property] * property_weights[property]
- drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1)
+ if(property_weight > 0)
+ var/threat_weight = 1
+ if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))
+ var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat))
+ threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0)))
+ drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight
return drafted_rules
/datum/dynamic_storyteller/proc/event_draft()
var/list/drafted_rules = list()
for(var/datum/dynamic_ruleset/event/rule in mode.events)
- if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level - mode.threat) >= rule.cost)
- if(rule.ready())
- var/property_weight = 0
- for(var/property in property_weights)
- if(property in rule.property_weights)
- property_weight += rule.property_weights[property] * property_weights[property]
- drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult
+ if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level + 20 - mode.threat) >= rule.cost && rule.ready())
+ var/property_weight = 0
+ for(var/property in property_weights)
+ if(property in rule.property_weights)
+ property_weight += rule.property_weights[property] * property_weights[property]
+ if(property_weight > 0)
+ drafted_rules[rule] = rule.get_weight() + property_weight * rule.weight_mult
return drafted_rules
@@ -313,9 +314,8 @@ Property weights are:
/datum/dynamic_storyteller/random/event_draft()
var/list/drafted_rules = list()
for(var/datum/dynamic_ruleset/event/rule in mode.events)
- if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
- if(rule.ready())
- drafted_rules[rule] = 1
+ if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && rule.ready())
+ drafted_rules[rule] = 1
return drafted_rules
/datum/dynamic_storyteller/story
@@ -330,7 +330,7 @@ Property weights are:
/datum/dynamic_storyteller/story/calculate_threat()
var/current_time = (world.time / SSautotransfer.targettime)*180
- mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.25),0.1)
+ mode.threat_level = round((mode.initial_threat_level*(sin(current_time)/2)+0.75),0.1)
return ..()
/datum/dynamic_storyteller/classic
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index bd4ac5f2d1..2b7411d03f 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -117,6 +117,7 @@ Class Procs:
var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine.
var/speed_process = FALSE // Process as fast as possible?
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
+ var/wire_compatible = FALSE
// For storing and overriding ui id and dimensions
var/tgui_id // ID of TGUI interface
var/ui_style // ID of custom TGUI style (optional)
@@ -433,6 +434,7 @@ Class Procs:
to_chat(user, "You [anchored ? "un" : ""]secure [src].")
setAnchored(!anchored)
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+ SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored)
return SUCCESSFUL_UNFASTEN
return FAILED_UNFASTEN
return CANT_UNFASTEN
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index bf71786a05..ff6f96a29f 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -3,13 +3,14 @@
/obj/machinery/iv_drip
name = "\improper IV drip"
- desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate."
+ desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. Alt-Click to change the transfer rate."
icon = 'icons/obj/iv_drip.dmi'
icon_state = "iv_drip"
anchored = FALSE
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/mob/living/carbon/attached
var/mode = IV_INJECTING
+ var/dripfeed = FALSE
var/obj/item/reagent_containers/beaker
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
@@ -132,9 +133,11 @@
if(mode)
if(beaker.reagents.total_volume)
var/transfer_amount = 5
+ if (dripfeed)
+ transfer_amount = 1
if(istype(beaker, /obj/item/reagent_containers/blood))
// speed up transfer on blood packs
- transfer_amount = 10
+ transfer_amount *= 2
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
@@ -169,6 +172,16 @@
else
toggle_mode()
+/obj/machinery/iv_drip/AltClick(mob/living/user)
+ if(!user.canUseTopic(src, be_close=TRUE))
+ return
+ if(dripfeed)
+ dripfeed = FALSE
+ to_chat(usr, "You loosen the valve to speed up the [src].")
+ else
+ dripfeed = TRUE
+ to_chat(usr, "You tighten the valve to slowly drip-feed the contents of [src].")
+
/obj/machinery/iv_drip/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
@@ -227,7 +240,7 @@
/obj/machinery/iv_drip/telescopic
name = "telescopic IV drip"
- desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down."
+ desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down.Alt-Click with a beaker attached to change the transfer rate."
icon_state = "iv_drip"
/obj/machinery/iv_drip/telescopic/update_icon_state()
diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm
index 19b0dc76dd..a388d3bc67 100644
--- a/code/game/objects/effects/effect_system/effects_sparks.dm
+++ b/code/game/objects/effects/effect_system/effects_sparks.dm
@@ -63,3 +63,23 @@
/datum/effect_system/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
+
+//fake sparks, not subtyped because we don't want light/heat, nor checks inside an often used proc for a rare subcase for saving like 10 lines of code
+/obj/effect/particle_effect/fake_sparks
+ name = "lightning"
+ icon_state = "electricity"
+
+/obj/effect/particle_effect/fake_sparks/Initialize()
+ . = ..()
+ flick(icon_state, src) // replay the animation
+ playsound(src, "sparks", 100, TRUE)
+ QDEL_IN(src, 20)
+
+/datum/effect_system/fake_spark_spread
+ effect_type = /obj/effect/particle_effect/fake_sparks
+
+/proc/do_fake_sparks(n, c, source)
+ var/datum/effect_system/fake_spark_spread/sparks = new
+ sparks.set_up(n, c, source)
+ sparks.autocleanup = TRUE
+ sparks.start()
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 2fbb45173b..c89e318714 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -135,6 +135,14 @@ RLD
flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light
return .
+
+/obj/item/construction/proc/check_menu(mob/living/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ return TRUE
+
/obj/item/construction/proc/range_check(atom/A, mob/user)
if(!(A in range(custom_range, get_turf(user))))
to_chat(user, "The \'Out of Range\' light on [src] blinks red.")
@@ -276,13 +284,6 @@ RLD
//Not scaling these down to button size because they look horrible then, instead just bumping up radius.
return MA
-/obj/item/construction/rcd/proc/check_menu(mob/living/user)
- if(!istype(user))
- return FALSE
- if(user.incapacitated() || !user.Adjacent(src))
- return FALSE
- return TRUE
-
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
if(!user)
return
@@ -856,6 +857,82 @@ RLD
desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS
+/obj/item/construction/plumbing
+ name = "Plumbing Constructor"
+ desc = "An expertly modified RCD outfitted to construct plumbing machinery. Reload with compressed matter cartridges."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "arcd"
+ item_state = "oldrcd"
+ has_ammobar = FALSE
+ matter = 200
+ max_matter = 200
+
+ ///type of the plumbing machine
+ var/blueprint = null
+ ///index, used in the attack self to get the type. stored here since it doesnt change
+ var/list/choices = list()
+ ///index, used in the attack self to get the type. stored here since it doesnt change
+ var/list/name_to_type = list()
+ ///
+ var/list/machinery_data = list("cost" = list(), "delay" = list())
+
+/obj/item/construction/plumbing/attack_self(mob/user)
+ ..()
+ if(!choices.len)
+ for(var/A in subtypesof(/obj/machinery/plumbing))
+ var/obj/machinery/plumbing/M = A
+ if(initial(M.rcd_constructable))
+ choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state)))
+ name_to_type[initial(M.name)] = M
+ machinery_data["cost"][A] = initial(M.rcd_cost)
+ machinery_data["delay"][A] = initial(M.rcd_delay)
+
+ var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ if(!check_menu(user))
+ return
+
+ blueprint = name_to_type[choice]
+ playsound(src, 'sound/effects/pop.ogg', 50, FALSE)
+ to_chat(user, "You change [name]s blueprint to '[choice]'.")
+
+///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type
+/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user)
+ if(!machinery_data || !isopenturf(A))
+ return FALSE
+
+ if(checkResource(machinery_data["cost"][blueprint], user) && blueprint)
+ if(do_after(user, machinery_data["delay"][blueprint], target = A))
+ if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(A))
+ useResource(machinery_data["cost"][blueprint], user)
+ activate()
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ new blueprint (A, FALSE, FALSE)
+ return TRUE
+
+/obj/item/construction/plumbing/proc/canPlace(turf/T)
+ if(!isopenturf(T))
+ return FALSE
+ . = TRUE
+ for(var/obj/O in T.contents)
+ if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion
+ return FALSE
+
+/obj/item/construction/plumbing/afterattack(atom/A, mob/user)
+ . = ..()
+ if(!range_check(A, user))
+ return
+ if(istype(A, /obj/machinery/plumbing))
+ var/obj/machinery/plumbing/P = A
+ if(P.anchored)
+ to_chat(user, "The [P.name] needs to be unanchored!")
+ return
+ if(do_after(user, 20, target = P))
+ P.deconstruct() //Let's not substract matter
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect
+ else
+ create_machine(A, user)
+
+
#undef GLOW_MODE
#undef LIGHT_MODE
#undef REMOVE_MODE
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index b3d5ed431a..70e4441c66 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -6,6 +6,7 @@ RPD
#define ATMOS_CATEGORY 0
#define DISPOSALS_CATEGORY 1
#define TRANSIT_CATEGORY 2
+#define PLUMBING_CATEGORY 3
#define BUILD_MODE (1<<0)
#define WRENCH_MODE (1<<1)
@@ -75,6 +76,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
)
))
+GLOBAL_LIST_INIT(fluid_duct_recipes, list(
+ "Fluid Ducts" = list(
+ new /datum/pipe_info/plumbing("Duct", /obj/machinery/duct, PIPE_ONEDIR),
+ new /datum/pipe_info/plumbing/multilayer("Duct Layer-Manifold",/obj/machinery/duct/multilayered, PIPE_STRAIGHT)
+ )
+))
+
/datum/pipe_info
var/name
var/icon_state
@@ -175,6 +183,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
if(dt == PIPE_UNARY_FLIPPABLE)
icon_state = "[icon_state]_preview"
+/datum/pipe_info/plumbing/New(label, obj/path, dt=PIPE_UNARY)
+ name = label
+ id = path
+ icon_state = initial(path.icon_state)
+ dirtype = dt
+
+/datum/pipe_info/plumbing/multilayer //exists as identifier so we can see the difference between multi_layer and just ducts properly later on
+
+
/obj/item/pipe_dispenser
name = "Rapid Piping Device (RPD)"
desc = "A device used to rapidly pipe things."
@@ -200,15 +217,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/atmos_build_speed = 5 //deciseconds (500ms)
var/disposal_build_speed = 5
var/transit_build_speed = 5
+ var/plumbing_build_speed = 5
var/destroy_speed = 5
var/paint_speed = 5
var/category = ATMOS_CATEGORY
var/piping_layer = PIPING_LAYER_DEFAULT
+ var/ducting_layer = DUCT_LAYER_DEFAULT
var/datum/pipe_info/recipe
var/static/datum/pipe_info/first_atmos
var/static/datum/pipe_info/first_disposal
var/static/datum/pipe_info/first_transit
var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE
+ var/static/datum/pipe_info/first_plumbing
+ var/locked = FALSE //wheter we can change categories. Useful for the plumber
/obj/item/pipe_dispenser/New()
. = ..()
@@ -253,12 +274,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/list/data = list(
"category" = category,
"piping_layer" = piping_layer,
- // "ducting_layer" = ducting_layer, //uhh is this for chem thing?
+
+ "ducting_layer" = ducting_layer,
+
"preview_rows" = recipe.get_preview(p_dir),
"categories" = list(),
"selected_color" = paint_color,
"paint_colors" = GLOB.pipe_paint_colors,
- "mode" = mode
+ "mode" = mode,
+ "locked" = locked
)
var/list/recipes
@@ -269,6 +293,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
recipes = GLOB.disposal_pipe_recipes
if(TRANSIT_CATEGORY)
recipes = GLOB.transit_tube_recipes
+ if(PLUMBING_CATEGORY)
+ recipes = GLOB.fluid_duct_recipes
for(var/c in recipes)
var/list/cat = recipes[c]
var/list/r = list()
@@ -297,6 +323,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
recipe = first_atmos
if(TRANSIT_CATEGORY)
recipe = first_transit
+ if(PLUMBING_CATEGORY)
+ recipe = first_plumbing
p_dir = NORTH
playeffect = FALSE
if("piping_layer")
@@ -468,16 +496,56 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
if(mode & WRENCH_MODE)
tube.wrench_act(user, src)
return
-
+ if(PLUMBING_CATEGORY) //Plumbing.
+ if(!can_make_pipe)
+ return ..()
+ A = get_turf(A)
+ if(isclosedturf(A))
+ to_chat(user, "[src]'s error light flickers; there's something in the way!")
+ return
+ to_chat(user, "You start building a fluid duct...")
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, plumbing_build_speed, target = A))
+ var/obj/machinery/duct/D
+ if(recipe.type == /datum/pipe_info/plumbing/multilayer)
+ var/temp_connects = NORTH + SOUTH
+ if(queued_p_dir == EAST)
+ temp_connects = EAST + WEST
+ D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer, temp_connects)
+ else
+ D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer)
+ D.add_fingerprint(usr)
+ if(mode & WRENCH_MODE)
+ D.wrench_act(user, src)
else
return ..()
/obj/item/pipe_dispenser/proc/activate()
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
+/* unneeded, you can craft ducts from plastic
+/obj/item/pipe_dispenser/plumbing
+ name = "Plumberinator"
+ desc = "A crude device to rapidly plumb things."
+ icon_state = "plumberer"
+ category = PLUMBING_CATEGORY
+ locked = TRUE
+
+/obj/item/pipe_dispenser/plumbing/Initialize()
+ . = ..()
+ spark_system = new
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ if(!first_plumbing)
+ first_plumbing = GLOB.fluid_duct_recipes[GLOB.fluid_duct_recipes[1]][1]
+
+ recipe = first_plumbing
+
+*/
#undef ATMOS_CATEGORY
#undef DISPOSALS_CATEGORY
#undef TRANSIT_CATEGORY
+#undef PLUMBING_CATEGORY
#undef BUILD_MODE
#undef DESTROY_MODE
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 56eb25f953..37d19783b5 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -48,6 +48,13 @@
/obj/item/stack/cable_coil = 5,
/obj/item/stack/sheet/glass = 1)
+/obj/item/circuitboard/machine/medipen_refiller
+ name = "Medipen Refiller (Machine Board)"
+ icon_state = "medical"
+ build_path = /obj/machinery/medipen_refiller
+ req_components = list(
+ /obj/item/stock_parts/matter_bin = 1)
+
/obj/item/circuitboard/machine/clonepod
name = "Clone Pod (Machine Board)"
build_path = /obj/machinery/clonepod
@@ -512,6 +519,10 @@
/obj/item/stack/sheet/glass = 1)
needs_anchored = FALSE
+/obj/item/circuitboard/machine/hydroponics/automagic
+ name = "Automatic Hydroponics Tray (Machine Board)"
+ build_path = /obj/machinery/hydroponics/constructable/automagic
+
/obj/item/circuitboard/machine/seed_extractor
name = "Seed Extractor (Machine Board)"
build_path = /obj/machinery/seed_extractor
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index a2b0e3edd4..014487332c 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -60,7 +60,8 @@
if(target)
if(!QDELETED(target))
location = get_turf(target)
- target.cut_overlay(plastic_overlay, TRUE)
+ target.cut_overlay(plastic_overlay)
+ UnregisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_plastic_overlay)
if(!ismob(target) || full_damage_on_mobs)
target.ex_act(EXPLODE_HEAVY, target)
else
@@ -126,13 +127,17 @@
I.embedding["embed_chance"] = 0
I.updateEmbedding()
- target.add_overlay(plastic_overlay, TRUE)
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_plastic_overlay)
+ target.update_icon()
if(!nadeassembly)
to_chat(user, "You plant the bomb. Timer counting down from [det_time].")
addtimer(CALLBACK(src, .proc/prime), det_time*10)
else
qdel(src) //How?
+/obj/item/grenade/plastic/proc/add_plastic_overlay(atom/source, list/overlay_list)
+ overlay_list += plastic_overlay
+
/obj/item/grenade/plastic/proc/shout_syndicate_crap(mob/M)
if(!M)
return
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index a7f7e3152c..6f1aec287b 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -47,8 +47,11 @@
spawn_option(stored_options[choice],M)
qdel(src)
-/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
- var/obj/new_item = new choice()
+/obj/item/choice_beacon/proc/create_choice_atom(atom/choice, mob/owner)
+ return new choice()
+
+/obj/item/choice_beacon/proc/spawn_option(atom/choice,mob/living/M)
+ var/obj/new_item = create_choice_atom(choice, M)
var/obj/structure/closet/supplypod/bluespacepod/pod = new()
pod.explosionSize = list(0,0,0,0)
new_item.forceMove(pod)
@@ -152,10 +155,50 @@
augment_list[initial(A.name)] = A
return augment_list
-/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
+/obj/item/choice_beacon/augments/spawn_option(atom/choice,mob/living/M)
new choice(get_turf(M))
to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")
+/obj/item/choice_beacon/pet //donator beacon that summons a small friendly animal
+ name = "pet beacon"
+ desc = "Straight from the outerspace pet shop to your feet."
+ var/static/list/pets = list("Crab" = /mob/living/simple_animal/crab,
+ "Cat" = /mob/living/simple_animal/pet/cat,
+ "Space cat" = /mob/living/simple_animal/pet/cat/space,
+ "Kitten" = /mob/living/simple_animal/pet/cat/kitten,
+ "Dog" = /mob/living/simple_animal/pet/dog,
+ "Corgi" = /mob/living/simple_animal/pet/dog/corgi,
+ "Pug" = /mob/living/simple_animal/pet/dog/pug,
+ "Exotic Corgi" = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi,
+ "Fox" = /mob/living/simple_animal/pet/fox,
+ "Red Panda" = /mob/living/simple_animal/pet/redpanda,
+ "Possum" = /mob/living/simple_animal/opossum)
+ var/pet_name
+
+/obj/item/choice_beacon/pet/generate_display_names()
+ return pets
+
+/obj/item/choice_beacon/pet/create_choice_atom(atom/choice, mob/owner)
+ var/mob/living/simple_animal/new_choice = new choice()
+ new_choice.butcher_results = null //please don't eat your pet, chef
+ var/obj/item/pet_carrier/donator/carrier = new() //a donator pet carrier is just a carrier that can't be shoved in an autolathe for metal
+ carrier.add_occupant(new_choice)
+ new_choice.mob_size = MOB_SIZE_TINY //yeah we're not letting you use this roundstart pet to hurt people / knock them down
+ new_choice.pass_flags = PASSTABLE | PASSMOB //your pet is not a bullet/person shield
+ new_choice.density = FALSE
+ new_choice.blood_volume = 0 //your pet cannot be used to drain blood from for a bloodsucker
+ new_choice.desc = "A pet [initial(choice.name)], owned by [owner]!"
+ new_choice.can_have_ai = FALSE //no it cant be sentient damnit
+ if(pet_name)
+ new_choice.name = pet_name
+ new_choice.unique_name = TRUE
+ return carrier
+
+/obj/item/choice_beacon/pet/spawn_option(atom/choice,mob/living/M)
+ pet_name = input(M, "What would you like to name the pet? (leave blank for default name)", "Pet Name")
+ ..()
+
+//choice boxes (they just open in your hand instead of making a pod)
/obj/item/choice_beacon/box
name = "choice box (default)"
desc = "Think really hard about what you want, and then rip it open!"
@@ -163,21 +206,17 @@
icon_state = "deliverypackage3"
item_state = "deliverypackage3"
-/obj/item/choice_beacon/box/spawn_option(obj/choice,mob/living/M)
- to_chat(M, "The box opens, revealing the [choice]!")
+/obj/item/choice_beacon/box/spawn_option(atom/choice,mob/living/M)
+ var/choice_text = choice
+ if(ispath(choice_text))
+ choice_text = initial(choice.name)
+ to_chat(M, "The box opens, revealing the [choice_text]!")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
M.temporarilyRemoveItemFromInventory(src, TRUE)
M.put_in_hands(new choice)
qdel(src)
-/obj/item/choice_beacon/box/plushie
- name = "choice box (plushie)"
- desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
- icon = 'icons/obj/plushes.dmi'
- icon_state = "box"
- item_state = "box"
-
-/obj/item/choice_beacon/box/spawn_option(choice,mob/living/M)
+/obj/item/choice_beacon/box/plushie/spawn_option(choice,mob/living/M)
if(ispath(choice, /obj/item/toy/plush))
..() //regular plush, spawn it naturally
else
@@ -188,6 +227,31 @@
M.put_in_hands(new choice)
qdel(src)
+/obj/item/choice_beacon/box/carpet //donator carpet beacon
+ name = "choice box (carpet)"
+ desc = "Contains 50 of a selected carpet inside!"
+ var/static/list/carpet_list = list(/obj/item/stack/tile/carpet/black/fifty = "Black Carpet",
+ "Black & Red Carpet" = /obj/item/stack/tile/carpet/blackred/fifty,
+ "Monochrome Carpet" = /obj/item/stack/tile/carpet/monochrome/fifty,
+ "Blue Carpet" = /obj/item/stack/tile/carpet/blue/fifty,
+ "Cyan Carpet" = /obj/item/stack/tile/carpet/cyan/fifty,
+ "Green Carpet" = /obj/item/stack/tile/carpet/green/fifty,
+ "Orange Carpet" = /obj/item/stack/tile/carpet/orange/fifty,
+ "Purple Carpet" = /obj/item/stack/tile/carpet/purple/fifty,
+ "Red Carpet" = /obj/item/stack/tile/carpet/red/fifty,
+ "Royal Black Carpet" = /obj/item/stack/tile/carpet/royalblack/fifty,
+ "Royal Blue Carpet" = /obj/item/stack/tile/carpet/royalblue/fifty)
+
+/obj/item/choice_beacon/box/carpet/generate_display_names()
+ return carpet_list
+
+/obj/item/choice_beacon/box/plushie
+ name = "choice box (plushie)"
+ desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "box"
+ item_state = "box"
+
/obj/item/choice_beacon/box/plushie/generate_display_names()
var/list/plushie_list = list()
//plushie set 1: just subtypes of /obj/item/toy/plush
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index a4b12dd629..ef2fb44d3d 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -29,6 +29,9 @@
var/has_lock_sprites = TRUE //whether to load the lock overlays or not
var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
+/obj/item/pet_carrier/donator
+ custom_materials = null //you cant just use the loadout item to get free metal!
+
/obj/item/pet_carrier/Destroy()
if(occupants.len)
for(var/V in occupants)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 9ea8c9c689..7ba2196184 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -128,6 +128,7 @@
absorption_capacity = 5
splint_factor = 0.35
custom_price = PRICE_REALLY_CHEAP
+ grind_results = list(/datum/reagent/cellulose = 2)
// gauze is only relevant for wounds, which are handled in the wounds themselves
/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 305c2ab276..645051b7c2 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -412,6 +412,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cloth
+ grind_results = list(/datum/reagent/cellulose = 2)
/obj/item/stack/sheet/cloth/get_main_recipes()
. = ..()
@@ -773,6 +774,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \
new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
@@ -841,6 +843,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
merge_type = /obj/item/stack/sheet/cotton
var/pull_effort = 30
var/loom_result = /obj/item/stack/sheet/cloth
+ grind_results = list(/datum/reagent/cellulose = 5)
/obj/item/stack/sheet/cotton/ten
amount = 10
@@ -856,6 +859,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
merge_type = /obj/item/stack/sheet/cotton/durathread
pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
+ grind_results = list(/datum/reagent/cellulose = 10)
/obj/item/stack/sheet/meat
name = "meat sheets"
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 3c554aa58e..0001494fdd 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -478,7 +478,7 @@
/obj/item/assembly/signaler,
/obj/item/lightreplacer,
/obj/item/rcd_ammo,
- /obj/item/construction/rcd,
+ /obj/item/construction,
/obj/item/pipe_dispenser,
/obj/item/stack/rods,
/obj/item/stack/tile/plasteel,
@@ -492,7 +492,7 @@
icon_state = "grenadebeltnew"
item_state = "security"
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
-
+
/obj/item/storage/belt/grenade/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index a6b34c59e3..73246276c2 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -281,6 +281,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/clothing/suit/armor/vest/infiltrator,
/obj/item/clothing/under/syndicate/bloodred,
/obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
+ /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator,
/obj/item/clothing/mask/infiltrator,
/obj/item/clothing/shoes/combat/sneakboots,
/obj/item/gun/ballistic/automatic/pistol,
@@ -292,7 +293,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/clothing/head/helmet/infiltrator(src)
new /obj/item/clothing/suit/armor/vest/infiltrator(src)
new /obj/item/clothing/under/syndicate/bloodred(src)
- new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src)
+ new /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator(src)
new /obj/item/clothing/mask/infiltrator(src)
new /obj/item/clothing/shoes/combat/sneakboots(src)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index b5f8612244..653e95c21e 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -252,6 +252,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/timestop
name = "temporal katana"
desc = "Delicately balanced, this finely-crafted blade hums with barely-restrained potential."
+ icon_state = "temporalkatana"
+ item_state = "temporalkatana"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
block_chance = 0 // oops
force = 27.5 // oops
item_flags = ITEM_CAN_PARRY
@@ -263,6 +267,21 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
flynn.emote("smirk")
new /obj/effect/timestop/magic(get_turf(owner), 1, 50, list(owner)) // null roddies counter
+/obj/item/katana/timestop/suicide_act(mob/living/user) // stolen from hierophant staff
+ new /obj/effect/timestop/magic(get_turf(user), 1, 50, list(user)) // free usage for dying
+ user.visible_message("[user] poses menacingly with the [src]! It looks like [user.p_theyre()] trying to teleport behind someone!")
+ user.say("Heh.. Nothing personnel, kid..", forced = "temporal katana suicide")
+ sleep(20)
+ if(!user)
+ return
+ user.visible_message("[user] vanishes into a cloud of falling dust and burning embers, likely off to style on some poor sod in the distance!")
+ playsound(user,'sound/magic/blink.ogg', 75, TRUE)
+ for(var/obj/item/I in user)
+ if(I != src)
+ user.dropItemToGround(I)
+ user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff
+ qdel(user)
+
/obj/item/melee/bokken // parrying stick
name = "bokken"
desc = "A space-Japanese training sword made of wood and shaped like a katana."
@@ -272,7 +291,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
- force = 9
+ force = 7 //how much harm mode damage we do
+ var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode
throwforce = 10
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
@@ -323,17 +343,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/bokken/Initialize()
. = ..()
AddElement(/datum/element/sword_point)
+ if(!harm) //if initialised in non-harm mode, setup force accordingly
+ force = force + stamina_damage_increment
/obj/item/melee/bokken/attack_self(mob/user)
harm = !harm
if(harm)
- force -= 2
+ force -= stamina_damage_increment
damtype = BRUTE
attack_verb = list("bashed", "smashed", "attacked")
bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked
wound_bonus = 0
else
- force += 2
+ force += stamina_damage_increment
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
bare_wound_bonus = 0
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 14017ffb2d..f5003e035b 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -186,7 +186,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
if(!acid_level)
SSacid.processing[src] = src
- add_overlay(GLOB.acid_overlay, TRUE)
+ update_icon()
var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids.
if(acid_level < acid_cap)
acid_level = min(acid_level + acidpwr * acid_volume, acid_cap)
@@ -224,7 +224,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE))
resistance_flags |= ON_FIRE
SSfire_burning.processing[src] = src
- add_overlay(GLOB.fire_overlay, TRUE)
+ update_icon()
return 1
//called when the obj is destroyed by fire
@@ -236,7 +236,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
/obj/proc/extinguish()
if(resistance_flags & ON_FIRE)
resistance_flags &= ~ON_FIRE
- cut_overlay(GLOB.fire_overlay, TRUE)
+ update_icon()
SSfire_burning.processing -= src
/obj/zap_act(power, zap_flags, shocked_targets)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 79dd13b0ae..99b302e9ce 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -317,6 +317,13 @@
icon_state = unique_reskin[choice]
to_chat(M, "[src] is now skinned as '[choice]'.")
+/obj/update_overlays()
+ . = ..()
+ if(acid_level)
+ . += GLOB.acid_overlay
+ if(resistance_flags & ON_FIRE)
+ . += GLOB.fire_overlay
+
//Called when the object is constructed by an autolathe
//Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes
/obj/proc/autolathe_crafted(obj/machinery/autolathe/A)
@@ -329,3 +336,6 @@
. = ..()
if(. && ricochet_damage_mod)
take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet
+
+/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+ return
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 45cac650b8..c36fba96cb 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -243,10 +243,24 @@ LINEN BINS
/obj/item/bedsheet/random/Initialize()
..()
- var/type = pick(typesof(/obj/item/bedsheet) - /obj/item/bedsheet/random)
+ var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon))
new type(loc)
return INITIALIZE_HINT_QDEL
+/obj/item/bedsheet/chameleon //donator chameleon bedsheet
+ name = "chameleon bedsheet"
+ desc = "Bedsheet technology has truly gone too far."
+ var/datum/action/item_action/chameleon/change/chameleon_action
+
+/obj/item/bedsheet/chameleon/New()
+ ..()
+ chameleon_action = new(src)
+ chameleon_action.chameleon_type = /obj/item/bedsheet
+ chameleon_action.chameleon_name = "Bedsheet"
+ chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE)
+ chameleon_action.initialize_disguises()
+
+//bedsheet bin
/obj/structure/bedsheetbin
name = "linen bin"
desc = "It looks rather cosy."
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 36e4f825da..7853b9619c 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -86,6 +86,10 @@
/obj/structure/grille/attack_animal(mob/user)
. = ..()
+ if(!user.CheckActionCooldown(CLICK_CD_MELEE))
+ return
+ user.DelayNextAction(flush = TRUE)
+ user.do_attack_animation(src)
if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille)
take_damage(rand(5,10), BRUTE, "melee", 1)
@@ -114,12 +118,12 @@
/obj/structure/grille/attack_alien(mob/living/user)
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
+ user.DelayNextAction(flush = TRUE)
user.do_attack_animation(src)
user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE)
if(!shock(user, 70))
take_damage(20, BRUTE, "melee", 1)
-
/obj/structure/grille/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGRILLE))
return TRUE
diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm
index 4f6256e9c4..263b47aab2 100644
--- a/code/game/objects/structures/lavaland/geyser.dm
+++ b/code/game/objects/structures/lavaland/geyser.dm
@@ -9,7 +9,7 @@
var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
var/activated = FALSE //whether we are active and generating chems
- var/reagent_id = /datum/reagent/fuel/oil
+ var/reagent_id = /datum/reagent/oil
var/potency = 2 //how much reagents we add every process (2 seconds)
var/max_volume = 500
var/start_volume = 50
@@ -77,10 +77,10 @@
/obj/item/plunger/reinforced
name = "reinforced plunger"
- desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging."
+ desc = "It's an M. 7 Reinforced Plunger� for heavy duty plunging."
icon_state = "reinforced_plunger"
reinforced = TRUE
plunge_mod = 0.8
- custom_premium_price = 1200
+ custom_premium_price = 600
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index 1fbeee7523..6e7dbaf904 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -149,6 +149,8 @@
var/list/megafauna_spawn_list
/// Flora that can spawn in the tunnel, weighted list
var/list/flora_spawn_list
+ //terrain to spawn weighted list
+ var/list/terrain_spawn_list
/// Turf type to choose when spawning in tunnel at 1% chance, weighted list
var/list/choose_turf_type
/// if the tunnel should keep being created
@@ -230,7 +232,8 @@
megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM)
if (!flora_spawn_list)
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
-
+ if(!terrain_spawn_list)
+ terrain_spawn_list = list(/obj/structure/geyser/random = 1)
. = ..()
if(!has_data)
produce_tunnel_from_data()
@@ -334,8 +337,19 @@
spawned_flora = SpawnFlora(T)
if(!spawned_flora) // no rocks beneath mob spawners / mobs.
SpawnMonster(T)
+ SpawnTerrain(T)
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
+/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T)
+ if(prob(1))
+ if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
+ return
+ var/randumb = pickweight(terrain_spawn_list)
+ for(var/obj/structure/geyser/F in range(7, T))
+ if(istype(F, randumb))
+ return
+ new randumb(T)
+
/// Spawns a random mob or megafauna in the tunnel
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(!isarea(loc))
diff --git a/code/game/world.dm b/code/game/world.dm
index 55333fb3e6..a342200b3d 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -12,6 +12,9 @@ GLOBAL_LIST(topic_status_cache)
if (fexists(EXTOOLS))
call(EXTOOLS, "maptick_initialize")()
enable_debugger()
+#ifdef REFERENCE_TRACKING
+ enable_reference_tracking()
+#endif
world.Profile(PROFILE_START)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 718f9d4246..e9abb7db87 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -171,7 +171,11 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/client/proc/cmd_display_overlay_log,
/client/proc/reload_configuration,
/datum/admins/proc/create_or_modify_area,
- /client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG
+#ifdef REFERENCE_TRACKING
+ /datum/admins/proc/view_refs,
+ /datum/admins/proc/view_del_failures,
+#endif
+ /client/proc/generate_wikichem_list, //DO NOT PRESS UNLESS YOU WANT SUPERLAG
)
GLOBAL_PROTECT(admin_verbs_debug)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm
new file mode 100644
index 0000000000..70aac2f107
--- /dev/null
+++ b/code/modules/admin/view_variables/reference_tracking.dm
@@ -0,0 +1,225 @@
+#ifdef REFERENCE_TRACKING
+
+GLOBAL_LIST_EMPTY(deletion_failures)
+
+/world/proc/enable_reference_tracking()
+ if (fexists(EXTOOLS))
+ call(EXTOOLS, "ref_tracking_initialize")()
+
+/proc/get_back_references(datum/D)
+ CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!")
+
+/proc/get_forward_references(datum/D)
+ CRASH("/proc/get_forward_references not hooked by extools, reference tracking will not function!")
+
+/proc/clear_references(datum/D)
+ return
+
+/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey
+ set category = "Debug"
+ set name = "View References"
+
+ if(!check_rights(R_DEBUG) || !D)
+ return
+
+ var/list/backrefs = get_back_references(D)
+ if(isnull(backrefs))
+ var/datum/browser/popup = new(usr, "ref_view", "
Error
")
+ popup.set_content("Reference tracking not enabled")
+ popup.open(FALSE)
+ return
+
+ var/list/frontrefs = get_forward_references(D)
+ var/list/dat = list()
+ dat += "References of \ref[D] - [D]
\[Refresh\]
"
+ dat += "Back references - these things hold references to this object.
"
+ dat += ""
+ dat += "| Ref | Type | Variable Name | Follow | "
+ for(var/ref in backrefs)
+ var/datum/backreference = ref
+ if(isnull(backreference))
+ dat += "
|---|
| GC'd Reference |
"
+ if(istype(backreference))
+ dat += "| [REF(backreference)] | [backreference.type] | [backrefs[backreference]] | \[Follow\] |
"
+ else if(islist(backreference))
+ dat += "| [REF(backreference)] | list | [backrefs[backreference]] | \[Follow\] |
"
+ else
+ dat += "| Weird reference type. Add more debugging checks. |
"
+ dat += "
"
+ dat += "Forward references - this object is referencing those things.
"
+ dat += ""
+ dat += "| Variable name | Ref | Type | Follow | "
+ for(var/ref in frontrefs)
+ var/datum/backreference = frontrefs[ref]
+ dat += "
|---|
| [ref] | [REF(backreference)] | [backreference.type] | \[Follow\] |
"
+ dat += "
"
+ dat = dat.Join()
+
+ var/datum/browser/popup = new(usr, "ref_view", "References of \ref[D]
")
+ popup.set_content(dat)
+ popup.open(FALSE)
+
+
+/datum/admins/proc/view_del_failures()
+ set category = "Debug"
+ set name = "View Deletion Failures"
+
+ if(!check_rights(R_DEBUG))
+ return
+
+ var/list/dat = list("")
+ for(var/t in GLOB.deletion_failures)
+ if(isnull(t))
+ dat += "| GC'd Reference | Clear Nulls |
"
+ continue
+ var/datum/thing = t
+ dat += "| \ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)] |
"
+ dat += "
"
+ dat = dat.Join()
+
+ var/datum/browser/popup = new(usr, "del_failures", "Deletion Failures
")
+ popup.set_content(dat)
+ popup.open(FALSE)
+
+
+/datum/proc/find_references()
+ testing("Beginning search for references to a [type].")
+ var/list/backrefs = get_back_references(src)
+ for(var/ref in backrefs)
+ if(isnull(ref))
+ log_world("## TESTING: Datum reference found, but gone now.")
+ continue
+ if(islist(ref))
+ log_world("## TESTING: Found [type] \ref[src] in list.")
+ continue
+ var/datum/datum_ref = ref
+ if(!istype(datum_ref))
+ log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].")
+ return
+ log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]")
+ message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]")
+ testing("Completed search for references to a [type].")
+
+#endif
+
+#ifdef LEGACY_REFERENCE_TRACKING
+
+/datum/verb/legacy_find_refs()
+ set category = "Debug"
+ set name = "Find References"
+ set src in world
+
+ find_references(FALSE)
+
+
+/datum/proc/find_references_legacy(skip_alert)
+ running_find_references = type
+ if(usr?.client)
+ if(usr.client.running_find_references)
+ testing("CANCELLED search for references to a [usr.client.running_find_references].")
+ usr.client.running_find_references = null
+ running_find_references = null
+ //restart the garbage collector
+ SSgarbage.can_fire = TRUE
+ SSgarbage.next_fire = world.time + world.tick_lag
+ return
+
+ if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes")
+ running_find_references = null
+ return
+
+ //this keeps the garbage collector from failing to collect objects being searched for in here
+ SSgarbage.can_fire = FALSE
+
+ if(usr?.client)
+ usr.client.running_find_references = type
+
+ testing("Beginning search for references to a [type].")
+ last_find_references = world.time
+
+ DoSearchVar(GLOB) //globals
+ for(var/datum/thing in world) //atoms (don't beleive its lies)
+ DoSearchVar(thing, "World -> [thing]")
+
+ for(var/datum/thing) //datums
+ DoSearchVar(thing, "World -> [thing]")
+
+ for(var/client/thing) //clients
+ DoSearchVar(thing, "World -> [thing]")
+
+ testing("Completed search for references to a [type].")
+ if(usr?.client)
+ usr.client.running_find_references = null
+ running_find_references = null
+
+ //restart the garbage collector
+ SSgarbage.can_fire = TRUE
+ SSgarbage.next_fire = world.time + world.tick_lag
+
+
+/datum/verb/qdel_then_find_references()
+ set category = "Debug"
+ set name = "qdel() then Find References"
+ set src in world
+
+ qdel(src, TRUE) //force a qdel
+ if(!running_find_references)
+ find_references(TRUE)
+
+
+/datum/verb/qdel_then_if_fail_find_references()
+ set category = "Debug"
+ set name = "qdel() then Find References if GC failure"
+ set src in world
+
+ qdel_and_find_ref_if_fail(src, TRUE)
+
+
+/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64)
+ if(usr?.client && !usr.client.running_find_references)
+ return
+
+ if(!recursive_limit)
+ return
+
+ if(istype(potential_container, /datum))
+ var/datum/datum_container = potential_container
+ if(datum_container.last_find_references == last_find_references)
+ return
+
+ datum_container.last_find_references = last_find_references
+ var/list/vars_list = datum_container.vars
+
+ for(var/varname in vars_list)
+ if (varname == "vars")
+ continue
+ var/variable = vars_list[varname]
+
+ if(variable == src)
+ testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]")
+
+ else if(islist(variable))
+ DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1)
+
+ else if(islist(potential_container))
+ var/normal = IS_NORMAL_LIST(potential_container)
+ for(var/element_in_list in potential_container)
+ if(element_in_list == src)
+ testing("Found [type] \ref[src] in list [container_name].")
+
+ else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src)
+ testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]")
+
+ else if(islist(element_in_list))
+ DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1)
+
+ #ifndef FIND_REF_NO_CHECK_TICK
+ CHECK_TICK
+ #endif
+
+
+/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE)
+ SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE
+ qdel(thing_to_del, force)
+
+#endif
diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm
index d6e4c2b944..9ee7103562 100644
--- a/code/modules/admin/view_variables/topic_basic.dm
+++ b/code/modules/admin/view_variables/topic_basic.dm
@@ -45,6 +45,16 @@
usr.client.admin_delete(target)
if (isturf(src)) // show the turf that took its place
usr.client.debug_variables(src)
+ return
+ #ifdef REFERENCE_TRACKING
+ if(href_list[VV_HK_VIEW_REFERENCES])
+ var/datum/D = locate(href_list[VV_HK_TARGET])
+ if(!D)
+ to_chat(usr, "Unable to locate item.")
+ return
+ usr.client.holder.view_refs(target)
+ return
+ #endif
if(href_list[VV_HK_MARK])
usr.client.mark_datum(target)
if(href_list[VV_HK_ADDCOMPONENT])
diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm
index abe445589f..a4dff725f7 100644
--- a/code/modules/admin/view_variables/view_variables.dm
+++ b/code/modules/admin/view_variables/view_variables.dm
@@ -61,6 +61,7 @@
"Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH),
"Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE),
"Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE),
+ "View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES),
"---"
)
for(var/i in 1 to length(dropdownoptions))
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index c5f880c955..14f7b34309 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -281,7 +281,6 @@ GLOBAL_LIST_EMPTY(antagonists)
. = CONFIG_GET(keyed_list/antag_threat)[lowertext(name)]
if(. == null)
return threat
- return threat
//This one is created by admin tools for custom objectives
/datum/antagonist/custom
diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm
index 9a82bb546b..c449bd3012 100644
--- a/code/modules/antagonists/blob/blob.dm
+++ b/code/modules/antagonists/blob/blob.dm
@@ -4,11 +4,17 @@
antagpanel_category = "Blob"
show_to_ghosts = TRUE
job_rank = ROLE_BLOB
- threat = 20
+ threat = 50
var/datum/action/innate/blobpop/pop_action
var/starting_points_human_blob = 60
var/point_rate_human_blob = 2
+/datum/antagonist/blob/threat()
+ . = ..()
+ if(isovermind(owner.current))
+ var/mob/camera/blob/overmind = owner.current
+ . *= (overmind.blobs_legit.len / overmind.max_count)
+
/datum/antagonist/blob/roundend_report()
var/basic_report = ..()
//Display max blobpoints for blebs that lost
diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
index ba2363ecc0..f9763b92fd 100644
--- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
@@ -75,7 +75,6 @@
desc = "A floating, fragile spore."
icon_state = "blobpod"
icon_living = "blobpod"
- threat = 0.2
health = 30
maxHealth = 30
verb_say = "psychically pulses"
diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm
index 24cad2a188..740ec81782 100644
--- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm
+++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm
@@ -54,7 +54,7 @@
REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude")
REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude")
REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
- REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
+ REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude")
if(!ishuman(owner))
return
var/mob/living/carbon/human/H = owner
diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm
index 87466d65f2..2f00fd4e4a 100644
--- a/code/modules/antagonists/clockcult/clock_mobs.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs.dm
@@ -6,7 +6,6 @@
unique_name = 1
minbodytemp = 0
unsuitable_atmos_damage = 0
- threat = 1
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
healable = FALSE
diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
index 79b919b1e9..76c9db7231 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
@@ -9,7 +9,6 @@
desc = "The stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield."
icon_state = "clockwork_marauder"
mob_biotypes = MOB_HUMANOID
- threat = 3
health = 120
maxHealth = 120
force_threshold = 8
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index b7503f4b22..305c4fadb7 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -70,7 +70,6 @@
icon_living = "swarmer"
icon_dead = "swarmer_unactivated"
icon_gib = null
- threat = 0.5
wander = 0
harm_intent_damage = 5
minbodytemp = 0
diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm
index 2cc8e34b99..f10506a0d9 100644
--- a/code/modules/antagonists/xeno/xeno.dm
+++ b/code/modules/antagonists/xeno/xeno.dm
@@ -16,6 +16,18 @@
var/datum/team/xeno/xeno_team
threat = 3
+/datum/antagonist/xeno/threat()
+ . = 1
+ if(isalienhunter(owner))
+ . = 2
+ else if(isaliensentinel(owner))
+ . = 4
+ else if(isalienroyal(owner))
+ if(isalienqueen(owner))
+ . = 8
+ else
+ . = 6
+
/datum/antagonist/xeno/create_team(datum/team/xeno/new_team)
if(!new_team)
for(var/datum/antagonist/xeno/X in GLOB.antagonists)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index a8b4c93764..18e3281e4b 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -264,7 +264,7 @@
name = "pipes"
/datum/asset/spritesheet/pipes/register()
- for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi'))
+ for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi'))
InsertAll("", each, GLOB.alldirs)
..()
@@ -388,9 +388,11 @@
Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal")
..()
+
/datum/asset/spritesheet/mafia
name = "mafia"
/datum/asset/spritesheet/mafia/register()
InsertAll("", 'icons/obj/mafia.dmi')
..()
+
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 480ebda4f8..2fe674e59e 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -246,6 +246,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)]
var/scars_index = 1
+ var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
+
/datum/preferences/New(client/C)
parent = C
@@ -521,6 +523,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
+ if(length(pref_species.allowed_limb_ids))
+ if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids))
+ chosen_limb_id = pref_species.id
+ dat += "Body sprite
"
+ dat += "[chosen_limb_id]"
+
if(mutant_category)
dat += ""
mutant_category = 0
@@ -801,7 +809,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!subcategories.Find(gear_subcategory))
gear_subcategory = subcategories[1]
- var/firstsubcat = FALSE
+ var/firstsubcat = TRUE
for(var/subcategory in subcategories)
if(firstsubcat)
firstsubcat = FALSE
@@ -2092,8 +2100,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
features["body_model"] = chosengender
gender = chosengender
- facial_hair_style = random_facial_hair_style(gender)
- hair_style = random_hair_style(gender)
if("body_size")
var/min = CONFIG_GET(number/body_size_min)
@@ -2119,6 +2125,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs
if(selected_custom_speech_verb)
custom_speech_verb = selected_custom_speech_verb
+
+ if("bodysprite")
+ var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids
+ if(selected_body_sprite)
+ chosen_limb_id = selected_body_sprite //this gets sanitized before loading
else
switch(href_list["preference"])
//CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj
@@ -2510,6 +2521,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
+ if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
+ character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id
character.dna.real_name = character.real_name
character.dna.nameless = character.nameless
character.dna.custom_species = character.custom_species
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 64c5e775b0..55a594cf21 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 34
+#define SAVEFILE_VERSION_MAX 35
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -200,6 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"])
features["ooc_notes"] = html_encode(features["ooc_notes"])
+ if(current_version < 35)
+ if(S["species"] == "lizard")
+ features["mam_snouts"] = features["snout"]
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -510,6 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["scars3"] >> scars_list["3"]
S["scars4"] >> scars_list["4"]
S["scars5"] >> scars_list["5"]
+ S["chosen_limb_id"] >> chosen_limb_id
//Custom names
@@ -840,6 +845,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
+ WRITE_FILE(S["chosen_limb_id"], chosen_limb_id)
+
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index d540336b86..2fbe738acb 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -118,8 +118,7 @@
// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up
/obj/item/clothing/proc/repair(mob/user, params)
- damaged_clothes = CLOTHING_PRISTINE
- update_clothes_damaged_state(FALSE)
+ update_clothes_damaged_state(CLOTHING_PRISTINE)
obj_integrity = max_integrity
name = initial(name) // remove "tattered" or "shredded" if there's a prefix
body_parts_covered = initial(body_parts_covered)
@@ -196,7 +195,7 @@
if(3 to INFINITY) // take better care of your shit, dude
name = "tattered [initial(name)]"
- update_clothes_damaged_state()
+ update_clothes_damaged_state(CLOTHING_DAMAGED)
/obj/item/clothing/Destroy()
user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up
@@ -257,7 +256,7 @@
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += ""
. += how_cool_are_your_threads.Join()
-
+
if(LAZYLEN(armor_list))
armor_list.Cut()
if(armor.bio)
@@ -346,10 +345,16 @@
var/mob/M = loc
to_chat(M, "Your [name] starts to fall apart!")
-/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE)
- var/index = "[REF(initial(icon))]-[initial(icon_state)]"
- var/static/list/damaged_clothes_icons = list()
- if(damaging)
+//This mostly exists so subtypes can call appriopriate update icon calls on the wearer.
+/obj/item/clothing/proc/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED)
+ damaged_clothes = damaged_state
+ update_icon()
+
+/obj/item/clothing/update_overlays()
+ . = ..()
+ if(damaged_clothes)
+ var/index = "[REF(initial(icon))]-[initial(icon_state)]"
+ var/static/list/damaged_clothes_icons = list()
var/icon/damaged_clothes_icon = damaged_clothes_icons[index]
if(!damaged_clothes_icon)
damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object
@@ -357,9 +362,7 @@
damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant
damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon)
damaged_clothes_icons[index] = damaged_clothes_icon
- add_overlay(damaged_clothes_icon, TRUE)
- else
- cut_overlay(damaged_clothes_icons[index], TRUE)
+ . += damaged_clothes_icon
/*
SEE_SELF // can see self, no matter what
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 1c3ac0f340..b5d92fb780 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -199,12 +199,16 @@
/obj/item/clothing/gloves/evening
name = "evening gloves"
- desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish."
+ desc = "Thin, pretty gloves intended for use in regal feminine attire. A tag on the hem claims they were 'maid' in Space China, these were probably intended for use in some maid fetish."
icon_state = "evening"
item_state = "evening"
- strip_delay = 40
- equip_delay_other = 20
+ transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
strip_mod = 0.9
- custom_price = PRICE_ALMOST_CHEAP
+
+/obj/item/clothing/gloves/evening/black
+ name = "midnight gloves"
+ desc = "Thin, pretty gloves intended for use in sexy feminine attire. A tag on the hem claims they pair great with black stockings."
+ icon_state = "eveningblack"
+ item_state = "eveningblack"
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index a5a0e4ad28..eda36ea12f 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -74,6 +74,25 @@
permeability_coefficient = 0.05
strip_mod = 1.5 // and combat gloves had this??
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator
+ name = "insidious guerrilla gloves"
+ desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping and tackling knowledge to the user via the use of nanochips."
+ icon_state = "infiltrator"
+ item_state = "infiltrator"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/carrytrait = TRAIT_QUICKER_CARRY
+
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_GLOVES)
+ ADD_TRAIT(user, carrytrait, GLOVE_TRAIT)
+
+/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT)
+
/obj/item/clothing/gloves/tackler/rocket
name = "rocket gloves"
desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues."
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index f11c89d00c..6701b53c10 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -12,6 +12,10 @@
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
adjustmask(user)
+/obj/item/clothing/mask/balaclava/breath
+ name = "breathaclava"
+ clothing_flags = ALLOWINTERNALS
+
/obj/item/clothing/mask/infiltrator
name = "insidious balaclava"
desc = "An incredibly suspicious balaclava made with Syndicate nanofibers to absorb impacts slightly while obfuscating the voice and face using a garbled vocoder."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6364a9a1c1..d6853f52ca 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -625,7 +625,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy."
icon_state = "coatmedical"
item_state = "coatmedical"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
@@ -638,7 +638,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur."
icon_state = "coatcmo"
item_state = "coatcmo"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
@@ -651,7 +651,7 @@
desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go."
icon_state = "coatchemistry"
item_state = "coatchemistry"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
@@ -664,7 +664,7 @@
desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage."
icon_state = "coatviro"
item_state = "coatviro"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
@@ -677,7 +677,7 @@
desc = "A winter coat with blue markings. Warm, but probably won't protect from biological agents. For the cozy doctor on the go."
icon_state = "coatparamed"
item_state = "coatparamed"
- allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 69e9a974eb..993577cb30 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -3,7 +3,7 @@
typepath = /datum/round_event/ghost_role/alien_infestation
weight = 5
gamemode_blacklist = list("dynamic")
- min_players = 10
+ min_players = 25
max_occurrences = 1
/datum/round_event/ghost_role/alien_infestation
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index da5b4c0cb2..1c88e68377 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -27,7 +27,6 @@
"How do I vore people?",
"ERP?",
"Not epic bros...")
- threat = 5
/datum/round_event/brand_intelligence/announce(fake)
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index af44b54ed0..9ab5e8d517 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -25,7 +25,7 @@
ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
/datum/round_event/pirates/announce(fake)
- priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
+ priority_announce("A business proposition has been downloaded and printed out at all communication consoles.", "Incoming Business Proposition", "commandreport")
if(fake)
return
threat_message = new
@@ -49,6 +49,7 @@
else
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
if(!shuttle_spawned)
+ priority_announce("You won't listen to reason? Then we'll take what's yours or die trying!",sender_override = ship_name)
spawn_shuttle()
/datum/round_event/pirates/start()
@@ -83,8 +84,7 @@
announce_to_ghosts(M)
else
announce_to_ghosts(spawner)
-
- priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too
+ priority_announce("Unidentified ship detected near the station.")
//Shuttle equipment
diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm
index 4d2e8e624c..57e2a2a051 100644
--- a/code/modules/events/wizard/magicarp.dm
+++ b/code/modules/events/wizard/magicarp.dm
@@ -30,7 +30,6 @@
icon_dead = "magicarp_dead"
icon_gib = "magicarp_gib"
ranged = 1
- threat = 4
retreat_distance = 2
minimum_distance = 0 //Between shots they can and will close in to nash
projectiletype = /obj/item/projectile/magic
@@ -52,7 +51,6 @@
color = "#00FFFF"
maxHealth = 75
health = 75
- threat = 7
/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
projectiletype = pick(allowed_projectile_types)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 895699434a..4d5f4e2dd0 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -97,9 +97,12 @@ All foods are distributed among various categories. Use common sense.
return
-/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone)
+/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(user.a_intent == INTENT_HARM)
return ..()
+ INVOKE_ASYNC(src, .proc/attempt_forcefeed, M, user)
+
+/obj/item/reagent_containers/food/snacks/proc/attempt_forcefeed(mob/living/M, mob/living/user)
if(!eatverb)
eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm
index 6c9e527f38..d3b9b92b4f 100644
--- a/code/modules/holiday/halloween/halloween.dm
+++ b/code/modules/holiday/halloween/halloween.dm
@@ -190,7 +190,6 @@
icon_dead = "scary_clown"
icon_gib = "scary_clown"
speak = list("...", ". . .")
- threat = 3
maxHealth = 120
health = 120
emote_see = list("silently stares")
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index abf6632939..f6be9db9a2 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -103,6 +103,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
+ attack_speed = CLICK_CD_MELEE
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
armour_penetration = 20
@@ -125,9 +126,12 @@
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
-/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
+/obj/item/scythe/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
- return ..()
+ return
else
var/turf/user_turf = get_turf(user)
var/dir_to_target = get_dir(user_turf, get_turf(A))
@@ -138,11 +142,12 @@
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
for(var/obj/structure/spacevine/V in T)
if(user.Adjacent(V))
- melee_attack_chain(user, V)
+ melee_attack_chain(user, V, attackchain_flags = ATTACK_IGNORE_CLICKDELAY)
stam_gain += 5 //should be hitcost
swiping = FALSE
stam_gain += 2 //Initial hitcost
user.adjustStaminaLoss(-stam_gain)
+ user.DelayNextAction()
// *************************************
// Nutrient defines for hydroponics
@@ -192,4 +197,4 @@
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
- list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
\ No newline at end of file
+ list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 06179d1087..a208f2de3c 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -30,7 +30,7 @@
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
var/self_sufficiency_progress = 0
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
-
+ var/canirrigate = TRUE //tin
/obj/machinery/hydroponics/constructable
name = "hydroponics tray"
@@ -847,12 +847,13 @@
if (!anchored)
to_chat(user, "Anchor the tray first!")
return
- using_irrigation = !using_irrigation
- O.play_tool_sound(src)
- user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \
- "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.")
- for(var/obj/machinery/hydroponics/h in range(1,src))
- h.update_icon()
+ if(canirrigate)
+ using_irrigation = !using_irrigation
+ O.play_tool_sound(src)
+ user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \
+ "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.")
+ for(var/obj/machinery/hydroponics/h in range(1,src))
+ h.update_icon()
else if(istype(O, /obj/item/shovel/spade))
if(!myseed && !weedlevel)
@@ -910,11 +911,14 @@
harvest = 0
lastproduce = age
if(istype(myseed, /obj/item/seeds/replicapod))
- to_chat(user, "You harvest from the [myseed.plantname].")
+ if(user)//runtimes
+ to_chat(user, "You harvest from the [myseed.plantname].")
else if(myseed.getYield() <= 0)
- to_chat(user, "You fail to harvest anything useful!")
+ if(user)
+ to_chat(user, "You fail to harvest anything useful!")
else
- to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].")
+ if(user)
+ to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].")
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
qdel(myseed)
myseed = null
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 5e49a32a23..c7314bf180 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -190,6 +190,31 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
parent.update_tray(user)
return result
+/obj/item/seeds/proc/harvest_userless()
+ var/obj/machinery/hydroponics/parent = loc //for ease of access
+ var/t_amount = 0
+ var/list/result = list()
+ var/output_loc = parent.loc
+ var/product_name
+ while(t_amount < getYield())
+ var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
+ if(parent.myseed.plantname != initial(parent.myseed.plantname))
+ t_prod.name = lowertext(parent.myseed.plantname)
+ if(productdesc)
+ t_prod.desc = productdesc
+ t_prod.seed.name = parent.myseed.name
+ t_prod.seed.desc = parent.myseed.desc
+ t_prod.seed.plantname = parent.myseed.plantname
+ result.Add(t_prod) // User gets a consumable
+ if(!t_prod)
+ return
+ t_amount++
+ product_name = parent.myseed.plantname
+ if(getYield() >= 1)
+ SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name)
+ parent.investigate_log("autmoatic harvest of [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY)
+ parent.update_tray()
+ return result
/obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T)
if(!T.reagents)
diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm
index d842dbc003..a0d96658e6 100644
--- a/code/modules/instruments/songs/_song.dm
+++ b/code/modules/instruments/songs/_song.dm
@@ -2,6 +2,12 @@
#define MUSIC_MAXLINES 1000
#define MUSIC_MAXLINECHARS 300
+/**
+ * # Song datum
+ *
+ * These are the actual backend behind instruments.
+ * They attach to an atom and provide the editor + playback functionality.
+ */
/datum/song
/// Name of the song
var/name = "Untitled"
@@ -15,6 +21,9 @@
/// delay between notes in deciseconds
var/tempo = 5
+ /// How far we can be heard
+ var/instrument_range = 15
+
/// Are we currently playing?
var/playing = FALSE
@@ -53,17 +62,24 @@
/////////////////// Playing variables ////////////////
/**
- * Only used in synthesized playback - The chords we compiled. Non assoc list of lists:
- * list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...)
- * tempo_divisor always exists
- * if key1 (and so if there's no keys) doesn't exist it's a rest
+ * Build by compile_chords()
+ * Must be rebuilt on instrument switch.
* Compilation happens when we start playing and is cleared after we finish playing.
+ * Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv)
*/
var/list/compiled_chords
+ /// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag.
+ var/elapsed_delay
+ /// Amount of delay to wait before playing the next chord
+ var/delay_by
+ /// Current chord we're on.
+ var/current_chord
/// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1.
var/list/channels_playing = list()
/// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments.
var/list/channels_idle = list()
+ /// Person playing us
+ var/mob/user_playing
//////////////////////////////////////////////////////
/// Last world.time we checked for who can hear us
@@ -72,8 +88,6 @@
var/list/hearing_mobs
/// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop)
var/debug_mode = FALSE
- /// Last time we processed decay
- var/last_process_decay
/// Max sound channels to occupy
var/max_sound_channels = CHANNELS_PER_INSTRUMENT
/// Current channels, so we can save a length() call.
@@ -113,7 +127,7 @@
var/cached_exponential_dropoff = 1.045
/////////////////////////////////////////////////////////////////////////
-/datum/song/New(atom/parent, list/instrument_ids)
+/datum/song/New(atom/parent, list/instrument_ids, new_range)
SSinstruments.on_song_new(src)
lines = list()
tempo = sanitize_tempo(tempo)
@@ -125,6 +139,8 @@
hearing_mobs = list()
volume = clamp(volume, min_volume, max_volume)
update_sustain()
+ if(new_range)
+ instrument_range = new_range
/datum/song/Destroy()
stop_playing()
@@ -135,12 +151,15 @@
parent = null
return ..()
+/**
+ * Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range.
+ */
/datum/song/proc/do_hearcheck()
last_hearcheck = world.time
var/list/old = hearing_mobs.Copy()
hearing_mobs.len = 0
var/turf/source = get_turf(parent)
- for(var/mob/M in get_hearers_in_view(15, source))
+ for(var/mob/M in get_hearers_in_view(instrument_range, source))
if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS))
continue
hearing_mobs[M] = get_dist(M, source)
@@ -148,10 +167,15 @@
for(var/i in exited)
terminate_sound_mob(i)
-/// I can either be a datum, id, or path (if the instrument has no id).
+/**
+ * Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum.
+ */
/datum/song/proc/set_instrument(datum/instrument/I)
+ terminate_all_sounds()
+ var/old_legacy
if(using_instrument)
using_instrument.songs_using -= src
+ old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY)
using_instrument = null
cached_samples = null
cached_legacy_ext = null
@@ -162,7 +186,7 @@
if(istype(I))
using_instrument = I
I.songs_using += src
- var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY)
+ var/instrument_legacy = (I.instrument_flags & INSTRUMENT_LEGACY)
if(instrument_legacy)
cached_legacy_ext = I.legacy_instrument_ext
cached_legacy_dir = I.legacy_instrument_path
@@ -170,23 +194,37 @@
else
cached_samples = I.samples
legacy = FALSE
+ if(isnull(old_legacy) || (old_legacy != instrument_legacy))
+ if(playing)
+ compile_chords()
-/// THIS IS A BLOCKING CALL.
+/**
+ * Attempts to start playing our song.
+ */
/datum/song/proc/start_playing(mob/user)
if(playing)
return
if(!using_instrument?.ready())
to_chat(user, "An error has occured with [src]. Please reset the instrument.")
return
+ compile_chords()
+ if(!length(compiled_chords))
+ to_chat(user, "Song is empty.")
+ return
playing = TRUE
- updateDialog()
+ updateDialog(user_playing)
//we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak.
//wrap the rest of the stuff to ensure stop_playing() is called.
- last_process_decay = world.time
+ do_hearcheck()
+ elapsed_delay = 0
+ delay_by = 0
+ current_chord = 1
+ user_playing = user
START_PROCESSING(SSinstruments, src)
- . = do_play_lines(user)
- stop_playing()
+/**
+ * Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs.
+ */
/datum/song/proc/stop_playing()
if(!playing)
return
@@ -196,42 +234,93 @@
STOP_PROCESSING(SSinstruments, src)
terminate_all_sounds(TRUE)
hearing_mobs.len = 0
- updateDialog()
+ user_playing = null
-/// THIS IS A BLOCKING CALL.
-/datum/song/proc/do_play_lines(user)
- if(!playing)
+/**
+ * Processes our song.
+ */
+/datum/song/proc/process_song(wait)
+ if(!length(compiled_chords) || should_stop_playing(user_playing))
+ stop_playing()
return
- do_hearcheck()
- if(legacy)
- do_play_lines_legacy(user)
- else
- do_play_lines_synthesized(user)
+ var/list/chord = compiled_chords[current_chord]
+ if(++elapsed_delay >= delay_by)
+ play_chord(chord)
+ elapsed_delay = 0
+ delay_by = tempodiv_to_delay(chord[length(chord)])
+ current_chord++
+ if(current_chord > length(compiled_chords))
+ if(repeat)
+ repeat--
+ current_chord = 1
+ return
+ else
+ stop_playing()
+ return
+/**
+ * Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo.
+ */
+/datum/song/proc/tempodiv_to_delay(tempodiv)
+ if(!tempodiv)
+ tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason.
+ return max(1, round((tempo/tempodiv) / world.tick_lag, 1))
+
+/**
+ * Compiles chords.
+ */
+/datum/song/proc/compile_chords()
+ legacy? compile_legacy() : compile_synthesized()
+
+/**
+ * Plays a chord.
+ */
+/datum/song/proc/play_chord(list/chord)
+ // last value is timing information
+ for(var/i in 1 to (length(chord) - 1))
+ legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing)
+
+/**
+ * Checks if we should halt playback.
+ */
/datum/song/proc/should_stop_playing(mob/user)
return QDELETED(parent) || !using_instrument || !playing
+/**
+ * Sanitizes tempo to a value that makes sense and fits the current world.tick_lag.
+ */
/datum/song/proc/sanitize_tempo(new_tempo)
new_tempo = abs(new_tempo)
return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS)
+/**
+ * Gets our beats per minute based on our tempo.
+ */
/datum/song/proc/get_bpm()
return 600 / tempo
+/**
+ * Sets our tempo from a beats-per-minute, sanitizing it to a valid number first.
+ */
/datum/song/proc/set_bpm(bpm)
tempo = sanitize_tempo(600 / bpm)
-/// Updates the window for our user. Override in subtypes.
-/datum/song/proc/updateDialog(mob/user = usr)
+/**
+ * Updates the window for our users. Override down the line.
+ */
+/datum/song/proc/updateDialog(mob/user)
ui_interact(user)
/datum/song/process(wait)
if(!playing)
return PROCESS_KILL
- var/delay = world.time - last_process_decay
- process_decay(delay)
- last_process_decay = world.time
+ // it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up.
+ process_song(world.tick_lag)
+ process_decay(world.tick_lag)
+/**
+ * Updates our cached linear/exponential falloff stuff, saving calculations down the line.
+ */
/datum/song/proc/update_sustain()
// Exponential is easy
cached_exponential_dropoff = sustain_exponential_dropoff
@@ -241,21 +330,33 @@
var/volume_decrease_per_decisecond = volume_diff / target_duration
cached_linear_dropoff = volume_decrease_per_decisecond
+/**
+ * Setter for setting output volume.
+ */
/datum/song/proc/set_volume(volume)
src.volume = clamp(volume, max(0, min_volume), min(100, max_volume))
update_sustain()
updateDialog()
+/**
+ * Setter for setting how low the volume has to get before a note is considered "dead" and dropped
+ */
/datum/song/proc/set_dropoff_volume(volume)
sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100)
update_sustain()
updateDialog()
+/**
+ * Setter for setting exponential falloff factor.
+ */
/datum/song/proc/set_exponential_drop_rate(drop)
sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX)
update_sustain()
updateDialog()
+/**
+ * Setter for setting linear falloff duration.
+ */
/datum/song/proc/set_linear_falloff_duration(duration)
sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN)
update_sustain()
@@ -277,10 +378,8 @@
// subtype for handheld instruments, like violin
/datum/song/handheld
-/datum/song/handheld/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/handheld/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/handheld/should_stop_playing(mob/user)
. = ..()
@@ -292,10 +391,8 @@
// subtype for stationary structures, like pianos
/datum/song/stationary
-/datum/song/stationary/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/stationary/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/stationary/should_stop_playing(mob/user)
. = ..()
diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm
index fa64656ebc..eee9be3cc7 100644
--- a/code/modules/instruments/songs/play_legacy.dm
+++ b/code/modules/instruments/songs/play_legacy.dm
@@ -1,48 +1,52 @@
-/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked.
-/datum/song/proc/do_play_lines_legacy(mob/user)
- while(repeat >= 0)
- var/cur_oct[7]
- var/cur_acc[7]
- for(var/i = 1 to 7)
- cur_oct[i] = 3
- cur_acc[i] = "n"
+/**
+ * Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_legacy()
+ if(!length(src.lines))
+ return
+ var/list/lines = src.lines //cache for hyepr speed!
+ compiled_chords = list()
+ var/list/octaves = list(3, 3, 3, 3, 3, 3, 3)
+ var/list/accents = list("n", "n", "n", "n", "n", "n", "n")
+ for(var/line in lines)
+ var/list/chords = splittext(lowertext(line), ",")
+ for(var/chord in chords)
+ var/list/compiled_chord = list()
+ var/tempodiv = 1
+ var/list/notes_tempodiv = splittext(chord, "/")
+ var/len = length(notes_tempodiv)
+ if(len >= 2)
+ tempodiv = text2num(notes_tempodiv[2])
+ if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that.
+ var/list/notes = splittext(notes_tempodiv[1], "-")
+ for(var/note in notes)
+ if(length(note) == 0)
+ continue
+ // 1-7, A-G
+ var/key = text2ascii(note) - 96
+ if((key < 1) || (key > 7))
+ continue
+ for(var/i in 2 to length(note))
+ var/oct_acc = copytext(note, i, i + 1)
+ var/num = text2num(oct_acc)
+ if(!num) //it's an accidental
+ accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks.
+ else //octave
+ octaves[key] = clamp(num, octave_min, octave_max)
+ compiled_chord[++compiled_chord.len] = list(key, accents[key], octaves[key])
+ compiled_chord += tempodiv //this goes last
+ if(length(compiled_chord))
+ compiled_chords[++compiled_chords.len] = compiled_chord
- for(var/line in lines)
- for(var/beat in splittext(lowertext(line), ","))
- if(should_stop_playing(user))
- return
- var/list/notes = splittext(beat, "/")
- if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1.
- for(var/note in splittext(notes[1], "-"))
- if(length(note) == 0)
- continue
- var/cur_note = text2ascii(note) - 96
- if(cur_note < 1 || cur_note > 7)
- continue
- for(var/i=2 to length(note))
- var/ni = copytext(note,i,i+1)
- if(!text2num(ni))
- if(ni == "#" || ni == "b" || ni == "n")
- cur_acc[cur_note] = ni
- else if(ni == "s")
- cur_acc[cur_note] = "#" // so shift is never required
- else
- cur_oct[cur_note] = text2num(ni)
- playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note])
- if(notes.len >= 2 && text2num(notes[2]))
- sleep(sanitize_tempo(tempo / text2num(notes[2])))
- else
- sleep(tempo)
- if(should_stop_playing(user))
- return
- repeat--
- updateDialog()
- repeat = 0
-
-// note is a number from 1-7 for A-G
-// acc is either "b", "n", or "#"
-// oct is 1-8 (or 9 for C)
-/datum/song/proc/playnote_legacy(note, acc as text, oct)
+/**
+ * Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management.
+ *
+ * Arguments:
+ * * note is a number from 1-7 for A-G
+ * * acc is either "b", "n", or "#"
+ * * oct is 1-8 (or 9 for C)
+ */
+/datum/song/proc/playkey_legacy(note, acc as text, oct, mob/user)
// handle accidental -> B<>C of E<>F
if(acc == "b" && (note == 3 || note == 6)) // C or F
if(note == 3)
diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm
index 5e7c5652a0..4df54f5e6b 100644
--- a/code/modules/instruments/songs/play_synthesized.dm
+++ b/code/modules/instruments/songs/play_synthesized.dm
@@ -1,27 +1,7 @@
-/datum/song/proc/do_play_lines_synthesized(mob/user)
- compile_lines()
- while(repeat >= 0)
- if(should_stop_playing(user))
- return
- var/warned = FALSE
- for(var/_chord in compiled_chords)
- if(should_stop_playing(user))
- return
- var/list/chord = _chord
- var/tempodiv = chord[chord.len]
- for(var/i in 1 to chord.len - 1)
- var/key = chord[i]
- if(!playkey_synth(key))
- if(!warned)
- warned = TRUE
- to_chat(user, "Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.")
- sleep(sanitize_tempo(tempo / (tempodiv || 1)))
- repeat--
- updateDialog()
- repeat = 0
-
-/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example
-/datum/song/proc/compile_lines()
+/**
+ * Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_synthesized()
if(!length(src.lines))
return
var/list/lines = src.lines //cache for hyepr speed!
@@ -57,10 +37,12 @@
compiled_chord += tempodiv //this goes last
if(length(compiled_chord))
compiled_chords[++compiled_chords.len] = compiled_chord
- CHECK_TICK
- return compiled_chords
-/datum/song/proc/playkey_synth(key)
+/**
+ * Plays a specific numerical key from our instrument to anyone who can hear us.
+ * Does a hearing check if enough time has passed.
+ */
+/datum/song/proc/playkey_synth(key, mob/user)
if(can_noteshift)
key = clamp(key + note_shift, key_min, key_max)
if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
@@ -83,6 +65,9 @@
M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF)
// Could do environment and echo later but not for now
+/**
+ * Stops all sounds we are "responsible" for. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_all_sounds(clear_channels = TRUE)
for(var/i in hearing_mobs)
terminate_sound_mob(i)
@@ -93,10 +78,16 @@
using_sound_channels = 0
SSsounds.free_datum_channels(src)
+/**
+ * Stops all sounds we are responsible for in a given person. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_sound_mob(mob/M)
for(var/channel in channels_playing)
M.stop_sound_channel(text2num(channel))
+/**
+ * Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster.
+ */
/datum/song/proc/pop_channel()
if(length(channels_idle)) //just pop one off of here if we have one available
. = text2num(channels_idle[1])
@@ -108,6 +99,12 @@
if(!isnull(.))
using_sound_channels++
+/**
+ * Decays our channels and updates their volumes to mobs who can hear us.
+ *
+ * Arguments:
+ * * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation.
+ */
/datum/song/proc/process_decay(wait_ds)
var/linear_dropoff = cached_linear_dropoff * wait_ds
var/exponential_dropoff = cached_exponential_dropoff ** wait_ds
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index c31008fa62..c17b62ba6c 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -35,18 +35,20 @@
return destinations
-/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
+/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent, force_entry = FALSE)
if(!turf_check(user))
return
var/list/L = get_destinations(user)
if(!L.len)
- to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.")
+ to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.")
return
var/chosen_beacon = pick(L)
- var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon))
+ var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), 100, null, FALSE, get_turf(chosen_beacon))
if(adjacent)
try_move_adjacent(J)
+ if(force_entry)
+ J.teleport(user, force = TRUE)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
@@ -73,7 +75,7 @@
if(user.get_item_by_slot(SLOT_BELT) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!")
SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation
- activate(user, FALSE)
+ activate(user, FALSE, TRUE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.")
@@ -84,9 +86,10 @@
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
mech_sized = TRUE //save your ripley
+ teleport_channel = TELEPORT_CHANNEL_WORMHOLE
innate_accuracy_penalty = 6
-/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
+/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M, force = FALSE)
. = ..()
if(.)
// KERPLUNK
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
index 899bf91081..d1f7f15ac9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm
@@ -14,14 +14,14 @@
name = "Standard"
icon_state = "standard"
-/datum/sprite_accessory/xeno_dorsal/royal
- name = "Royal"
- icon_state = "royal"
-
/datum/sprite_accessory/xeno_dorsal/down
name = "Dorsal Down"
icon_state = "down"
+/datum/sprite_accessory/xeno_dorsal/royal
+ name = "Royal"
+ icon_state = "royal"
+
/******************************************
************* Xeno Tails ******************
*******************************************/
@@ -57,14 +57,14 @@
name = "Standard"
icon_state = "standard"
-/datum/sprite_accessory/xeno_head/royal
- name = "royal"
- icon_state = "royal"
-
/datum/sprite_accessory/xeno_head/hollywood
name = "hollywood"
icon_state = "hollywood"
+/datum/sprite_accessory/xeno_head/royal
+ name = "royal"
+ icon_state = "royal"
+
/datum/sprite_accessory/xeno_head/warrior
name = "warrior"
icon_state = "warrior"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index a04838a360..5286acb33a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -16,6 +16,12 @@
icon_state = "dtiger"
gender_specific = 1
+/datum/sprite_accessory/body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
/datum/sprite_accessory/body_markings/ltiger
name = "Light Tiger Body"
icon_state = "ltiger"
@@ -49,11 +55,6 @@
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
relevant_layers = null
-/datum/sprite_accessory/mam_body_markings/plain
- name = "Plain"
- icon_state = "plain"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
icon_state = "redpanda"
@@ -77,14 +78,14 @@
icon_state = "bellyslim"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-/datum/sprite_accessory/mam_body_markings/corgi
- name = "Corgi"
- icon_state = "corgi"
-
/datum/sprite_accessory/mam_body_markings/cow
name = "Bovine"
icon_state = "bovine"
+/datum/sprite_accessory/mam_body_markings/corgi
+ name = "Corgi"
+ icon_state = "corgi"
+
/datum/sprite_accessory/mam_body_markings/corvid
name = "Corvid"
icon_state = "corvid"
@@ -139,15 +140,19 @@
name = "Hyena"
icon_state = "hyena"
-/datum/sprite_accessory/mam_body_markings/lab
- name = "Lab"
- icon_state = "lab"
-
/datum/sprite_accessory/mam_body_markings/insect
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+/datum/sprite_accessory/mam_body_markings/lab
+ name = "Lab"
+ icon_state = "lab"
+
+/datum/sprite_accessory/mam_body_markings/orca
+ name = "Orca"
+ icon_state = "orca"
+
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
icon_state = "otie"
@@ -156,14 +161,15 @@
name = "Otter"
icon_state = "otter"
-/datum/sprite_accessory/mam_body_markings/orca
- name = "Orca"
- icon_state = "orca"
-
/datum/sprite_accessory/mam_body_markings/panther
name = "Panther"
icon_state = "panther"
+/datum/sprite_accessory/mam_body_markings/plain
+ name = "Plain"
+ icon_state = "plain"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
/datum/sprite_accessory/mam_body_markings/possum
name = "Possum"
icon_state = "possum"
@@ -172,6 +178,10 @@
name = "Raccoon"
icon_state = "raccoon"
+/datum/sprite_accessory/mam_body_markings/sergal
+ name = "Sergal"
+ icon_state = "sergal"
+
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
@@ -181,18 +191,14 @@
name = "Shark"
icon_state = "shark"
-/datum/sprite_accessory/mam_body_markings/skunk
- name = "Skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_body_markings/sergal
- name = "Sergal"
- icon_state = "sergal"
-
/datum/sprite_accessory/mam_body_markings/shepherd
name = "Shepherd"
icon_state = "shepherd"
+/datum/sprite_accessory/mam_body_markings/skunk
+ name = "Skunk"
+ icon_state = "skunk"
+
/datum/sprite_accessory/mam_body_markings/tajaran
name = "Tajaran"
icon_state = "tajaran"
@@ -232,75 +238,10 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/insect_fluff/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/insect_fluff/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/insect_fluff/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/insect_fluff/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/insect_fluff/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/insect_fluff/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
/datum/sprite_accessory/insect_fluff/punished
name = "Burnt Off"
icon_state = "punished"
-/datum/sprite_accessory/insect_fluff/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/insect_fluff/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/insect_fluff/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/insect_fluff/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/insect_fluff/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/insect_fluff/snow
- name = "Snow"
- icon_state = "snow"
-
-/datum/sprite_accessory/insect_fluff/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
-/datum/sprite_accessory/insect_fluff/jungle
- name = "Jungle"
- icon_state = "jungle"
-
-/datum/sprite_accessory/insect_fluff/witchwing
- name = "Witch Wing"
- icon_state = "witchwing"
-
-/datum/sprite_accessory/insect_fluff/colored
- name = "Colored (Hair)"
- icon_state = "snow"
- color_src = HAIR
-
/datum/sprite_accessory/insect_fluff/colored1
name = "Colored (Primary)"
icon_state = "snow"
@@ -314,4 +255,69 @@
/datum/sprite_accessory/insect_fluff/colored3
name = "Colored (Tertiary)"
icon_state = "snow"
- color_src = MUTCOLORS3
\ No newline at end of file
+ color_src = MUTCOLORS3
+
+/datum/sprite_accessory/insect_fluff/colored
+ name = "Colored (Hair)"
+ icon_state = "snow"
+ color_src = HAIR
+
+/datum/sprite_accessory/insect_fluff/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/insect_fluff/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/insect_fluff/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/insect_fluff/jungle
+ name = "Jungle"
+ icon_state = "jungle"
+
+/datum/sprite_accessory/insect_fluff/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/insect_fluff/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/insect_fluff/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
+/datum/sprite_accessory/insect_fluff/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/insect_fluff/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/insect_fluff/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/insect_fluff/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/insect_fluff/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/insect_fluff/snow
+ name = "Snow"
+ icon_state = "snow"
+
+/datum/sprite_accessory/insect_fluff/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
+
+/datum/sprite_accessory/insect_fluff/witchwing
+ name = "Witch Wing"
+ icon_state = "witchwing"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 1e6c797364..7515ce560a 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -41,7 +41,7 @@
extra = TRUE
extra_color_src = NONE
-/datum/sprite_accessory/ears/human/bigwolfdark
+/datum/sprite_accessory/ears/human/bigwolfdark //ignore alphabetical sort here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
@@ -55,6 +55,12 @@
extra = TRUE
extra_color_src = NONE
+/datum/sprite_accessory/ears/bunny
+ name = "Bunny"
+ icon_state = "bunny"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+
/datum/sprite_accessory/ears/cat
name = "Cat"
icon_state = "cat"
@@ -74,6 +80,12 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MUTCOLORS3
+/datum/sprite_accessory/ears/lab
+ name = "Dog, Floppy"
+ icon_state = "lab"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+
/datum/sprite_accessory/ears/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -115,12 +127,6 @@
icon_state = "jellyfish"
color_src = HAIR
-/datum/sprite_accessory/ears/lab
- name = "Dog, Floppy"
- icon_state = "lab"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
@@ -133,18 +139,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-/datum/sprite_accessory/ears/human/pede
- name = "Scolipede"
- icon_state = "pede"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+/datum/sprite_accessory/ears/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = MATRIXED
+
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -169,12 +175,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-/datum/sprite_accessory/ears/bunny
- name = "Bunny"
- icon_state = "bunny"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
/******************************************
*************** Furry Ears ****************
*******************************************/
@@ -216,7 +216,7 @@
extra = TRUE
extra_color_src = NONE
-/datum/sprite_accessory/ears/mam_ears/bigwolfdark
+/datum/sprite_accessory/ears/mam_ears/bigwolfdark //alphabetical sort ignored here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
@@ -226,6 +226,10 @@
extra = TRUE
extra_color_src = NONE
+/datum/sprite_accessory/ears/mam_ears/bunny
+ name = "Bunny"
+ icon_state = "bunny"
+
/datum/sprite_accessory/ears/mam_ears/cat
name = "Cat"
icon_state = "cat"
@@ -256,13 +260,11 @@
name = "Eevee"
icon_state = "eevee"
-
/datum/sprite_accessory/ears/mam_ears/elf
name = "Elf"
icon_state = "elf"
color_src = MUTCOLORS3
-
/datum/sprite_accessory/ears/mam_ears/elephant
name = "Elephant"
icon_state = "elephant"
@@ -283,15 +285,15 @@
name = "Husky"
icon_state = "wolf"
-/datum/sprite_accessory/ears/mam_ears/kangaroo
- name = "kangaroo"
- icon_state = "kangaroo"
-
/datum/sprite_accessory/ears/mam_ears/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
+/datum/sprite_accessory/ears/mam_ears/kangaroo
+ name = "kangaroo"
+ icon_state = "kangaroo"
+
/datum/sprite_accessory/ears/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
@@ -304,18 +306,14 @@
name = "Otusian"
icon_state = "otie"
-/datum/sprite_accessory/ears/mam_ears/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
+/datum/sprite_accessory/ears/mam_ears/rabbit
+ name = "Rabbit"
+ icon_state = "rabbit"
/datum/sprite_accessory/ears/mam_ears/pede
name = "Scolipede"
icon_state = "pede"
-/datum/sprite_accessory/ears/mam_ears/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
-
/datum/sprite_accessory/ears/mam_ears/sergal
name = "Sergal"
icon_state = "sergal"
@@ -324,10 +322,10 @@
name = "skunk"
icon_state = "skunk"
+/datum/sprite_accessory/ears/mam_ears/squirrel
+ name = "Squirrel"
+ icon_state = "squirrel"
+
/datum/sprite_accessory/ears/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
-
-/datum/sprite_accessory/ears/mam_ears/bunny
- name = "Bunny"
- icon_state = "bunny"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
index 18a76df116..49013161a9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm
@@ -11,6 +11,10 @@
icon_state = "none"
relevant_layers = null
+/datum/sprite_accessory/frills/aquatic
+ name = "Aquatic"
+ icon_state = "aqua"
+
/datum/sprite_accessory/frills/simple
name = "Simple"
icon_state = "simple"
@@ -18,7 +22,3 @@
/datum/sprite_accessory/frills/short
name = "Short"
icon_state = "short"
-
-/datum/sprite_accessory/frills/aquatic
- name = "Aquatic"
- icon_state = "aqua"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
index 34988f5656..a07fdaa5d3 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
@@ -6,6 +6,10 @@
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
// please make sure they're sorted alphabetically and categorized
+/datum/sprite_accessory/facial_hair/shaved //this is exempt from the alphabetical sort
+ name = "Shaved"
+ icon_state = null
+ gender = NEUTER
/datum/sprite_accessory/facial_hair/threeoclock
name = "Beard (3 o\'Clock)"
@@ -135,11 +139,6 @@
name = "Mutton Chops with Moustache"
icon_state = "facial_muttonmus"
-/datum/sprite_accessory/facial_hair/shaved
- name = "Shaved"
- icon_state = null
- gender = NEUTER
-
/datum/sprite_accessory/facial_hair/sideburn
name = "Sideburns"
icon_state = "facial_sideburns"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 138704067d..8e4e6ad617 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -9,6 +9,10 @@
// try to spell
// you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/bald //this is exempt from the alphabetical sort
+ name = "Bald"
+ icon_state = "bald"
+
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
@@ -25,10 +29,6 @@
name = "Ahoge"
icon_state = "hair_antenna"
-/datum/sprite_accessory/hair/bald
- name = "Bald"
- icon_state = "bald"
-
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
index 3a65eaebfa..aff342c7a6 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm
@@ -12,22 +12,10 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/horns/simple
- name = "Simple"
- icon_state = "simple"
-
-/datum/sprite_accessory/horns/short
- name = "Short"
- icon_state = "short"
-
/datum/sprite_accessory/horns/curled
name = "Curled"
icon_state = "curled"
-/datum/sprite_accessory/horns/ram
- name = "Ram"
- icon_state = "ram"
-
/datum/sprite_accessory/horns/angler
name = "Angeler"
icon_state = "angler"
@@ -40,3 +28,15 @@
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
+
+/datum/sprite_accessory/horns/ram
+ name = "Ram"
+ icon_state = "ram"
+
+/datum/sprite_accessory/horns/simple
+ name = "Simple"
+ icon_state = "simple"
+
+/datum/sprite_accessory/horns/short
+ name = "Short"
+ icon_state = "short"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
index 110ac69201..6019245b80 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
@@ -11,96 +11,90 @@
name = "Blank"
icon_state = "blank"
-/datum/sprite_accessory/screen/pink
- name = "Pink"
- icon_state = "pink"
-
-/datum/sprite_accessory/screen/green
- name = "Green"
- icon_state = "green"
-
-/datum/sprite_accessory/screen/red
- name = "Red"
- icon_state = "red"
-
/datum/sprite_accessory/screen/blue
name = "Blue"
icon_state = "blue"
-/datum/sprite_accessory/screen/yellow
- name = "Yellow"
- icon_state = "yellow"
-
-/datum/sprite_accessory/screen/shower
- name = "Shower"
- icon_state = "shower"
-
-/datum/sprite_accessory/screen/nature
- name = "Nature"
- icon_state = "nature"
-
-/datum/sprite_accessory/screen/eight
- name = "Eight"
- icon_state = "eight"
-
-/datum/sprite_accessory/screen/goggles
- name = "Goggles"
- icon_state = "goggles"
-
-/datum/sprite_accessory/screen/heart
- name = "Heart"
- icon_state = "heart"
-
-/datum/sprite_accessory/screen/monoeye
- name = "Mono eye"
- icon_state = "monoeye"
-
/datum/sprite_accessory/screen/breakout
name = "Breakout"
icon_state = "breakout"
-/datum/sprite_accessory/screen/purple
- name = "Purple"
- icon_state = "purple"
-
-/datum/sprite_accessory/screen/scroll
- name = "Scroll"
- icon_state = "scroll"
+/datum/sprite_accessory/screen/bsod
+ name = "BSOD"
+ icon_state = "bsod"
/datum/sprite_accessory/screen/console
name = "Console"
icon_state = "console"
-/datum/sprite_accessory/screen/rgb
- name = "RGB"
- icon_state = "rgb"
+/datum/sprite_accessory/screen/eight
+ name = "Eight"
+ icon_state = "eight"
+
+/datum/sprite_accessory/screen/eyes
+ name = "Eyes"
+ icon_state = "eyes"
+
+/datum/sprite_accessory/screen/ecgwave
+ name = "ECG wave"
+ icon_state = "ecgwave"
+
+/datum/sprite_accessory/screen/green
+ name = "Green"
+ icon_state = "green"
+
+/datum/sprite_accessory/screen/goggles
+ name = "Goggles"
+ icon_state = "goggles"
/datum/sprite_accessory/screen/golglider
name = "Gol Glider"
icon_state = "golglider"
+/datum/sprite_accessory/screen/heart
+ name = "Heart"
+ icon_state = "heart"
+
+/datum/sprite_accessory/screen/pink
+ name = "Pink"
+ icon_state = "pink"
+
+/datum/sprite_accessory/screen/red
+ name = "Red"
+ icon_state = "red"
+
+/datum/sprite_accessory/screen/monoeye
+ name = "Mono eye"
+ icon_state = "monoeye"
+
+/datum/sprite_accessory/screen/nature
+ name = "Nature"
+ icon_state = "nature"
+
+/datum/sprite_accessory/screen/purple
+ name = "Purple"
+ icon_state = "purple"
+
/datum/sprite_accessory/screen/rainbow
name = "Rainbow"
icon_state = "rainbow"
-/datum/sprite_accessory/screen/sunburst
- name = "Sunburst"
- icon_state = "sunburst"
-
-/datum/sprite_accessory/screen/static
- name = "Static"
- icon_state = "static"
-
-//Oracle Station sprites
-
-/datum/sprite_accessory/screen/bsod
- name = "BSOD"
- icon_state = "bsod"
-
/datum/sprite_accessory/screen/redtext
name = "Red Text"
icon_state = "retext"
+/datum/sprite_accessory/screen/rgb
+ name = "RGB"
+ icon_state = "rgb"
+
+/datum/sprite_accessory/screen/scroll
+ name = "Scroll"
+ icon_state = "scroll"
+
+/datum/sprite_accessory/screen/shower
+ name = "Shower"
+ icon_state = "shower"
+
/datum/sprite_accessory/screen/sinewave
name = "Sine wave"
icon_state = "sinewave"
@@ -109,22 +103,25 @@
name = "Square wave"
icon_state = "squarwave"
-/datum/sprite_accessory/screen/ecgwave
- name = "ECG wave"
- icon_state = "ecgwave"
+/datum/sprite_accessory/screen/stars
+ name = "Stars"
+ icon_state = "stars"
-/datum/sprite_accessory/screen/eyes
- name = "Eyes"
- icon_state = "eyes"
+/datum/sprite_accessory/screen/static
+ name = "Static"
+ icon_state = "static"
+
+/datum/sprite_accessory/screen/sunburst
+ name = "Sunburst"
+ icon_state = "sunburst"
/datum/sprite_accessory/screen/textdrop
name = "Text drop"
icon_state = "textdrop"
-/datum/sprite_accessory/screen/stars
- name = "Stars"
- icon_state = "stars"
-
+/datum/sprite_accessory/screen/yellow
+ name = "Yellow"
+ icon_state = "yellow"
/******************************************
************** IPC Antennas ***************
@@ -145,14 +142,6 @@
name = "Angled Antennae"
icon_state = "antennae"
-/datum/sprite_accessory/antenna/tvantennae
- name = "TV Antennae"
- icon_state = "tvantennae"
-
-/datum/sprite_accessory/antenna/cyberhead
- name = "Cyberhead"
- icon_state = "cyberhead"
-
/datum/sprite_accessory/antenna/antlers
name = "Antlers"
icon_state = "antlers"
@@ -160,3 +149,11 @@
/datum/sprite_accessory/antenna/crowned
name = "Crowned"
icon_state = "crowned"
+
+/datum/sprite_accessory/antenna/cyberhead
+ name = "Cyberhead"
+ icon_state = "cyberhead"
+
+/datum/sprite_accessory/antenna/tvantennae
+ name = "TV Antennae"
+ icon_state = "tvantennae"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
index d41f5ace22..6f7b955d8f 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
@@ -49,6 +49,13 @@
relevant_layers = null
hide_legs = FALSE
+/datum/sprite_accessory/taur/canine
+ name = "Canine"
+ icon_state = "canine"
+ taur_mode = STYLE_PAW_TAURIC
+ color_src = MUTCOLORS
+ extra = TRUE
+
/datum/sprite_accessory/taur/cow
name = "Cow"
icon_state = "cow"
@@ -95,6 +102,13 @@
color_src = MUTCOLORS
extra = TRUE
+/datum/sprite_accessory/taur/feline
+ name = "Feline"
+ icon_state = "feline"
+ taur_mode = STYLE_PAW_TAURIC
+ color_src = MUTCOLORS
+ extra = TRUE
+
/datum/sprite_accessory/taur/horse
name = "Horse"
icon_state = "horse"
@@ -126,17 +140,3 @@
taur_mode = STYLE_SNEK_TAURIC
color_src = MUTCOLORS
hide_legs = USE_SNEK_CLIP_MASK
-
-/datum/sprite_accessory/taur/canine
- name = "Canine"
- icon_state = "canine"
- taur_mode = STYLE_PAW_TAURIC
- color_src = MUTCOLORS
- extra = TRUE
-
-/datum/sprite_accessory/taur/feline
- name = "Feline"
- icon_state = "feline"
- taur_mode = STYLE_PAW_TAURIC
- color_src = MUTCOLORS
- extra = TRUE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
index 2e14a88f29..99d2c67cc9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
@@ -7,14 +7,19 @@
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
-/datum/sprite_accessory/snouts/sharp
- name = "Sharp"
- icon_state = "sharp"
+/datum/sprite_accessory/snout/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
/datum/sprite_accessory/snouts/round
name = "Round"
icon_state = "round"
+/datum/sprite_accessory/snouts/sharp
+ name = "Sharp"
+ icon_state = "sharp"
+
/datum/sprite_accessory/snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
@@ -23,11 +28,6 @@
name = "Round + Light"
icon_state = "roundlight"
-/datum/sprite_accessory/snout/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
-
//christ this was a mistake, but it's here just in case someone wants to selectively fix -- Pooj
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
@@ -157,7 +157,7 @@
/datum/sprite_accessory/snouts/mam_snouts
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- recommended_species = list("mammal", "slimeperson", "insect", "podweak")
+ recommended_species = list("mammal", "slimeperson", "insect", "podweak", "lizard")
mutant_part_string = "snout"
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
@@ -192,13 +192,21 @@
extra = TRUE
extra_color_src = MUTCOLORS3
-/datum/sprite_accessory/mam_snouts/skulldog
- name = "Skulldog"
- icon_state = "skulldog"
- extra = TRUE
- extra_color_src = MATRIXED
+/datum/sprite_accessory/snouts/mam_snouts/husky
+ name = "Husky"
+ icon_state = "husky"
-/datum/sprite_accessory/mam_snouts/lcanid
+/datum/sprite_accessory/snouts/mam_snouts/rhino
+ name = "Horn"
+ icon_state = "rhino"
+ extra = TRUE
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/mam_snouts/rodent
+ name = "Rodent"
+ icon_state = "rodent"
+
+/datum/sprite_accessory/snouts/mam_snouts/lcanid
name = "Mammal, Long"
icon_state = "lcanid"
@@ -226,32 +234,20 @@
name = "Mammal, Thick ALT"
icon_state = "wolfalt"
-/datum/sprite_accessory/snouts/mam_snouts/redpanda
- name = "WahCoon"
- icon_state = "wah"
-
-/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
- name = "WahCoon ALT"
- icon_state = "wahalt"
-
-/datum/sprite_accessory/snouts/mam_snouts/rhino
- name = "Horn"
- icon_state = "rhino"
- extra = TRUE
- extra = MUTCOLORS3
-
-/datum/sprite_accessory/snouts/mam_snouts/rodent
- name = "Rodent"
- icon_state = "rodent"
-
-/datum/sprite_accessory/snouts/mam_snouts/husky
- name = "Husky"
- icon_state = "husky"
-
/datum/sprite_accessory/snouts/mam_snouts/otie
name = "Otie"
icon_state = "otie"
+/datum/sprite_accessory/snouts/mam_snouts/round
+ name = "Round"
+ icon_state = "round"
+ color_src = MUTCOLORS
+
+/datum/sprite_accessory/snouts/mam_snouts/roundlight
+ name = "Round + Light"
+ icon_state = "roundlight"
+ color_src = MUTCOLORS
+
/datum/sprite_accessory/snouts/mam_snouts/pede
name = "Scolipede"
icon_state = "pede"
@@ -268,30 +264,33 @@
name = "hShark"
icon_state = "hshark"
-/datum/sprite_accessory/snouts/mam_snouts/toucan
- name = "Toucan"
- icon_state = "toucan"
-
/datum/sprite_accessory/snouts/mam_snouts/sharp
name = "Sharp"
icon_state = "sharp"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/round
- name = "Round"
- icon_state = "round"
- color_src = MUTCOLORS
-
/datum/sprite_accessory/snouts/mam_snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/roundlight
- name = "Round + Light"
- icon_state = "roundlight"
- color_src = MUTCOLORS
+/datum/sprite_accessory/snouts/mam_snouts/skulldog
+ name = "Skulldog"
+ icon_state = "skulldog"
+ extra = TRUE
+ extra_color_src = MATRIXED
+/datum/sprite_accessory/snouts/mam_snouts/toucan
+ name = "Toucan"
+ icon_state = "toucan"
+
+/datum/sprite_accessory/snouts/mam_snouts/redpanda
+ name = "WahCoon"
+ icon_state = "wah"
+
+/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
+ name = "WahCoon ALT"
+ icon_state = "wahalt"
/******************************************
**************** Snouts *******************
@@ -318,6 +317,16 @@
extra = TRUE
extra_color_src = MUTCOLORS3
+/datum/sprite_accessory/snouts/mam_snouts/frhino
+ name = "Horn (Top)"
+ icon_state = "frhino"
+ extra = TRUE
+ extra = MUTCOLORS3
+
+/datum/sprite_accessory/snouts/mam_snouts/fhusky
+ name = "Husky (Top)"
+ icon_state = "fhusky"
+
/datum/sprite_accessory/snouts/mam_snouts/flcanid
name = "Mammal, Long (Top)"
icon_state = "flcanid"
@@ -346,27 +355,23 @@
name = "Mammal, Thick ALT (Top)"
icon_state = "fwolfalt"
-/datum/sprite_accessory/snouts/mam_snouts/fredpanda
- name = "WahCoon (Top)"
- icon_state = "fwah"
-
-/datum/sprite_accessory/snouts/mam_snouts/frhino
- name = "Horn (Top)"
- icon_state = "frhino"
- extra = TRUE
- extra = MUTCOLORS3
+/datum/sprite_accessory/snouts/mam_snouts/fotie
+ name = "Otie (Top)"
+ icon_state = "fotie"
/datum/sprite_accessory/snouts/mam_snouts/frodent
name = "Rodent (Top)"
icon_state = "frodent"
-/datum/sprite_accessory/snouts/mam_snouts/fhusky
- name = "Husky (Top)"
- icon_state = "fhusky"
+/datum/sprite_accessory/snouts/mam_snouts/fround
+ name = "Round (Top)"
+ icon_state = "fround"
+ color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/fotie
- name = "Otie (Top)"
- icon_state = "fotie"
+/datum/sprite_accessory/snouts/mam_snouts/froundlight
+ name = "Round + Light (Top)"
+ icon_state = "froundlight"
+ color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fpede
name = "Scolipede (Top)"
@@ -380,26 +385,20 @@
name = "Shark (Top)"
icon_state = "fshark"
-/datum/sprite_accessory/snouts/mam_snouts/ftoucan
- name = "Toucan (Top)"
- icon_state = "ftoucan"
-
/datum/sprite_accessory/snouts/mam_snouts/fsharp
name = "Sharp (Top)"
icon_state = "fsharp"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/fround
- name = "Round (Top)"
- icon_state = "fround"
- color_src = MUTCOLORS
-
/datum/sprite_accessory/snouts/mam_snouts/fsharplight
name = "Sharp + Light (Top)"
icon_state = "fsharplight"
color_src = MUTCOLORS
-/datum/sprite_accessory/snouts/mam_snouts/froundlight
- name = "Round + Light (Top)"
- icon_state = "froundlight"
- color_src = MUTCOLORS
+/datum/sprite_accessory/snouts/mam_snouts/ftoucan
+ name = "Toucan (Top)"
+ icon_state = "ftoucan"
+
+/datum/sprite_accessory/snouts/mam_snouts/fredpanda
+ name = "WahCoon (Top)"
+ icon_state = "fwah"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
index 19ec677a72..ffb808eede 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm
@@ -20,6 +20,10 @@
name = "Knee-high - Bee"
icon_state = "bee_knee"
+/datum/sprite_accessory/underwear/socks/christmas_knee
+ name = "Knee-High - Christmas"
+ icon_state = "christmas_knee"
+
/datum/sprite_accessory/underwear/socks/commie_knee
name = "Knee-High - Commie"
icon_state = "commie_knee"
@@ -32,6 +36,14 @@
name = "Knee-high - Rainbow"
icon_state = "rainbow_knee"
+/datum/sprite_accessory/underwear/socks/candycaner_knee
+ name = "Knee-High - Red Candy Cane"
+ icon_state = "candycaner_knee"
+
+/datum/sprite_accessory/underwear/socks/candycaneg_knee //ignore alphabetisation for ease of use in scenarios like this
+ name = "Knee-High - Green Candy Cane"
+ icon_state = "candycaneg_knee"
+
/datum/sprite_accessory/underwear/socks/striped_knee
name = "Knee-high - Striped"
icon_state = "striped_knee"
@@ -46,18 +58,6 @@
name = "Knee-High - UK"
icon_state = "uk_knee"
-/datum/sprite_accessory/underwear/socks/christmas_knee
- name = "Knee-High - Christmas"
- icon_state = "christmas_knee"
-
-/datum/sprite_accessory/underwear/socks/candycaner_knee
- name = "Knee-High - Red Candy Cane"
- icon_state = "candycaner_knee"
-
-/datum/sprite_accessory/underwear/socks/candycaneg_knee
- name = "Knee-High - Green Candy Cane"
- icon_state = "candycaneg_knee"
-
/datum/sprite_accessory/underwear/socks/socks_norm
name = "Normal"
icon_state = "socks_norm"
@@ -129,22 +129,34 @@
name = "Thigh-high - Bee"
icon_state = "bee_thigh"
+/datum/sprite_accessory/underwear/socks/christmas_thigh
+ name = "Thigh-high - Christmas"
+ icon_state = "christmas_thigh"
+
/datum/sprite_accessory/underwear/socks/commie_thigh
name = "Thigh-high - Commie"
icon_state = "commie_thigh"
-/datum/sprite_accessory/underwear/socks/usa_thigh
- name = "Thigh-high - Freedom"
- icon_state = "assblastusa_thigh"
-
/datum/sprite_accessory/underwear/socks/fishnet
name = "Thigh-high - Fishnet"
icon_state = "fishnet"
+/datum/sprite_accessory/underwear/socks/usa_thigh
+ name = "Thigh-high - Freedom"
+ icon_state = "assblastusa_thigh"
+
/datum/sprite_accessory/underwear/socks/rainbow_thigh
name = "Thigh-high - Rainbow"
icon_state = "rainbow_thigh"
+/datum/sprite_accessory/underwear/socks/candycaner_thigh
+ name = "Thigh-high - Red Candy Cane"
+ icon_state = "candycaner_thigh"
+
+/datum/sprite_accessory/underwear/socks/candycaneg_thigh
+ name = "Thigh-high - Green Candy Cane"
+ icon_state = "candycaneg_thigh"
+
/datum/sprite_accessory/underwear/socks/striped_thigh
name = "Thigh-high - Striped"
icon_state = "striped_thigh"
@@ -157,16 +169,4 @@
/datum/sprite_accessory/underwear/socks/uk_thigh
name = "Thigh-high - UK"
- icon_state = "uk_thigh"
-
-/datum/sprite_accessory/underwear/socks/christmas_thigh
- name = "Thigh-high - Christmas"
- icon_state = "christmas_thigh"
-
-/datum/sprite_accessory/underwear/socks/candycaner_thigh
- name = "Thigh-high - Red Candy Cane"
- icon_state = "candycaner_thigh"
-
-/datum/sprite_accessory/underwear/socks/candycaneg_thigh
- name = "Thigh-high - Green Candy Cane"
- icon_state = "candycaneg_thigh"
\ No newline at end of file
+ icon_state = "uk_thigh"
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
index 83415ed375..5d7207c934 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm
@@ -21,21 +21,13 @@
name = "None"
icon_state = "none"
-/datum/sprite_accessory/spines/short
- name = "Short"
- icon_state = "short"
+/datum/sprite_accessory/spines/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
-/datum/sprite_accessory/spines_animated/short
- name = "Short"
- icon_state = "short"
-
-/datum/sprite_accessory/spines/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
-
-/datum/sprite_accessory/spines_animated/shortmeme
- name = "Short + Membrane"
- icon_state = "shortmeme"
+/datum/sprite_accessory/spines_animated/aqautic
+ name = "Aquatic"
+ icon_state = "aqua"
/datum/sprite_accessory/spines/long
name = "Long"
@@ -53,10 +45,18 @@
name = "Long + Membrane"
icon_state = "longmeme"
-/datum/sprite_accessory/spines/aqautic
- name = "Aquatic"
- icon_state = "aqua"
+/datum/sprite_accessory/spines/short
+ name = "Short"
+ icon_state = "short"
-/datum/sprite_accessory/spines_animated/aqautic
- name = "Aquatic"
- icon_state = "aqua"
+/datum/sprite_accessory/spines_animated/short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/spines/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
+
+/datum/sprite_accessory/spines_animated/shortmeme
+ name = "Short + Membrane"
+ icon_state = "shortmeme"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
index 16531d8f06..9addd15dca 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
@@ -25,12 +25,6 @@
icon_state = "synthliz_tertunder"
//Synth body markings
-/datum/sprite_accessory/mam_body_markings/synthliz
- recommended_species = list("synthliz")
- icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
- name = "Synthetic Lizard - Plates"
- icon_state = "synthlizscutes"
-
/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs"
@@ -41,6 +35,12 @@
name = "Synthetic Lizard - Pecs Light"
icon_state = "synthlizpecslight"
+/datum/sprite_accessory/mam_body_markings/synthliz
+ recommended_species = list("synthliz")
+ icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
+ name = "Synthetic Lizard - Plates"
+ icon_state = "synthlizscutes"
+
//Synth tails
/datum/sprite_accessory/tails/mam_tails/synthliz
recommended_species = list("synthliz")
@@ -70,17 +70,17 @@
name = "Synthetic Lizard - Curled"
icon_state = "synth_curled"
-/datum/sprite_accessory/antenna/synthliz/synthliz_thick
+/datum/sprite_accessory/antenna/synthliz/synth_horns
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
- name = "Synthetic Lizard - Thick"
- icon_state = "synth_thick"
+ name = "Synthetic Lizard - Horns"
+ icon_state = "synth_horns"
-/datum/sprite_accessory/antenna/synthliz/synth_thicklight
+/datum/sprite_accessory/antenna/synthliz/synth_hornslight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
- name = "Synthetic Lizard - Thick Light"
- icon_state = "synth_thicklight"
+ name = "Synthetic Lizard - Horns Light"
+ icon_state = "synth_hornslight"
/datum/sprite_accessory/antenna/synthliz/synth_short
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
@@ -100,17 +100,17 @@
name = "Synthetic Lizard - Sharp Light"
icon_state = "synth_sharplight"
-/datum/sprite_accessory/antenna/synthliz/synth_horns
+/datum/sprite_accessory/antenna/synthliz/synthliz_thick
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
- name = "Synthetic Lizard - Horns"
- icon_state = "synth_horns"
+ name = "Synthetic Lizard - Thick"
+ icon_state = "synth_thick"
-/datum/sprite_accessory/antenna/synthliz/synth_hornslight
+/datum/sprite_accessory/antenna/synthliz/synth_thicklight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
- name = "Synthetic Lizard - Horns Light"
- icon_state = "synth_hornslight"
+ name = "Synthetic Lizard - Thick Light"
+ icon_state = "synth_thicklight"
//Synth Taurs (Ported from Virgo)
/datum/sprite_accessory/taur/synthliz
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 812e0c052c..d9e2de1525 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -18,38 +18,7 @@
/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"])
-/datum/sprite_accessory/tails/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails_animated/lizard/smooth
- name = "Smooth"
- icon_state = "smooth"
-
-/datum/sprite_accessory/tails/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails_animated/lizard/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails_animated/lizard/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
-/datum/sprite_accessory/tails_animated/lizard/spikes
- name = "Spikes"
- icon_state = "spikes"
-
+//this goes first regardless of alphabetical order
/datum/sprite_accessory/tails/lizard/none
name = "None"
icon_state = "None"
@@ -72,11 +41,13 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+/datum/sprite_accessory/tails/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails_animated/lizard/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
@@ -90,6 +61,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/lizard/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails_animated/lizard/smooth
+ name = "Smooth"
+ icon_state = "smooth"
+
+/datum/sprite_accessory/tails/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
+/datum/sprite_accessory/tails_animated/lizard/spikes
+ name = "Spikes"
+ icon_state = "spikes"
+
/******************************************
************** Human Tails ****************
*******************************************/
@@ -107,18 +102,6 @@
/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"])
-/datum/sprite_accessory/tails/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -199,6 +182,14 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/tails/human/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
+/datum/sprite_accessory/tails_animated/human/corvid
+ name = "Corvid"
+ icon_state = "crow"
+
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -211,13 +202,25 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-/datum/sprite_accessory/tails/human/corvid
- name = "Corvid"
- icon_state = "crow"
+/datum/sprite_accessory/tails/human/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
-/datum/sprite_accessory/tails_animated/human/corvid
- name = "Corvid"
- icon_state = "crow"
+/datum/sprite_accessory/tails_animated/human/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/tails/human/datashark
+ name = "datashark"
+ icon_state = "datashark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/datashark
+ name = "datashark"
+ icon_state = "datashark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
@@ -298,7 +301,7 @@
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/insect
- name = "insect"
+ name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
@@ -315,6 +318,14 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/tails_animated/human/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -327,18 +338,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
/datum/sprite_accessory/tails/orca
name = "Orca"
icon_state = "orca"
@@ -351,15 +350,15 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails/human/otie
+ name = "Otusian"
+ icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails_animated/human/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails_animated/human/otie
+ name = "Otusian"
+ icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
@@ -375,6 +374,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/tails_animated/human/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/tails/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/pede
+ name = "Scolipede"
+ icon_state = "pede"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -387,6 +410,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/tails/human/shark
+ name = "Shark"
+ icon_state = "shark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/human/shark
+ name = "Shark"
+ icon_state = "shark"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -415,30 +450,6 @@
name = "Spikes"
icon_state = "spikes"
-/datum/sprite_accessory/tails/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
/datum/sprite_accessory/tails/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -495,22 +506,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-/datum/sprite_accessory/tails/human/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails_animated/human/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
-
-/datum/sprite_accessory/tails/human/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
-/datum/sprite_accessory/tails_animated/human/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
-
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -554,16 +549,6 @@
icon_state = "none"
relevant_layers = null
-/datum/sprite_accessory/tails/mam_tails/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
/datum/sprite_accessory/tails/mam_tails/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -638,6 +623,18 @@
name = "Cow"
icon_state = "cow"
+/datum/sprite_accessory/tails/mam_tails/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
+ name = "Dark Tiger"
+ icon_state = "dtiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
/datum/sprite_accessory/tails/mam_tails/eevee
name = "Eevee"
icon_state = "eevee"
@@ -728,6 +725,18 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Lab"
icon_state = "lab"
+/datum/sprite_accessory/tails/mam_tails/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
+ name = "Light Tiger"
+ icon_state = "ltiger"
+ color_src = MUTCOLORS
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+
/datum/sprite_accessory/tails/mam_tails/murid
name = "Murid"
icon_state = "murid"
@@ -736,14 +745,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Murid"
icon_state = "murid"
-/datum/sprite_accessory/tails/mam_tails/otie
- name = "Otusian"
- icon_state = "otie"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
- name = "Otusian"
- icon_state = "otie"
-
/datum/sprite_accessory/tails/mam_tails/orca
name = "Orca"
icon_state = "orca"
@@ -752,13 +753,13 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Orca"
icon_state = "orca"
-/datum/sprite_accessory/tails/mam_tails/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails/mam_tails/otie
+ name = "Otusian"
+ icon_state = "otie"
-/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
- name = "Scolipede"
- icon_state = "pede"
+/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
+ name = "Otusian"
+ icon_state = "otie"
/datum/sprite_accessory/tails/mam_tails/rabbit
name = "Rabbit"
@@ -768,6 +769,24 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Rabbit"
icon_state = "rabbit"
+/datum/sprite_accessory/tails/mam_tails/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ extra = TRUE
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
+ name = "Red Panda"
+ icon_state = "wah"
+ extra = TRUE
+
+/datum/sprite_accessory/tails/mam_tails/pede
+ name = "Scolipede"
+ icon_state = "pede"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
+ name = "Scolipede"
+ icon_state = "pede"
+
/datum/sprite_accessory/tails/mam_tails/sergal
name = "Sergal"
icon_state = "sergal"
@@ -776,6 +795,22 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Sergal"
icon_state = "sergal"
+/datum/sprite_accessory/tails/mam_tails/shark
+ name = "Shark"
+ icon_state = "shark"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
+ name = "Shark"
+ icon_state = "shark"
+
+/datum/sprite_accessory/tails/mam_tails/shepherd
+ name = "Shepherd"
+ icon_state = "shepherd"
+
+/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
+ name = "Shepherd"
+ icon_state = "shepherd"
+
/datum/sprite_accessory/tails/mam_tails/skunk
name = "Skunk"
icon_state = "skunk"
@@ -808,22 +843,6 @@ datum/sprite_accessory/tails/mam_tails/insect
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
-/datum/sprite_accessory/tails/mam_tails/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/tails/mam_tails/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
/datum/sprite_accessory/tails/mam_tails/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -864,30 +883,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Tiger"
icon_state = "tiger"
-/datum/sprite_accessory/tails/mam_tails/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
- name = "Dark Tiger"
- icon_state = "dtiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails/mam_tails/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
-/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
- name = "Light Tiger"
- icon_state = "ltiger"
- color_src = MUTCOLORS
- icon = 'icons/mob/mutant_bodyparts.dmi'
-
/datum/sprite_accessory/tails/mam_tails/wolf
name = "Wolf"
icon_state = "wolf"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
index b8282931d2..1be02c207e 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
@@ -12,6 +12,38 @@
// please make sure they're sorted alphabetically and categorized
+/datum/sprite_accessory/underwear/top/cowboyshirt
+ name = "Cowboy Shirt Black"
+ icon_state = "cowboyshirt"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/red
+ name = "Cowboy Shirt Red"
+ icon_state = "cowboyshirt_red"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/navy
+ name = "Cowboy Shirt Navy"
+ icon_state = "cowboyshirt_navy"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/white
+ name = "Cowboy Shirt White"
+ icon_state = "cowboyshirt_white"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/s
+ name = "Cowboy Shirt Shortsleeved Black"
+ icon_state = "cowboyshirt_s"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
+ name = "Cowboy Shirt Shortsleeved Red"
+ icon_state = "cowboyshirt_reds"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
+ name = "Cowboy Shirt Shortsleeved Navy"
+ icon_state = "cowboyshirt_navys"
+
+/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
+ name = "Cowboy Shirt Shortsleeved White"
+ icon_state = "cowboyshirt_whites"
+
/datum/sprite_accessory/underwear/top/longjon
name = "Long John Shirt"
icon_state = "ljont"
@@ -30,36 +62,6 @@
icon_state = "undershirt"
has_color = TRUE
-/datum/sprite_accessory/underwear/top/bowlingw
- name = "Shirt - Bowling"
- icon_state = "bowlingw"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/bowling
- name = "Shirt, Bowling - Red"
- icon_state = "bowling"
-
-/datum/sprite_accessory/underwear/top/bowlingp
- name = "Shirt, Bowling - Pink"
- icon_state = "bowlingp"
-
-/datum/sprite_accessory/underwear/top/bowlinga
- name = "Shirt, Bowling - Aqua"
- icon_state = "bowlinga"
-
-/datum/sprite_accessory/underwear/top/bluejersey
- name = "Shirt, Jersey - Blue"
- icon_state = "shirt_bluejersey"
-
-/datum/sprite_accessory/underwear/top/redjersey
- name = "Shirt, Jersey - Red"
- icon_state = "shirt_redjersey"
-
-/datum/sprite_accessory/underwear/top/polo
- name = "Shirt - Polo"
- icon_state = "polo"
- has_color = TRUE
-
/datum/sprite_accessory/underwear/top/alienshirt
name = "Shirt - Alien"
icon_state = "shirt_alien"
@@ -72,6 +74,23 @@
name = "Shirt - Bee"
icon_state = "bee_shirt"
+/datum/sprite_accessory/underwear/top/bowlingw
+ name = "Shirt - Bowling"
+ icon_state = "bowlingw"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/bowlinga
+ name = "Shirt, Bowling - Aqua"
+ icon_state = "bowlinga"
+
+/datum/sprite_accessory/underwear/top/bowling
+ name = "Shirt, Bowling - Red"
+ icon_state = "bowling"
+
+/datum/sprite_accessory/underwear/top/bowlingp
+ name = "Shirt, Bowling - Pink"
+ icon_state = "bowlingp"
+
/datum/sprite_accessory/underwear/top/clownshirt
name = "Shirt - Clown"
icon_state = "shirt_clown"
@@ -88,6 +107,14 @@
name = "Shirt - I Love NT"
icon_state = "ilovent"
+/datum/sprite_accessory/underwear/top/bluejersey
+ name = "Shirt, Jersey - Blue"
+ icon_state = "shirt_bluejersey"
+
+/datum/sprite_accessory/underwear/top/redjersey
+ name = "Shirt, Jersey - Red"
+ icon_state = "shirt_redjersey"
+
/datum/sprite_accessory/underwear/top/lover
name = "Shirt - Lover"
icon_state = "lover"
@@ -112,6 +139,11 @@
name = "Shirt - Pogoman"
icon_state = "pogoman"
+/datum/sprite_accessory/underwear/top/polo
+ name = "Shirt - Polo"
+ icon_state = "polo"
+ has_color = TRUE
+
/datum/sprite_accessory/underwear/top/question
name = "Shirt - Question"
icon_state = "shirt_question"
@@ -120,6 +152,23 @@
name = "Shirt - Skull"
icon_state = "shirt_skull"
+/datum/sprite_accessory/underwear/top/shortsleeve
+ name = "Shirt - Short Sleeved"
+ icon_state = "shortsleeve"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/blueshirtsport
+ name = "Shirt, Sports - Blue"
+ icon_state = "blueshirtsport"
+
+/datum/sprite_accessory/underwear/top/greenshirtsport
+ name = "Shirt, Sports - Green"
+ icon_state = "greenshirtsport"
+
+/datum/sprite_accessory/underwear/top/redshirtsport
+ name = "Shirt, Sports - Red"
+ icon_state = "redshirtsport"
+
/datum/sprite_accessory/underwear/top/ss13
name = "Shirt - SS13"
icon_state = "shirt_ss13"
@@ -141,27 +190,6 @@
name = "Shirt - USA"
icon_state = "shirt_assblastusa"
-/datum/sprite_accessory/underwear/top/shortsleeve
- name = "Shirt - Short Sleeved"
- icon_state = "shortsleeve"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/blueshirtsport
- name = "Shirt, Sports - Blue"
- icon_state = "blueshirtsport"
-
-/datum/sprite_accessory/underwear/top/greenshirtsport
- name = "Shirt, Sports - Green"
- icon_state = "greenshirtsport"
-
-/datum/sprite_accessory/underwear/top/redshirtsport
- name = "Shirt, Sports - Red"
- icon_state = "redshirtsport"
-
-/datum/sprite_accessory/underwear/top/tankfire
- name = "Tank Top - Fire"
- icon_state = "tank_fire"
-
/datum/sprite_accessory/underwear/top/tanktop
name = "Tank Top"
icon_state = "tanktop"
@@ -172,6 +200,10 @@
icon_state = "tanktop_alt"
has_color = TRUE
+/datum/sprite_accessory/underwear/top/tankfire
+ name = "Tank Top - Fire"
+ icon_state = "tank_fire"
+
/datum/sprite_accessory/underwear/top/tanktop_midriff
name = "Tank Top - Midriff"
icon_state = "tank_midriff"
@@ -192,6 +224,8 @@
name = "Tank top - Sun"
icon_state = "tank_sun"
+//feminine accessories from here on
+
/datum/sprite_accessory/underwear/top/babydoll
name = "Baby-Doll"
icon_state = "babydoll"
@@ -210,15 +244,25 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_thin
- name = "Bra - Thin"
- icon_state = "bra_thin"
- has_color = TRUE
+/datum/sprite_accessory/underwear/top/bra_beekini
+ name = "Bra - Bee-kini"
+ icon_state = "bra_bee-kini"
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_kinky
- name = "Bra - Kinky Black"
- icon_state = "bra_kinky"
+/datum/sprite_accessory/underwear/top/bra_binder
+ name = "Bra (binder)"
+ icon_state = "bra_binder"
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/top/bra_binder_strapless
+ name = "Bra (binder, strapless)"
+ icon_state = "bra_binder_strapless"
+ has_color = TRUE
+
+
+/datum/sprite_accessory/underwear/top/bra_commie
+ name = "Bra - Commie"
+ icon_state = "bra_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_freedom
@@ -226,33 +270,17 @@
icon_state = "bra_assblastusa"
gender = FEMALE
-/datum/sprite_accessory/underwear/top/bra_commie
- name = "Bra - Commie"
- icon_state = "bra_commie"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_beekini
- name = "Bra - Bee-kini"
- icon_state = "bra_bee-kini"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_uk
- name = "Bra - UK"
- icon_state = "bra_uk"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/bra_neko
- name = "Bra - Neko"
- icon_state = "bra_neko"
- has_color = TRUE
- gender = FEMALE
-
/datum/sprite_accessory/underwear/top/halterneck_bra
name = "Bra - Halterneck"
icon_state = "halterneck_bra"
has_color = TRUE
gender = FEMALE
+/datum/sprite_accessory/underwear/top/bra_kinky
+ name = "Bra - Kinky Black"
+ icon_state = "bra_kinky"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/top/sports_bra
name = "Bra, Sports"
icon_state = "sports_bra"
@@ -283,9 +311,21 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/top/fishnet_sleeves
- name = "Fishnet - sleeves"
- icon_state = "fishnet_sleeves"
+/datum/sprite_accessory/underwear/top/bra_thin
+ name = "Bra - Thin"
+ icon_state = "bra_thin"
+ has_color = TRUE
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/top/bra_neko
+ name = "Bra - Neko"
+ icon_state = "bra_neko"
+ has_color = TRUE
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/top/bra_uk
+ name = "Bra - UK"
+ icon_state = "bra_uk"
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_gloves
@@ -293,6 +333,11 @@
icon_state = "fishnet_gloves"
gender = FEMALE
+/datum/sprite_accessory/underwear/top/fishnet_sleeves
+ name = "Fishnet - sleeves"
+ icon_state = "fishnet_sleeves"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/top/fishnet_base
name = "Fishnet - top"
icon_state = "fishnet_body"
@@ -315,45 +360,3 @@
icon_state = "tubetop"
has_color = TRUE
gender = FEMALE
-
-/datum/sprite_accessory/underwear/top/cowboyshirt
- name = "Cowboy Shirt Black"
- icon_state = "cowboyshirt"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/s
- name = "Cowboy Shirt Shortsleeved Black"
- icon_state = "cowboyshirt_s"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/white
- name = "Cowboy Shirt White"
- icon_state = "cowboyshirt_white"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
- name = "Cowboy Shirt Shortsleeved White"
- icon_state = "cowboyshirt_whites"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/navy
- name = "Cowboy Shirt Navy"
- icon_state = "cowboyshirt_navy"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
- name = "Cowboy Shirt Shortsleeved Navy"
- icon_state = "cowboyshirt_navys"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/red
- name = "Cowboy Shirt Red"
- icon_state = "cowboyshirt_red"
-
-/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
- name = "Cowboy Shirt Shortsleeved Red"
- icon_state = "cowboyshirt_reds"
-
-/datum/sprite_accessory/underwear/top/bra_binder
- name = "Bra (binder)"
- icon_state = "bra_binder"
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/top/bra_binder_strapless
- name = "Bra (binder, strapless)"
- icon_state = "bra_binder_strapless"
- has_color = TRUE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
index 58d5e1ba88..edfeba79f1 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
@@ -10,18 +10,6 @@
icon_state = null
covers_groin = FALSE
-/datum/sprite_accessory/underwear/bottom/mankini
- name = "Mankini"
- icon_state = "mankini"
- has_color = TRUE
- gender = MALE
-
-/datum/sprite_accessory/underwear/bottom/male_kinky
- name = "Jockstrap"
- icon_state = "jockstrap"
- has_color = TRUE
- gender = MALE
-
/datum/sprite_accessory/underwear/bottom/briefs
name = "Briefs"
icon_state = "briefs"
@@ -77,6 +65,26 @@
has_digitigrade = TRUE
has_color = TRUE
+/datum/sprite_accessory/underwear/bottom/male_kinky
+ name = "Jockstrap"
+ icon_state = "jockstrap"
+ has_color = TRUE
+ gender = MALE
+
+/datum/sprite_accessory/underwear/bottom/longjon
+ name = "Long John Bottoms"
+ icon_state = "ljonb"
+ has_digitigrade = TRUE
+ has_color = TRUE
+
+/datum/sprite_accessory/underwear/bottom/mankini
+ name = "Mankini"
+ icon_state = "mankini"
+ has_color = TRUE
+ gender = MALE
+
+//feminine underwear from here on
+
/datum/sprite_accessory/underwear/bottom/panties
name = "Panties"
icon_state = "panties"
@@ -89,11 +97,6 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/fishnet_lower
- name = "Panties - Fishnet"
- icon_state = "fishnet_lower"
- gender = FEMALE
-
/datum/sprite_accessory/underwear/bottom/female_beekini
name = "Panties - Bee-kini"
icon_state = "panties_bee-kini"
@@ -104,6 +107,11 @@
icon_state = "panties_commie"
gender = FEMALE
+/datum/sprite_accessory/underwear/bottom/fishnet_lower
+ name = "Panties - Fishnet"
+ icon_state = "fishnet_lower"
+ gender = FEMALE
+
/datum/sprite_accessory/underwear/bottom/female_usastripe
name = "Panties - Freedom"
icon_state = "panties_assblastusa"
@@ -114,11 +122,6 @@
icon_state = "panties_kinky"
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/panties_uk
- name = "Panties - UK"
- icon_state = "panties_uk"
- gender = FEMALE
-
/datum/sprite_accessory/underwear/bottom/panties_neko
name = "Panties - Neko"
icon_state = "panties_neko"
@@ -149,17 +152,10 @@
has_color = TRUE
gender = FEMALE
-/datum/sprite_accessory/underwear/bottom/longjon
- name = "Long John Bottoms"
- icon_state = "ljonb"
- has_digitigrade = TRUE
- has_color = TRUE
-
-/datum/sprite_accessory/underwear/bottom/swimsuit_red
- name = "Swimsuit, One Piece - Red"
- icon_state = "swimming_red"
+/datum/sprite_accessory/underwear/bottom/panties_uk
+ name = "Panties - UK"
+ icon_state = "panties_uk"
gender = FEMALE
- covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit
name = "Swimsuit, One Piece - Black"
@@ -173,6 +169,12 @@
gender = FEMALE
covers_chest = TRUE
+/datum/sprite_accessory/underwear/bottom/swimsuit_red
+ name = "Swimsuit, One Piece - Red"
+ icon_state = "swimming_red"
+ gender = FEMALE
+ covers_chest = TRUE
+
/datum/sprite_accessory/underwear/bottom/thong
name = "Thong"
icon_state = "thong"
@@ -184,5 +186,3 @@
icon_state = "thong_babydoll"
has_color = TRUE
gender = FEMALE
-
-
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index fb03df88a1..fb71bb483d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -58,6 +58,10 @@
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
+/datum/sprite_accessory/deco_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
@@ -66,6 +70,10 @@
name = "Bee"
icon_state = "bee"
+/datum/sprite_accessory/deco_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -74,14 +82,6 @@
name = "Feathery"
icon_state = "feathery"
-/datum/sprite_accessory/deco_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/deco_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -150,6 +150,10 @@
icon_state = "none"
relevant_layers = null
+/datum/sprite_accessory/insect_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
@@ -158,6 +162,10 @@
name = "Bee"
icon_state = "bee"
+/datum/sprite_accessory/insect_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -166,14 +174,6 @@
name = "Feathery"
icon_state = "feathery"
-/datum/sprite_accessory/insect_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/insect_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -182,6 +182,10 @@
name = "Gothic"
icon_state = "gothic"
+/datum/sprite_accessory/insect_wings/jungle
+ name = "Jungle"
+ icon_state = "jungle"
+
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
@@ -198,6 +202,10 @@
name = "Moon Fly"
icon_state = "moonfly"
+/datum/sprite_accessory/insect_wings/oakworm
+ name = "Oak Worm"
+ icon_state = "oakworm"
+
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
@@ -230,14 +238,6 @@
name = "White Fly"
icon_state = "whitefly"
-/datum/sprite_accessory/insect_wings/oakworm
- name = "Oak Worm"
- icon_state = "oakworm"
-
-/datum/sprite_accessory/insect_wings/jungle
- name = "Jungle"
- icon_state = "jungle"
-
/datum/sprite_accessory/insect_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index edb681e60f..b7d67e49a6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -87,7 +87,7 @@
if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM))
for(var/datum/surgery/S in surgeries)
if(S.next_step(user,user.a_intent))
- return 1
+ return STOP_ATTACK_PROC_CHAIN
if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
return ..()
@@ -95,7 +95,7 @@
for(var/i in shuffle(all_wounds))
var/datum/wound/W = i
if(W.try_treating(I, user))
- return 1
+ return STOP_ATTACK_PROC_CHAIN
return ..()
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 1e2a375b39..2f5c94b784 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -21,7 +21,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
/mob/living/carbon/human/dummy/proc/wipe_state()
delete_equipment()
icon_render_key = null
- cut_overlays(TRUE)
+ cut_overlays()
//Inefficient pooling/caching way.
GLOBAL_LIST_EMPTY(human_dummy_list)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index cb0dbef332..04747ffcb4 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -7,6 +7,11 @@
message = "cries."
emote_type = EMOTE_AUDIBLE
+/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
+ . = ..()
+ if(. && isipcperson(user))
+ do_fake_sparks(5,FALSE,user)
+
/datum/emote/living/carbon/human/dap
key = "dap"
key_third_person = "daps"
@@ -187,3 +192,71 @@
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
+
+//rock paper scissors emote handling
+/mob/living/carbon/human/proc/beginRockPaperScissors(var/chosen_move)
+ GLOB.rockpaperscissors_players[src] = list(chosen_move, ROCKPAPERSCISSORS_NOT_DECIDED)
+ do_after_advanced(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_NO_PROGRESSBAR|DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER, CALLBACK(src, .proc/rockpaperscissors_tick))
+ var/new_entry = GLOB.rockpaperscissors_players[src]
+ if(new_entry[2] == ROCKPAPERSCISSORS_NOT_DECIDED)
+ to_chat(src, "You put your hand back down.")
+ GLOB.rockpaperscissors_players -= src
+
+/mob/living/carbon/human/proc/rockpaperscissors_tick() //called every cycle of the progress bar for rock paper scissors while waiting for an opponent
+ var/mob/living/carbon/human/opponent
+ for(var/mob/living/carbon/human/potential_opponent in (GLOB.rockpaperscissors_players - src)) //dont play against yourself
+ if(get_dist(src, potential_opponent) <= ROCKPAPERSCISSORS_RANGE)
+ opponent = potential_opponent
+ break
+ if(opponent)
+ //we found an opponent before they found us
+ var/move_to_number = list("rock" = 0, "paper" = 1, "scissors" = 2)
+ var/our_move = move_to_number[GLOB.rockpaperscissors_players[src][1]]
+ var/their_move = move_to_number[GLOB.rockpaperscissors_players[opponent][1]]
+ var/result_us = ROCKPAPERSCISSORS_WIN
+ var/result_them = ROCKPAPERSCISSORS_LOSE
+ if(our_move == their_move)
+ result_us = ROCKPAPERSCISSORS_TIE
+ result_them = ROCKPAPERSCISSORS_TIE
+ else
+ if(((our_move + 1) % 3) == their_move)
+ result_us = ROCKPAPERSCISSORS_LOSE
+ result_them = ROCKPAPERSCISSORS_WIN
+ //we decided our results so set them in the list
+ GLOB.rockpaperscissors_players[src][2] = result_us
+ GLOB.rockpaperscissors_players[opponent][2] = result_them
+
+ //show what happened
+ src.visible_message("[src] makes [GLOB.rockpaperscissors_players[src][1]] with their hand!")
+ opponent.visible_message("[opponent] makes [GLOB.rockpaperscissors_players[opponent][1]] with their hands!")
+ switch(result_us)
+ if(ROCKPAPERSCISSORS_TIE)
+ src.visible_message("It was a tie!")
+ if(ROCKPAPERSCISSORS_WIN)
+ src.visible_message("[src] wins!")
+ if(ROCKPAPERSCISSORS_LOSE)
+ src.visible_message("[opponent] wins!")
+
+ //make the progress bar end so that each player can handle the result
+ return DO_AFTER_STOP
+
+ //no opponent was found, so keep searching
+ return DO_AFTER_PROCEED
+
+//the actual emotes
+/datum/emote/living/carbon/human/rockpaperscissors
+ message = "is attempting to play rock paper scissors!"
+
+/datum/emote/living/carbon/human/rockpaperscissors/rock
+ key = "rock"
+
+/datum/emote/living/carbon/human/rockpaperscissors/paper
+ key = "paper"
+
+/datum/emote/living/carbon/human/rockpaperscissors/scissors
+ key = "scissors"
+
+/datum/emote/living/carbon/human/rockpaperscissors/run_emote(mob/living/carbon/human/user, params)
+ if(!(user in GLOB.rockpaperscissors_players)) //no using the emote again while already playing!
+ . = ..()
+ user.beginRockPaperScissors(key)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 7879edbb45..2bc32cf50f 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -115,6 +115,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/// Our default override for typing indicator state
var/typing_indicator_state
+ //the ids you can use for your species, if empty, it means default only and not changeable
+ var/list/allowed_limb_ids
+
///////////
// PROCS //
///////////
@@ -122,7 +125,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/New()
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
- limbs_id = id
+ mutant_bodyparts["limbs_id"] = id //done this way to be non-intrusive to the existing system
+ else
+ mutant_bodyparts["limbs_id"] = limbs_id
..()
//update our mutant bodyparts to include unlocked ones
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index 2a955e28a4..16b371c772 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -13,10 +13,11 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
liked_food = MEAT | FRUIT
disliked_food = TOXIC
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
- species_type = "insect"
\ No newline at end of file
+ species_type = "insect"
+
+ allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 7706d4a9d5..534536d6e7 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -2,7 +2,6 @@
name = "Anthromorph"
id = "mammal"
default_color = "4B4B4B"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
@@ -17,3 +16,5 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_type = "furry"
+
+ allowed_limb_ids = list("mammal","aquatic","avian")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 3aef14c256..806782a8b2 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -3,7 +3,6 @@
id = "ipc"
say_mod = "beeps"
default_color = "00FF00"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE)
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index a55952d62f..a8e3f89957 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -5,13 +5,12 @@
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
- mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
mutanttongue = /obj/item/organ/tongue/lizard
mutanttail = /obj/item/organ/tail/lizard
coldmod = 1.5
heatmod = 0.67
- mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round",
+ mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
attack_verb = "slash"
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index f5a2f807e4..0f62953e6c 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -21,6 +21,8 @@
species_type = "plant"
+ allowed_limb_ids = list("pod","mush")
+
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
index 173411eaa1..70afa2f476 100644
--- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm
@@ -1,7 +1,6 @@
/datum/species/synthliz
name = "Synthetic Lizardperson"
id = "synthliz"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
say_mod = "beeps"
default_color = "00FF00"
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE)
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index c10521dfd9..3d55ce1027 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -61,7 +61,7 @@
mutant_organs = S.mutant_organs.Copy()
nojumpsuit = S.nojumpsuit
no_equip = S.no_equip.Copy()
- limbs_id = S.limbs_id
+ limbs_id = S.mutant_bodyparts["limbs_id"]
use_skintones = S.use_skintones
fixed_mut_color = S.fixed_mut_color
hair_color = S.hair_color
diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm
index db34d1ae45..ddd1c86f0a 100644
--- a/code/modules/mob/living/carbon/human/species_types/xeno.dm
+++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm
@@ -4,7 +4,6 @@
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
- icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR)
mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
attack_verb = "slash"
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e399ddf872..9b39438563 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -660,7 +660,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
//produces a key based on the human's limbs
/mob/living/carbon/human/generate_icon_render_key()
- . = "[dna.species.limbs_id]"
+ . = "[dna.species.mutant_bodyparts["limbs_id"]]"
if(dna.check_mutation(HULK))
. += "-coloured-hulk"
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index ad1a3bc9b9..fe5a78de21 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -8,8 +8,6 @@
spill_organs(no_brain, no_organs, no_bodyparts)
- release_vore_contents(silent = TRUE) // return of the bomb safe internals.
-
if(!no_bodyparts)
spread_bodyparts(no_brain, no_organs)
@@ -46,7 +44,6 @@
buckled.unbuckle_mob(src, force = TRUE)
dust_animation()
- release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway.
spawn_dust(just_ash)
QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes.
@@ -103,5 +100,5 @@
for(var/s in sharedSoullinks)
var/datum/soullink/S = s
S.sharerDies(gibbed)
-
+ release_vore_contents(silent = TRUE)
return TRUE
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 97de8bfd6c..a735baceae 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -9,6 +9,11 @@
key_third_person = "blushes"
message = "blushes."
+/datum/emote/living/blush/run_emote(mob/user, params)
+ . = ..()
+ if(. && isipcperson(user))
+ do_fake_sparks(5,FALSE,user)
+
/datum/emote/living/bow
key = "bow"
key_third_person = "bows"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 9018c49b2c..d8299d42ad 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -289,50 +289,57 @@
return FALSE
return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range)
-/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
+/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user)
+ if (!getBruteLoss())
+ to_chat(user, "[src] is already in good condition!")
+ return
+ if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
+ return
+ user.DelayNextAction(CLICK_CD_MELEE)
+ if(src == user)
+ to_chat(user, "You start fixing yourself...")
+ if(!W.use_tool(src, user, 50))
+ return
+ adjustBruteLoss(-10)
+ else
+ to_chat(user, "You start fixing [src]...")
+ if(!do_after(user, 30, target = src))
+ return
+ adjustBruteLoss(-30)
+ updatehealth()
+ add_fingerprint(user)
+ visible_message("[user] has fixed some of the dents on [src].")
+
+/mob/living/silicon/robot/proc/attempt_cable_repair(obj/item/stack/cable_coil/W, mob/user)
+ if (getFireLoss() > 0 || getToxLoss() > 0)
user.DelayNextAction(CLICK_CD_MELEE)
- if (!getBruteLoss())
- to_chat(user, "[src] is already in good condition!")
- return
- if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
- return
if(src == user)
to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50))
+ if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
+ to_chat(user, "You need more cable to repair [src]!")
return
- adjustBruteLoss(-10)
+ adjustFireLoss(-10)
+ adjustToxLoss(-10)
else
to_chat(user, "You start fixing [src]...")
- if(!do_after(user, 30, target = src))
+ if(!W.use_tool(src, user, 30, 1))
+ to_chat(user, "You need more cable to repair [src]!")
return
- adjustBruteLoss(-30)
- updatehealth()
- add_fingerprint(user)
- visible_message("[user] has fixed some of the dents on [src].")
+ adjustFireLoss(-30)
+ adjustToxLoss(-30)
+ updatehealth()
+ user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].")
+ else
+ to_chat(user, "The wires seem fine, there's no need to fix them.")
+
+/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
+ INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user)
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
- user.DelayNextAction(CLICK_CD_MELEE)
- if (getFireLoss() > 0 || getToxLoss() > 0)
- if(src == user)
- to_chat(user, "You start fixing yourself...")
- if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
- to_chat(user, "You need more cable to repair [src]!")
- return
- adjustFireLoss(-10)
- adjustToxLoss(-10)
- else
- to_chat(user, "You start fixing [src]...")
- if(!W.use_tool(src, user, 30, 1))
- to_chat(user, "You need more cable to repair [src]!")
- return
- adjustFireLoss(-30)
- adjustToxLoss(-30)
- updatehealth()
- user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].")
- else
- to_chat(user, "The wires seem fine, there's no need to fix them.")
+ INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user)
+ return
else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
if(opened)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 354bc9ed0f..95bd8d8991 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -11,7 +11,6 @@
response_disarm_simple = "flail at"
response_harm_continuous = "punches"
response_harm_simple = "punch"
- threat = 1
speak_chance = 1
icon = 'icons/mob/mob.dmi'
speed = 0
@@ -122,7 +121,6 @@
desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire."
icon_state = "behemoth"
icon_living = "behemoth"
- threat = 3
maxHealth = 150
health = 150
response_harm_continuous = "harmlessly punches"
@@ -187,7 +185,6 @@
desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines."
icon_state = "floating"
icon_living = "floating"
- threat = 3
maxHealth = 65
health = 65
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/friendly/gondola.dm b/code/modules/mob/living/simple_animal/friendly/gondola.dm
index 0cfea3548b..e29cbb8062 100644
--- a/code/modules/mob/living/simple_animal/friendly/gondola.dm
+++ b/code/modules/mob/living/simple_animal/friendly/gondola.dm
@@ -58,7 +58,7 @@
eyes_overlay.pixel_y = -8
moustache_overlay.pixel_y = -8
- cut_overlays(TRUE)
+ cut_overlays()
add_overlay(body_overlay)
add_overlay(eyes_overlay)
add_overlay(moustache_overlay)
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index fb24b0fc09..7abecc7c81 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -8,7 +8,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
name = "Guardian Spirit"
real_name = "Guardian Spirit"
desc = "A mysterious being that stands by its charge, ever vigilant."
- threat = 5
speak_emote = list("hisses")
gender = NEUTER
mob_biotypes = NONE
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 7120ab6d0a..86467624b5 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -7,7 +7,6 @@
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
gender = FEMALE
- threat = 1
response_help_continuous = "pokes"
response_help_simple = "poke"
response_disarm_continuous = "shoves"
@@ -69,7 +68,6 @@
icon_state = "aliens"
icon_living = "aliens"
icon_dead = "aliens_dead"
- threat = 3
health = 150
maxHealth = 150
melee_damage_lower = 15
@@ -87,7 +85,6 @@
icon_living = "alienq"
icon_dead = "alienq_dead"
pixel_x = -16
- threat = 8
health = 250
maxHealth = 250
melee_damage_lower = 15
@@ -167,7 +164,6 @@
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
- threat = -1
a_intent = INTENT_HELP
friendly_verb_continuous = "caresses"
friendly_verb_simple = "caress"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index da16ec581b..1be90a07f8 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -2,7 +2,6 @@
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates."
- threat = 1
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 5f3d4f11c1..0a3cde3ef8 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -16,7 +16,6 @@
icon_state = ""
icon_living = ""
icon = 'icons/mob/bees.dmi'
- threat = 0.3
gender = FEMALE
speak_emote = list("buzzes")
emote_hear = list("buzzes")
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
index cde63adffd..b4d60af198 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
@@ -1,7 +1,6 @@
/mob/living/simple_animal/hostile/boss
name = "A Perfectly Generic Boss Placeholder"
desc = ""
- threat = 10
robust_searching = TRUE
stat_attack = UNCONSCIOUS
status_flags = NONE
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index f775d6600c..51a646f668 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -7,7 +7,6 @@
icon_living = "carp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
- threat = 0.1
mob_biotypes = MOB_ORGANIC|MOB_BEAST
speak_chance = 0
turns_per_move = 5
@@ -74,7 +73,6 @@
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
- threat = 3
regen_amount = 6
maxHealth = 30
@@ -98,7 +96,6 @@
name = "Cayenne"
desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot."
gender = FEMALE
- threat = 5
regen_amount = 8
speak_emote = list("squeaks")
diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
index 48266e3e76..9b50587b3d 100644
--- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm
@@ -1,7 +1,6 @@
/mob/living/simple_animal/hostile/dark_wizard
name = "Dark Wizard"
desc = "Killing amateurs since the dawn of times."
- threat = 3
icon = 'icons/mob/simple_human.dmi'
icon_state = "dark_wizard"
icon_living = "dark_wizard"
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 4f8d2fef6c..b44a2502ef 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -4,7 +4,6 @@
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
- threat = 1
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
gender = MALE
speak_chance = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index a253ecfd96..a8799f4e8c 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -17,7 +17,6 @@
//basic spider mob, these generally guard nests
/mob/living/simple_animal/hostile/poison/giant_spider
- threat = 1
name = "giant spider"
desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes."
icon_state = "guard"
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index f48eef083b..ec0b7acd07 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -9,7 +9,6 @@
icon_state = "crawling"
icon_living = "crawling"
icon_dead = "dead"
- threat = 0.5
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 80
maxHealth = 220
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 501534237a..ac53ff794b 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -6,7 +6,6 @@
icon_state = "headcrab"
icon_living = "headcrab"
icon_dead = "headcrab_dead"
- threat = 1
gender = NEUTER
health = 50
maxHealth = 50
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 5ed3cd0cdd..186fe36a10 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -3,7 +3,6 @@
stop_automated_movement_when_pulled = 0
obj_damage = 40
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls
- var/threat = 0 // for dynamic
var/atom/target
var/ranged = FALSE
var/rapid = 0 //How many shots per volley.
@@ -600,6 +599,3 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega
. += M
else if (M.loc.type in hostile_machines)
. += M.loc
-
-/mob/living/simple_animal/hostile/proc/threat()
- return threat
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index 55046d6555..362432b2af 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -11,7 +11,6 @@
icon_living = "leaper"
icon_dead = "leaper_dead"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
- threat = 2
maxHealth = 300
health = 300
ranged = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
index 99349168f0..31303bd7f1 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
@@ -8,7 +8,6 @@
icon_living = "arachnid"
icon_dead = "arachnid_dead"
mob_biotypes = MOB_ORGANIC|MOB_BUG
- threat = 2
melee_damage_lower = 30
melee_damage_upper = 30
maxHealth = 300
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
index 6efa0cf468..2d964f5721 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm
@@ -14,7 +14,6 @@
icon_living = "mook"
icon_dead = "mook_dead"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- threat = 0.5
pixel_x = -16
maxHealth = 45
health = 45
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
index 0521afa9e9..7565a686bf 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -13,7 +13,6 @@
icon_state = "seedling"
icon_living = "seedling"
icon_dead = "seedling_dead"
- threat = 0.5
maxHealth = 100
health = 100
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index 9cb65d7c30..b86d5d87fc 100644
--- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm
+++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
@@ -5,7 +5,6 @@
icon_living = "tomato"
icon_dead = "tomato_dead"
gender = NEUTER
- threat = 0.3
speak_chance = 0
turns_per_move = 5
maxHealth = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 5c1229c130..2a5f279386 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -23,7 +23,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner
name = "blood-drunk miner"
desc = "A miner destined to wander forever, engaged in an endless hunt."
- threat = 15
health = 900
maxHealth = 900
icon_state = "miner"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index b191eaf3fb..519d6402e6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -26,7 +26,6 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum
name = "bubblegum"
desc = "In what passes for a hierarchy among slaughter demons, this one is king."
- threat = 35
health = 2500
maxHealth = 2500
attack_verb_continuous = "rends"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 18abb019d3..883ad39261 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -24,7 +24,6 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus
name = "colossus"
desc = "A monstrous creature protected by heavy shielding."
- threat = 40
health = 2500
maxHealth = 2500
attack_verb_continuous = "judges"
@@ -603,7 +602,6 @@ Difficulty: Very Hard
icon_state = "lightgeist"
icon_living = "lightgeist"
icon_dead = "butterfly_dead"
- threat = -0.7
turns_per_move = 1
response_help_continuous = "waves away"
response_help_simple = "wave away"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index a1ecde40b8..4dfd4561d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -38,7 +38,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon
name = "ash drake"
desc = "Guardians of the necropolis."
- threat = 30
health = 2500
maxHealth = 2500
spacewalk = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index c00d7c3130..bd3a6e8232 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -37,7 +37,6 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant
name = "hierophant"
desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat."
- threat = 30
health = 2500
maxHealth = 2500
attack_verb_continuous = "clubs"
@@ -662,7 +661,7 @@ Difficulty: Normal
continue
to_chat(M.occupant, "Your [M.name] is struck by a [name]!")
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
- M.take_damage(damage, BURN, 0, 0)
+ M.take_damage(damage, BURN, 0, 0, null, 50)
/obj/effect/hierophant
name = "hierophant beacon"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 78c02fb7a7..795184bad5 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -18,7 +18,6 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/legion
name = "Legion"
- threat = 30
health = 800
maxHealth = 800
spacewalk = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 13738b20e1..61be1f6287 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -8,7 +8,6 @@
icon_aggro = "Basilisk_alert"
icon_dead = "Basilisk_dead"
icon_gib = "syndicate_gib"
- threat = 4
mob_biotypes = MOB_ORGANIC|MOB_BEAST
move_to_delay = 20
projectiletype = /obj/item/projectile/temp/basilisk
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
index 11cc0fe67e..ed056c2ad9 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
@@ -10,7 +10,6 @@
move_to_delay = 5
vision_range = 20
aggro_vision_range = 20
- threat = 1
maxHealth = 40 //easy to kill, but oh, will you be seeing a lot of them.
health = 40
melee_damage_lower = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 87ec79abcf..e3edd171c0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -11,7 +11,6 @@
robust_searching = TRUE
ranged_ignores_vision = TRUE
ranged = TRUE
- threat = 5
obj_damage = 5
vision_range = 6
aggro_vision_range = 18
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index 80489e0e40..d9f3cfba3d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -25,7 +25,6 @@
icon_aggro = "broodmother"
icon_dead = "egg_sac"
icon_gib = "syndicate_gib"
- threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
index 78b24acfb0..fce5b636e4 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
@@ -24,7 +24,6 @@
icon_aggro = "herald"
icon_dead = "herald_dying"
icon_gib = "syndicate_gib"
- threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index 31f925fb2b..15ed0135fe 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -24,7 +24,6 @@
icon_aggro = "legionnaire"
icon_dead = "legionnaire_dead"
icon_gib = "syndicate_gib"
- threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index cdef0c50d3..7995e4d20f 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -24,7 +24,6 @@
icon_aggro = "pandora"
icon_dead = "pandora_dead"
icon_gib = "syndicate_gib"
- threat = 10
maxHealth = 800
health = 800
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
index 4a3497055a..3845c6f406 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
@@ -8,7 +8,6 @@
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
- threat = 0.2
mob_biotypes = MOB_ORGANIC|MOB_BEAST
vision_range = 2
aggro_vision_range = 9
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index 5f6c21bbbd..fa67fd8e3b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -10,7 +10,6 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_OPAQUE
- threat = 2
move_to_delay = 10
ranged = 1
ranged_cooldown_time = 60
@@ -201,6 +200,8 @@
L.Stun(75)
L.adjustBruteLoss(rand(15,20)) // Less stun more harm
latched = TRUE
+ for(var/obj/mecha/M in loc)
+ M.take_damage(20, BRUTE, null, null, null, 25)
if(!latched)
retract()
else
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 16f892bbff..11ce4f9214 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -9,7 +9,6 @@
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC
mouse_opacity = MOUSE_OPACITY_OPAQUE
- threat = 4
move_to_delay = 14
ranged = 1
vision_range = 4
@@ -241,7 +240,6 @@
icon_state = "legion"
icon_living = "legion"
icon_dead = "legion"
- threat = 5
health = 450
maxHealth = 450
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index e21e3e0693..92f331071a 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -10,7 +10,6 @@
obj_damage = 100
melee_damage_lower = 25
melee_damage_upper = 50
- threat = 2
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index 0544ddc676..74e37bea21 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -10,7 +10,6 @@
turns_per_move = 5
response_help_continuous = "pushes"
response_help_simple = "push"
- threat = 3
speed = 0
maxHealth = 115
health = 115
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index f7a46658c4..e9879f38ec 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -10,7 +10,6 @@
speak_chance = 0
turns_per_move = 5
speed = 0
- threat = 1
maxHealth = 100
health = 100
harm_intent_damage = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm
index 1263a23d26..af61149130 100644
--- a/code/modules/mob/living/simple_animal/hostile/sharks.dm
+++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm
@@ -19,7 +19,6 @@
response_harm_continuous = "kicks"
response_harm_simple = "kick"
speed = 0
- threat = 1
maxHealth = 75
health = 75
harm_intent_damage = 18
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index 3091949552..ebacf1edef 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -11,7 +11,6 @@
speak_emote = list("rattles")
emote_see = list("rattles")
a_intent = INTENT_HARM
- threat = 0.5
maxHealth = 40
blood_volume = 0
health = 40
@@ -64,7 +63,6 @@
icon_state = "templar"
icon_living = "templar"
icon_dead = "templar_dead"
- threat = 1.5
maxHealth = 150
health = 150
weather_immunities = list("snow")
@@ -98,7 +96,6 @@
icon_state = "plasma_miner"
icon_living = "plasma_miner"
icon_dead = "plasma_miner"
- threat = 2
maxHealth = 150
health = 150
harm_intent_damage = 10
@@ -116,7 +113,6 @@
icon_state = "plasma_miner_tool"
icon_living = "plasma_miner_tool"
icon_dead = "plasma_miner_tool"
- threat = 3
maxHealth = 185
health = 185
harm_intent_damage = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 3490d757a1..600d60eb4d 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -10,7 +10,6 @@
gender = NEUTER
a_intent = INTENT_HARM
mob_biotypes = MOB_HUMANOID
- threat = 3
response_help_continuous = "touches"
response_help_simple = "touch"
response_disarm_continuous = "pushes"
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 226af952b1..6eeeabc877 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -5,7 +5,6 @@
icon_living = "stickman"
icon_dead = "stickman_dead"
icon_gib = "syndicate_gib"
- threat = 0.5
mob_biotypes = MOB_HUMANOID
gender = MALE
speak_chance = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index fd37bb26aa..103868e1d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -25,7 +25,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
turns_per_move = 5
- threat = 1
speed = 0
stat_attack = UNCONSCIOUS
robust_searching = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 2b9f4eea35..46a5a8ec68 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -7,7 +7,6 @@
icon_dead = "pine_1"
icon_gib = "pine_1"
gender = NEUTER
- threat = 1
speak_chance = 0
turns_per_move = 5
response_help_continuous = "brushes"
diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm
index 57fb6f829d..b3523fc42c 100644
--- a/code/modules/mob/living/simple_animal/hostile/wizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm
@@ -8,7 +8,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
turns_per_move = 3
- threat = 3
speed = 0
maxHealth = 100
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index dc6154c05e..bce1a01c8a 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -11,7 +11,6 @@
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 5
- threat = 1
friendly_verb_continuous = "floats near"
friendly_verb_simple = "float near"
speak_emote = list("puffs")
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index 6e4cbac022..1217084ce3 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -7,7 +7,6 @@
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
stat_attack = UNCONSCIOUS //braains
- threat = 1
maxHealth = 100
health = 100
harm_intent_damage = 5
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 36a596f42e..6661d0ccea 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -19,8 +19,11 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
to_chat(src, "You can't vent crawl while you're restrained!")
return
if(has_buckled_mobs())
- to_chat(src, "You can't vent crawl with other creatures on you!")
- return
+ // attempt once
+ unbuckle_all_mobs()
+ if(has_buckled_mobs())
+ to_chat(src, "You can't vent crawl with other creatures on you!")
+ return
if(buckled)
to_chat(src, "You can't vent crawl while buckled!")
return
diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm
index cb2d49fc64..470b34e82c 100644
--- a/code/modules/newscaster/newscaster_machine.dm
+++ b/code/modules/newscaster/newscaster_machine.dm
@@ -95,6 +95,10 @@ GLOBAL_LIST_EMPTY(allCasters)
. = ..()
update_icon()
+/obj/machinery/newscaster/attack_ghost(mob/dead/observer/user)
+ if(istype(user))
+ user.read_news()
+
/obj/machinery/newscaster/ui_interact(mob/user)
. = ..()
if(ishuman(user) || issilicon(user))
diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm
index 414026924a..392eba5f56 100644
--- a/code/modules/paperwork/paper_premade.dm
+++ b/code/modules/paperwork/paper_premade.dm
@@ -96,7 +96,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/job_changes
name = "MEMO: Job Changes"
- info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Scientists are to have access to chemistry in order to reach the MedSci router.
\n
\n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large.
\n- Roboticists are to have basic Medical and Morgue access.
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053"
+ info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access.
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053"
/obj/item/paper/guides/cogstation/letter_sec
name = "To future Security personnel"
@@ -104,7 +104,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/disposals
name = "Regarding the disposal system:"
- info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES is for DELIVERIES.
\n- RED STRIPES is for CORPSES.
\n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst"
+ info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES are for DELIVERIES.
\n- RED STRIPES are for CORPSES.
\n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst"
/obj/item/paper/guides/cogstation/janitor
name = "a quick tip"
@@ -128,7 +128,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_eng
name = "To future Engineering staff:"
- info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst"
+ info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of protection out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst"
/obj/item/paper/guides/cogstation/letter_atmos
name = "To future Atmospheric Technicians:"
@@ -140,15 +140,15 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_hos
name = "To the future HoS"
- info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC"
+ info = "I'm gonna be rather disappointed if Central Command doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC"
/obj/item/paper/guides/cogstation/letter_supp
name = "To future Supply Staff:"
- info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst"
+ info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. It also isn't fully space-proofed, meanin it may not be the best choice for livestock, monkey cubes, or clowns. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst"
-/obj/item/paper/fluff/cogstation/sleepers
- name = "Re: Sleepers?"
- info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries.
\n
\nThis is no excuse for you not to do your jobs. You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself.
\n
\n- Dr. Halley"
+/obj/item/paper/guides/cogstation/letter_med
+ name = "Re: Future Medical Staff"
+ info = "With this station nearing approval for regular use, I've been told to consolidate anything noteworthy about its general medical department into a single document. As you may be able to guess, this is that document.
\n
\n- First, you should know a medical clinic is present in the civilian (starboard bow) wing. If you have personnel to spare, it's recommended you have someone staff it - that way people with minor injuries can report there instead of clogging up the research wing.
\n
\n- Despite recent renovations to bring this station in line with regional policy, you'll still find the robotics lab directly adjacent to your department. I advise you take full advantage of this, whether it's requesting prosthetics in advance or harvesting organs from those who have undergone more...permanent procedures.
\n
\n- Lastly, please make a habit of checking the morgue on a regular basis. Thanks to the Corpse Disposal Network (or CDN for short), you may find the station's deceased delivered directly to you. Some may be employees capable of being revived - more information can be found in the morgue itself.
\n
\n- Dr. Halley"
/obj/item/paper/fluff/cogstation/cloner
name = "Re: Issue with the cloner?"
@@ -172,7 +172,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/letter_chap
name = "A message from the DHDA"
- info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs"
+ info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs"
/obj/item/paper/fluff/cogstation/cluwne
name = "Mysterious Note"
@@ -184,7 +184,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/eva
name = "MEMO: Spacesuits"
- info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\n-Generated by Organic Resources Bot #2053"
+ info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\nGenerated by Organic Resources Bot #2053"
/obj/item/paper/fluff/cogstation/chemists
name = "Re: Scientists?!"
@@ -214,9 +214,9 @@ Accidental Reentry:
name = "ROUTER STATUS: LIMITED"
info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst"
-/obj/item/paper/fluff/cogstation/router_cargo
- name = "ROUTER STATUS: VERY LIMITED"
- info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst"
+/obj/item/paper/fluff/cogstation/mulebot
+ name = "MEMO: MULEbots"
+ info = "As you may know, MULEbots have been coded to minimize travel distance for maximum efficiency. In the case of this station, that may include travelling through depressurized areas exposed to space. Please bear this in mind before using them to transport living tissue.
\n
\nGenerated by Organic Resources Bot #2053"
/////////// CentCom
diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm
new file mode 100644
index 0000000000..8a27f2669c
--- /dev/null
+++ b/code/modules/plumbing/ducts.dm
@@ -0,0 +1,433 @@
+/*
+All the important duct code:
+/code/datums/components/plumbing/plumbing.dm
+/code/datums/ductnet.dm
+*/
+/obj/machinery/duct
+ name = "fluid duct"
+ icon = 'icons/obj/plumbing/fluid_ducts.dmi'
+ icon_state = "nduct"
+
+ ///bitfield with the directions we're connected in
+ var/connects
+ ///set to TRUE to disable smart duct behaviour
+ var/dumb = FALSE
+ ///wheter we allow our connects to be changed after initialization or not
+ var/lock_connects = FALSE
+ ///our ductnet, wich tracks what we're connected to
+ var/datum/ductnet/duct
+ ///amount we can transfer per process. note that the ductnet can carry as much as the lowest capacity duct
+ var/capacity = 10
+
+ ///the color of our duct
+ var/duct_color = null
+ ///TRUE to ignore colors, so yeah we also connect with other colors without issue
+ var/ignore_colors = FALSE
+ ///1,2,4,8,16
+ var/duct_layer = DUCT_LAYER_DEFAULT
+ ///whether we allow our layers to be altered
+ var/lock_layers = FALSE
+ ///TRUE to let colors connect when forced with a wrench, false to just not do that at all
+ var/color_to_color_support = TRUE
+ ///wheter to even bother with plumbing code or not
+ var/active = TRUE
+ ///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts
+ var/list/neighbours = list()
+ ///wheter we just unanchored or drop whatever is in the variable. either is safe
+ var/drop_on_wrench = /obj/item/stack/ducts
+
+/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects)
+ . = ..()
+
+ if(no_anchor)
+ active = FALSE
+ set_anchored(FALSE)
+ else if(!can_anchor())
+ qdel(src)
+ CRASH("Overlapping ducts detected")
+
+ if(force_connects)
+ connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point
+ if(!lock_layers)
+ duct_layer = layer_of_duct
+ if(!ignore_colors)
+ duct_color = color_of_duct
+ if(duct_color)
+ add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY)
+
+ handle_layer()
+
+ for(var/obj/machinery/duct/D in loc)
+ if(D == src)
+ continue
+ if(D.duct_layer & duct_layer)
+ disconnect_duct()
+
+ if(active)
+ attempt_connect()
+
+
+///start looking around us for stuff to connect to
+/obj/machinery/duct/proc/attempt_connect()
+
+ for(var/atom/movable/AM in loc)
+ var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing)
+ if(P?.active)
+ disconnect_duct() //let's not built under plumbing machinery
+ return
+ for(var/D in GLOB.cardinals)
+ if(dumb && !(D & connects))
+ continue
+ for(var/atom/movable/AM in get_step(src, D))
+ if(connect_network(AM, D))
+ add_connects(D)
+ update_icon()
+
+///see if whatever we found can be connected to
+/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color)
+ if(istype(AM, /obj/machinery/duct))
+ return connect_duct(AM, direction, ignore_color)
+
+ var/plumber = AM.GetComponent(/datum/component/plumbing)
+ if(!plumber)
+ return
+ return connect_plumber(plumber, direction)
+
+///connect to a duct
+/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color)
+ var/opposite_dir = turn(direction, 180)
+ if(!active || !D.active)
+ return
+
+ if(!dumb && D.dumb && !(opposite_dir & D.connects))
+ return
+ if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect
+ return
+
+ if((duct == D.duct) && duct)//check if we're not just comparing two null values
+ add_neighbour(D, direction)
+
+ D.add_connects(opposite_dir)
+ D.update_icon()
+ return TRUE //tell the current pipe to also update it's sprite
+ if(!(D in neighbours)) //we cool
+ if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors))
+ return
+ if(!(duct_layer & D.duct_layer))
+ return
+
+ if(D.duct)
+ if(duct)
+ duct.assimilate(D.duct)
+ else
+ D.duct.add_duct(src)
+ else
+ if(duct)
+ duct.add_duct(D)
+ else
+ create_duct()
+ duct.add_duct(D)
+ add_neighbour(D, direction)
+ //tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated
+ D.attempt_connect()
+
+ return TRUE
+
+///connect to a plumbing object
+/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction)
+ var/opposite_dir = turn(direction, 180)
+ if(duct_layer != DUCT_LAYER_DEFAULT) //plumbing devices don't support multilayering. 3 is the default layer so we only use that. We can change this later
+ return FALSE
+
+ if(!P.active)
+ return
+
+ var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure
+ if(opposite_dir & comp_directions)
+ if(!duct)
+ create_duct()
+ if(duct.add_plumber(P, opposite_dir))
+ neighbours[P.parent] = direction
+ return TRUE
+
+///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one
+/obj/machinery/duct/proc/disconnect_duct(skipanchor)
+ if(!skipanchor) //since set_anchored calls us too.
+ set_anchored(FALSE)
+ active = FALSE
+ if(duct)
+ duct.remove_duct(src)
+ lose_neighbours()
+ reset_connects(0)
+ update_icon()
+ if(ispath(drop_on_wrench) && !QDELING(src))
+ new drop_on_wrench(drop_location())
+ qdel(src)
+
+///''''''''''''''''optimized''''''''''''''''' proc for quickly reconnecting after a duct net was destroyed
+/obj/machinery/duct/proc/reconnect()
+ if(neighbours.len && !duct)
+ create_duct()
+ for(var/atom/movable/AM in neighbours)
+ if(istype(AM, /obj/machinery/duct))
+ var/obj/machinery/duct/D = AM
+ if(D.duct)
+ if(D.duct == duct) //we're already connected
+ continue
+ else
+ duct.assimilate(D.duct)
+ continue
+ else
+ duct.add_duct(D)
+ D.reconnect()
+ else
+ var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing)
+ if(AM in get_step(src, neighbours[AM])) //did we move?
+ if(P)
+ connect_plumber(P, neighbours[AM])
+ else
+ neighbours -= AM //we moved
+
+///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds
+/obj/machinery/duct/proc/generate_connects()
+ if(lock_connects)
+ return
+ connects = 0
+ for(var/A in neighbours)
+ connects |= neighbours[A]
+ update_icon()
+
+///create a new duct datum
+/obj/machinery/duct/proc/create_duct()
+ duct = new()
+ duct.add_duct(src)
+
+///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate
+/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction)
+ if(!(D in neighbours))
+ neighbours[D] = direction
+ if(!(src in D.neighbours))
+ D.neighbours[src] = turn(direction, 180)
+
+///remove all our neighbours, and remove us from our neighbours aswell
+/obj/machinery/duct/proc/lose_neighbours()
+ for(var/obj/machinery/duct/D in neighbours)
+ D.neighbours.Remove(src)
+ neighbours = list()
+
+///add a connect direction
+/obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls?
+ if(!lock_connects)
+ connects |= new_connects
+
+///remove a connect direction
+/obj/machinery/duct/proc/remove_connects(dead_connects)
+ if(!lock_connects)
+ connects &= ~dead_connects
+
+///remove our connects
+/obj/machinery/duct/proc/reset_connects()
+ if(!lock_connects)
+ connects = 0
+
+///get a list of the ducts we can connect to if we are dumb
+/obj/machinery/duct/proc/get_adjacent_ducts()
+ var/list/adjacents = list()
+ for(var/A in GLOB.cardinals)
+ if(A & connects)
+ for(var/obj/machinery/duct/D in get_step(src, A))
+ if((turn(A, 180) & D.connects) && D.active)
+ adjacents += D
+ return adjacents
+
+/obj/machinery/duct/update_icon_state()
+ var/temp_icon = initial(icon_state)
+ for(var/D in GLOB.cardinals)
+ if(D & connects)
+ if(D == NORTH)
+ temp_icon += "_n"
+ if(D == SOUTH)
+ temp_icon += "_s"
+ if(D == EAST)
+ temp_icon += "_e"
+ if(D == WEST)
+ temp_icon += "_w"
+ icon_state = temp_icon
+
+///update the layer we are on
+/obj/machinery/duct/proc/handle_layer()
+ var/offset
+ switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently
+ if(FIRST_DUCT_LAYER)
+ offset = -10
+ if(SECOND_DUCT_LAYER)
+ offset = -5
+ if(THIRD_DUCT_LAYER)
+ offset = 0
+ if(FOURTH_DUCT_LAYER)
+ offset = 5
+ if(FIFTH_DUCT_LAYER)
+ offset = 10
+ pixel_x = offset
+ pixel_y = offset
+
+
+/obj/machinery/duct/set_anchored(anchorvalue)
+ . = ..()
+ if(isnull(.))
+ return
+ if(anchorvalue)
+ active = TRUE
+ attempt_connect()
+ else
+ disconnect_duct(TRUE)
+
+/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD
+ ..()
+ add_fingerprint(user)
+ I.play_tool_sound(src)
+ if(anchored || can_anchor())
+ set_anchored(!anchored)
+ user.visible_message( \
+ "[user] [anchored ? null : "un"]fastens \the [src].", \
+ "You [anchored ? null : "un"]fasten \the [src].", \
+ "You hear ratcheting.")
+ return TRUE
+///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked
+/obj/machinery/duct/proc/can_anchor(turf/T)
+ if(!T)
+ T = get_turf(src)
+ for(var/obj/machinery/duct/D in T)
+ if(!anchored || D == src)
+ continue
+ for(var/A in GLOB.cardinals)
+ if(A & connects && A & D.connects)
+ return FALSE
+ return TRUE
+
+/obj/machinery/duct/doMove(destination)
+ . = ..()
+ disconnect_duct()
+ anchored = FALSE
+
+/obj/machinery/duct/Destroy()
+ disconnect_duct()
+ return ..()
+
+/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user)
+ if(!istype(A, /obj/machinery/duct))
+ return
+ var/obj/machinery/duct/D = A
+ var/obj/item/I = user.get_active_held_item()
+ if(I?.tool_behaviour != TOOL_WRENCH)
+ to_chat(user, "You need to be holding a wrench in your active hand to do that!")
+ return
+ if(get_dist(src, D) != 1)
+ return
+ var/direction = get_dir(src, D)
+ if(!(direction in GLOB.cardinals))
+ return
+ if(duct_layer != D.duct_layer)
+ return
+
+ add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases
+ add_neighbour(D, direction)
+ connect_network(D, direction, TRUE)
+ update_icon()
+
+///has a total of 5 layers and doesnt give a shit about color. its also dumb so doesnt autoconnect.
+/obj/machinery/duct/multilayered
+ name = "duct layer-manifold"
+ icon = 'icons/obj/2x2.dmi'
+ icon_state = "multiduct"
+ pixel_x = -15
+ pixel_y = -15
+
+ color_to_color_support = FALSE
+ duct_layer = FIRST_DUCT_LAYER | SECOND_DUCT_LAYER | THIRD_DUCT_LAYER | FOURTH_DUCT_LAYER | FIFTH_DUCT_LAYER
+ drop_on_wrench = null
+
+ lock_connects = TRUE
+ lock_layers = TRUE
+ ignore_colors = TRUE
+ dumb = TRUE
+
+ active = FALSE
+ anchored = FALSE
+
+/obj/machinery/duct/multilayered/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects)
+ . = ..()
+ update_connects()
+
+/obj/machinery/duct/multilayered/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
+
+/obj/machinery/duct/multilayered/wrench_act(mob/living/user, obj/item/I)
+ . = ..()
+ update_connects()
+
+/obj/machinery/duct/multilayered/proc/update_connects()
+ if(dir & NORTH || dir & SOUTH)
+ connects = NORTH | SOUTH
+ else
+ connects = EAST | WEST
+
+///don't connect to other multilayered stuff because honestly it shouldn't be done and I dont wanna deal with it
+/obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color)
+ if(istype(D, /obj/machinery/duct/multilayered))
+ return
+ return ..()
+
+/obj/machinery/duct/multilayered/handle_layer()
+ return
+
+/obj/item/stack/ducts
+ name = "stack of duct"
+ desc = "A stack of fluid ducts."
+ singular_name = "duct"
+ icon = 'icons/obj/plumbing/fluid_ducts.dmi'
+ icon_state = "ducts"
+ custom_materials = list(/datum/material/iron=500)
+ w_class = WEIGHT_CLASS_TINY
+ novariants = FALSE
+ max_amount = 50
+ item_flags = NOBLUDGEON
+ merge_type = /obj/item/stack/ducts
+ ///Color of our duct
+ var/duct_color = "grey"
+ ///Default layer of our duct
+ var/duct_layer = "Default Layer"
+ ///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way
+ var/list/layers = list("First Layer" = FIRST_DUCT_LAYER, "Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT,
+ "Fourth Layer" = FOURTH_DUCT_LAYER, "Fifth Layer" = FIFTH_DUCT_LAYER)
+
+/obj/item/stack/ducts/examine(mob/user)
+ . = ..()
+ . += "It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change."
+
+/obj/item/stack/ducts/attack_self(mob/user)
+ var/new_layer = input("Select a layer", "Layer") as null|anything in layers
+ if(new_layer)
+ duct_layer = new_layer
+ var/new_color = input("Select a color", "Color") as null|anything in GLOB.pipe_paint_colors
+ if(new_color)
+ duct_color = new_color
+ add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY)
+
+/obj/item/stack/ducts/afterattack(atom/A, user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(istype(A, /obj/machinery/duct))
+ var/obj/machinery/duct/D = A
+ if(!D.anchored)
+ add(1)
+ qdel(D)
+ if(istype(A, /turf/open) && use(1))
+ var/turf/open/OT = A
+ new /obj/machinery/duct(OT, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer])
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
+
+/obj/item/stack/ducts/fifty
+ amount = 50
diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm
new file mode 100644
index 0000000000..0566945e3b
--- /dev/null
+++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm
@@ -0,0 +1,98 @@
+/**Basic plumbing object.
+* It doesn't really hold anything special, YET.
+* Objects that are plumbing but not a subtype are as of writing liquid pumps and the reagent_dispenser tank
+* Also please note that the plumbing component is toggled on and off by the component using a signal from default_unfasten_wrench, so dont worry about it
+*/
+/obj/machinery/plumbing
+ name = "pipe thing"
+ icon = 'icons/obj/plumbing/plumbers.dmi'
+ icon_state = "pump"
+ density = TRUE
+ active_power_usage = 30
+ use_power = ACTIVE_POWER_USE
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ ///Plumbing machinery is always gonna need reagents, so we might aswell put it here
+ var/buffer = 50
+ ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm
+ var/reagent_flags = TRANSPARENT
+ ///wheter we partake in rcd construction or not
+ var/rcd_constructable = TRUE
+ ///cost of the plumbing rcd construction
+ var/rcd_cost = 15
+ ///delay of constructing it throught the plumbing rcd
+ var/rcd_delay = 10
+
+/obj/machinery/plumbing/Initialize(mapload, bolt = TRUE)
+ . = ..()
+ anchored = bolt
+ create_reagents(buffer, reagent_flags)
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+
+/obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type)
+ return TRUE
+
+
+/obj/machinery/plumbing/examine(mob/user)
+ . = ..()
+ . += "The maximum volume display reads: [reagents.maximum_volume] units."
+
+/obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/I)
+ ..()
+ default_unfasten_wrench(user, I)
+ return TRUE
+
+/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+ to_chat(user, "You start furiously plunging [name].")
+ if(do_after(user, 30, target = src))
+ to_chat(user, "You finish plunging the [name].")
+ reagents.reaction(get_turf(src), TOUCH) //splash on the floor
+ reagents.clear_reagents()
+
+/obj/machinery/plumbing/welder_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(anchored)
+ to_chat(user, "The [name] needs to be unbolted to do that!You start slicing the [name] apart.You slice the [name] apart. target_temperature && acclimate_state != COOLING)
+ acclimate_state = COOLING
+ update_icon()
+ if(!emptying)
+ if(reagents.chem_temp >= target_temperature && target_temperature + allowed_temperature_difference >= reagents.chem_temp) //cooling here
+ emptying = TRUE
+ if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here
+ emptying = TRUE
+
+ reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater
+ reagents.handle_reactions()
+
+/obj/machinery/plumbing/acclimator/update_icon()
+ icon_state = initial(icon_state)
+ switch(acclimate_state)
+ if(COOLING)
+ icon_state += "_cold"
+ if(HEATING)
+ icon_state += "_hot"
+
+/obj/machinery/plumbing/acclimator/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemAcclimator", name)
+ ui.open()
+
+/obj/machinery/plumbing/acclimator/ui_data(mob/user)
+ var/list/data = list()
+
+ data["enabled"] = enabled
+ data["chem_temp"] = reagents.chem_temp
+ data["target_temperature"] = target_temperature
+ data["allowed_temperature_difference"] = allowed_temperature_difference
+ data["acclimate_state"] = acclimate_state
+ data["max_volume"] = reagents.maximum_volume
+ data["reagent_volume"] = reagents.total_volume
+ data["emptying"] = emptying
+ return data
+
+/obj/machinery/plumbing/acclimator/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("set_target_temperature")
+ var/target = text2num(params["temperature"])
+ target_temperature = clamp(target, 0, 1000)
+ if("set_allowed_temperature_difference")
+ var/target = text2num(params["temperature"])
+ allowed_temperature_difference = clamp(target, 0, 1000)
+ if("toggle_power")
+ enabled = !enabled
+ if("change_volume")
+ var/target = text2num(params["volume"])
+ reagents.maximum_volume = clamp(round(target), 1, buffer)
+
+#undef COOLING
+#undef HEATING
+#undef NEUTRAL
diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm
new file mode 100644
index 0000000000..dbc70dfcf5
--- /dev/null
+++ b/code/modules/plumbing/plumbers/autohydro.dm
@@ -0,0 +1,65 @@
+/obj/machinery/hydroponics/constructable/automagic
+ name = "automated hydroponics system"
+ desc = "The bane of botanists everywhere. Accepts chemical reagents via plumbing, automatically harvests and removes dead plants."
+ obj_flags = CAN_BE_HIT | UNIQUE_RENAME
+ circuit = /obj/item/circuitboard/machine/hydroponics/automagic
+ self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly.
+ canirrigate = FALSE
+
+
+/obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/reagent_containers))
+ return FALSE //avoid fucky wuckies
+ ..()
+
+/obj/machinery/hydroponics/constructable/automagic/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ . = ..()
+ if(. == SUCCESSFUL_UNFASTEN)
+ user.visible_message("[user.name] [anchored ? "fasten" : "unfasten"] [src]", \
+ "You [anchored ? "fasten" : "unfasten"] [src]")
+ var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing)
+ if(anchored)
+ CP.enable()
+ else
+ CP.disable()
+
+/obj/machinery/hydroponics/constructable/automagic/Destroy()
+ . = ..()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload)
+ . = ..()
+ START_PROCESSING(SSobj, src)
+ create_reagents(100 , AMOUNT_VISIBLE)
+
+/obj/machinery/hydroponics/constructable/automagic/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/plumbing/simple_demand)
+
+/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type)
+ return !anchored
+
+/obj/machinery/hydroponics/constructable/automagic/process()
+ if(reagents)
+ applyChemicals(reagents)
+ reagents.clear_reagents()
+ if(dead)
+ dead = 0
+ qdel(myseed)
+ myseed = null
+ update_icon()
+ name = initial(name)
+ desc = initial(desc)
+ if(harvest)
+ myseed.harvest_userless()
+ harvest = 0
+ lastproduce = age
+ if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
+ qdel(myseed)
+ myseed = null
+ dead = 0
+ name = initial(name)
+ desc = initial(desc)
+ update_icon()
+ ..()
diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm
new file mode 100644
index 0000000000..396c7cac22
--- /dev/null
+++ b/code/modules/plumbing/plumbers/bottler.dm
@@ -0,0 +1,79 @@
+/obj/machinery/plumbing/bottler
+ name = "chemical bottler"
+ desc = "Puts reagents into containers, like bottles and beakers."
+ icon_state = "bottler"
+ layer = ABOVE_ALL_MOB_LAYER
+ reagent_flags = TRANSPARENT | DRAINABLE
+ rcd_cost = 50
+ rcd_delay = 50
+ buffer = 100
+ ///how much do we fill
+ var/wanted_amount = 10
+ ///where things are sent
+ var/turf/goodspot = null
+ ///where things are taken
+ var/turf/inputspot = null
+ ///where beakers that are already full will be sent
+ var/turf/badspot = null
+
+/obj/machinery/plumbing/bottler/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_demand, bolt)
+ setDir(dir)
+
+/obj/machinery/plumbing/bottler/can_be_rotated(mob/user, rotation_type)
+ if(anchored)
+ to_chat(user, "It is fastened to the floor!")
+ return FALSE
+ return TRUE
+
+///changes the tile array
+/obj/machinery/plumbing/bottler/setDir(newdir)
+ . = ..()
+ switch(dir)
+ if(NORTH)
+ goodspot = get_step(get_turf(src), NORTH)
+ inputspot = get_step(get_turf(src), SOUTH)
+ badspot = get_step(get_turf(src), EAST)
+ if(SOUTH)
+ goodspot = get_step(get_turf(src), SOUTH)
+ inputspot = get_step(get_turf(src), NORTH)
+ badspot = get_step(get_turf(src), WEST)
+ if(WEST)
+ goodspot = get_step(get_turf(src), WEST)
+ inputspot = get_step(get_turf(src), EAST)
+ badspot = get_step(get_turf(src), NORTH)
+ if(EAST)
+ goodspot = get_step(get_turf(src), EAST)
+ inputspot = get_step(get_turf(src), WEST)
+ badspot = get_step(get_turf(src), SOUTH)
+
+///changing input ammount with a window
+/obj/machinery/plumbing/bottler/interact(mob/user)
+ . = ..()
+ wanted_amount = clamp(round(input(user,"maximum is 100u","set ammount to fill with") as num|null, 1), 1, 100)
+ reagents.clear_reagents()
+ to_chat(user, " The [src] will now fill for [wanted_amount]u.")
+
+/obj/machinery/plumbing/bottler/process()
+ if(stat & NOPOWER)
+ return
+ ///see if machine has enough to fill
+ if(reagents.total_volume >= wanted_amount && anchored)
+ var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used
+ if(istype(AM, /obj/item/reagent_containers) && (!istype(AM, /obj/item/reagent_containers/hypospray/medipen)))
+ var/obj/item/reagent_containers/B = AM
+ ///see if it would overflow else inject
+ if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume)
+ reagents.trans_to(B, wanted_amount)
+ B.forceMove(goodspot)
+ return
+ ///glass was full so we move it away
+ AM.forceMove(badspot)
+ if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject
+ AM.forceMove(goodspot)
+ reagents.trans_to(AM, wanted_amount)
+ return
+ if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things
+ reagents.trans_to(AM, wanted_amount)
+ return
diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm
new file mode 100644
index 0000000000..b61383ea4a
--- /dev/null
+++ b/code/modules/plumbing/plumbers/destroyer.dm
@@ -0,0 +1,21 @@
+/obj/machinery/plumbing/disposer
+ name = "chemical disposer"
+ desc = "Breaks down chemicals and annihilates them."
+ icon_state = "disposal"
+ ///we remove 10 reagents per second
+ var/disposal_rate = 10
+
+/obj/machinery/plumbing/disposer/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_demand, bolt)
+
+/obj/machinery/plumbing/disposer/process()
+ if(stat & NOPOWER)
+ return
+ if(reagents.total_volume)
+ if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states
+ icon_state = initial(icon_state) + "_working"
+ reagents.remove_any(disposal_rate)
+ else
+ if(icon_state != initial(icon_state))
+ icon_state = initial(icon_state)
diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm
new file mode 100644
index 0000000000..b1e1e4b676
--- /dev/null
+++ b/code/modules/plumbing/plumbers/fermenter.dm
@@ -0,0 +1,59 @@
+/obj/machinery/plumbing/fermenter //FULLY AUTOMATIC BEER BREWING. TRULY, THE FUTURE.
+ name = "chemical fermenter"
+ desc = "Turns plants into various types of booze."
+ icon_state = "fermenter"
+ layer = ABOVE_ALL_MOB_LAYER
+ reagent_flags = TRANSPARENT | DRAINABLE
+ rcd_cost = 30
+ rcd_delay = 30
+ buffer = 400
+ ///input dir
+ var/eat_dir = SOUTH
+
+/obj/machinery/plumbing/fermenter/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
+
+/obj/machinery/plumbing/fermenter/can_be_rotated(mob/user,rotation_type)
+ if(anchored)
+ to_chat(user, "It is fastened to the floor!")
+ return FALSE
+ switch(eat_dir)
+ if(WEST)
+ eat_dir = NORTH
+ return TRUE
+ if(EAST)
+ eat_dir = SOUTH
+ return TRUE
+ if(NORTH)
+ eat_dir = EAST
+ return TRUE
+ if(SOUTH)
+ eat_dir = WEST
+ return TRUE
+
+/obj/machinery/plumbing/fermenter/CanPass(atom/movable/AM)
+ . = ..()
+ if(!anchored)
+ return
+ var/move_dir = get_dir(loc, AM.loc)
+ if(move_dir == eat_dir)
+ return TRUE
+
+/obj/machinery/plumbing/fermenter/Crossed(atom/movable/AM)
+ . = ..()
+ ferment(AM)
+
+/obj/machinery/plumbing/fermenter/proc/ferment(atom/AM)
+ if(stat & NOPOWER)
+ return
+ if(reagents.holder_full())
+ return
+ if(!isitem(AM))
+ return
+ if(istype(AM, /obj/item/reagent_containers/food/snacks/grown))
+ var/obj/item/reagent_containers/food/snacks/grown/G = AM
+ if(G.distill_reagent)
+ var/amount = G.seed.potency * 0.25
+ reagents.add_reagent(G.distill_reagent, amount)
+ qdel(G)
diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm
new file mode 100644
index 0000000000..1ffd170507
--- /dev/null
+++ b/code/modules/plumbing/plumbers/filter.dm
@@ -0,0 +1,65 @@
+///chemical plumbing filter. If it's not filtered by left and right, it goes straight.
+/obj/machinery/plumbing/filter
+ name = "chemical filter"
+ desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port."
+ icon_state = "filter"
+ density = FALSE
+
+ ///whitelist of chems id's that go to the left side. Empty to disable port
+ var/list/left = list()
+ ///whitelist of chem id's that go to the right side. Empty to disable port
+ var/list/right = list()
+ ///whitelist of chems but their name instead of path
+ var/list/english_left = list()
+ ///whitelist of chems but their name instead of path
+ var/list/english_right = list()
+
+/obj/machinery/plumbing/filter/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/filter, bolt)
+
+/obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemFilter", name)
+ ui.open()
+
+/obj/machinery/plumbing/filter/ui_data(mob/user)
+ var/list/data = list()
+ data["left"] = english_left
+ data["right"] = english_right
+ return data
+
+/obj/machinery/plumbing/filter/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("add")
+ var/new_chem_name = params["name"]
+ var/chem_id = get_chem_id(new_chem_name)
+ if(chem_id)
+ switch(params["which"])
+ if("left")
+ if(!left.Find(chem_id))
+ english_left += new_chem_name
+ left += chem_id
+ if("right")
+ if(!right.Find(chem_id))
+ english_right += new_chem_name
+ right += chem_id
+ else
+ to_chat(usr, "No such known reagent exists!")
+
+ if("remove")
+ var/chem_name = params["reagent"]
+ var/chem_id = get_chem_id(chem_name)
+ switch(params["which"])
+ if("left")
+ if(english_left.Find(chem_name))
+ english_left -= chem_name
+ left -= chem_id
+ if("right")
+ if(english_right.Find(chem_name))
+ english_right -= chem_name
+ right -= chem_id
diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm
new file mode 100644
index 0000000000..f39c79f906
--- /dev/null
+++ b/code/modules/plumbing/plumbers/grinder_chemical.dm
@@ -0,0 +1,64 @@
+/obj/machinery/plumbing/grinder_chemical
+ name = "chemical grinder"
+ desc = "chemical grinder."
+ icon_state = "grinder_chemical"
+ layer = ABOVE_ALL_MOB_LAYER
+ reagent_flags = TRANSPARENT | DRAINABLE
+ rcd_cost = 30
+ rcd_delay = 30
+ buffer = 400
+ var/eat_dir = NORTH
+
+/obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
+
+/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type)
+ if(anchored)
+ to_chat(user, "It is fastened to the floor!")
+ return FALSE
+ switch(eat_dir)
+ if(WEST)
+ eat_dir = NORTH
+ return TRUE
+ if(EAST)
+ eat_dir = SOUTH
+ return TRUE
+ if(NORTH)
+ eat_dir = EAST
+ return TRUE
+ if(SOUTH)
+ eat_dir = WEST
+ return TRUE
+
+/obj/machinery/plumbing/grinder_chemical/CanPass(atom/movable/AM)
+ . = ..()
+ if(!anchored)
+ return
+ var/move_dir = get_dir(loc, AM.loc)
+ if(move_dir == eat_dir)
+ return TRUE
+
+/obj/machinery/plumbing/grinder_chemical/Crossed(atom/movable/AM)
+ . = ..()
+ grind(AM)
+
+/obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM)
+ if(stat & NOPOWER)
+ return
+ if(reagents.holder_full())
+ return
+ if(!isitem(AM))
+ return
+ var/obj/item/I = AM
+ if(I.juice_results || I.grind_results)
+ if(I.juice_results)
+ I.on_juice()
+ reagents.add_reagent_list(I.juice_results)
+ if(I.reagents)
+ I.reagents.trans_to(src, I.reagents.total_volume)
+ qdel(I)
+ return
+ I.on_grind()
+ reagents.add_reagent_list(I.grind_results)
+ qdel(I)
diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm
new file mode 100644
index 0000000000..fb7553a4d5
--- /dev/null
+++ b/code/modules/plumbing/plumbers/medipenrefill.dm
@@ -0,0 +1,94 @@
+/obj/machinery/medipen_refiller
+ name = "Medipen Refiller"
+ desc = "A machine that refills used medipens with chemicals."
+ icon = 'icons/obj/machines/medipen_refiller.dmi'
+ icon_state = "medipen_refiller"
+ density = TRUE
+ circuit = /obj/item/circuitboard/machine/medipen_refiller
+ idle_power_usage = 100
+ /// list of medipen subtypes it can refill
+ var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine,
+ /obj/item/reagent_containers/hypospray/medipen/ekit = /datum/reagent/medicine/epinephrine,
+ /obj/item/reagent_containers/hypospray/medipen/firelocker = /datum/reagent/medicine/oxandrolone,
+ /obj/item/reagent_containers/hypospray/medipen/stimpack = /datum/reagent/medicine/ephedrine,
+ /obj/item/reagent_containers/hypospray/medipen/blood_loss = /datum/reagent/medicine/coagulant/weak)
+ /// var to prevent glitches in the animation
+ var/busy = FALSE
+
+/obj/machinery/medipen_refiller/Initialize()
+ . = ..()
+ create_reagents(100, TRANSPARENT)
+ for(var/obj/item/stock_parts/matter_bin/B in component_parts)
+ reagents.maximum_volume += 100 * B.rating
+ AddComponent(/datum/component/plumbing/simple_demand)
+
+
+/obj/machinery/medipen_refiller/RefreshParts()
+ var/new_volume = 100
+ for(var/obj/item/stock_parts/matter_bin/B in component_parts)
+ new_volume += 100 * B.rating
+ if(!reagents)
+ create_reagents(new_volume, TRANSPARENT)
+ reagents.maximum_volume = new_volume
+ return TRUE
+
+/// handles the messages and animation, calls refill to end the animation
+/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params)
+ if(busy)
+ to_chat(user, "The machine is busy.")
+ return
+ if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
+ var/obj/item/reagent_containers/RC = I
+ var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this)
+ if(units)
+ to_chat(user, "You transfer [units] units of the solution to the [name].")
+ return
+ else
+ to_chat(user, "The [name] is full.")
+ return
+ if(istype(I, /obj/item/reagent_containers/hypospray/medipen))
+ var/obj/item/reagent_containers/hypospray/medipen/P = I
+ if(!(LAZYFIND(allowed, P.type)))
+ to_chat(user, "Error! Unknown schematics.")
+ return
+ if(P.reagents?.reagent_list.len)
+ to_chat(user, "The medipen is already filled.")
+ return
+ if(reagents.has_reagent(allowed[P.type], 10))
+ busy = TRUE
+ add_overlay("active")
+ addtimer(CALLBACK(src, .proc/refill, P, user), 20)
+ qdel(P)
+ return
+ to_chat(user, "There aren't enough reagents to finish this operation.")
+ return
+ ..()
+
+/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
+ to_chat(user, "You start furiously plunging [name].")
+ if(do_after(user, 30, target = src))
+ to_chat(user, "You finish plunging the [name].")
+ reagents.clear_reagents()
+
+/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I)
+ ..()
+ default_unfasten_wrench(user, I)
+ return TRUE
+
+/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I)
+ ..()
+ default_deconstruction_crowbar(I)
+ return TRUE
+
+/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(!.)
+ return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I)
+
+/// refills the medipen
+/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user)
+ new P.type(loc)
+ reagents.remove_reagent(allowed[P.type], 10)
+ cut_overlays()
+ busy = FALSE
+ to_chat(user, "Medipen refilled.")
diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm
new file mode 100644
index 0000000000..56510fac87
--- /dev/null
+++ b/code/modules/plumbing/plumbers/pill_press.dm
@@ -0,0 +1,127 @@
+///We take a constant input of reagents, and produce a pill once a set volume is reached
+/obj/machinery/plumbing/pill_press
+ name = "chemical press"
+ desc = "A press that makes pills, patches and bottles."
+ icon_state = "pill_press"
+ ///maximum size of a pill
+ var/max_pill_volume = 50
+ ///maximum size of a patch
+ var/max_patch_volume = 40
+ ///maximum size of a bottle
+ var/max_bottle_volume = 30
+ ///current operating product (pills or patches)
+ var/product = "pill"
+ ///the minimum size a pill or patch can be
+ var/min_volume = 5
+ ///the maximum size a pill or patch can be
+ var/max_volume = 50
+ ///selected size of the product
+ var/current_volume = 10
+ ///prefix for the product name
+ var/product_name = "factory"
+ ///the icon_state number for the pill.
+ var/pill_number = RANDOM_PILL_STYLE
+ ///list of id's and icons for the pill selection of the ui
+ var/list/pill_styles
+ ///list of products stored in the machine, so we dont have 610 pills on one tile
+ var/list/stored_products = list()
+ ///max amount of pills allowed on our tile before we start storing them instead
+ var/max_floor_products = 50 //haha massive pill piles
+
+/obj/machinery/plumbing/pill_press/examine(mob/user)
+ . = ..()
+ . += "The [name] currently has [stored_products.len] stored. There needs to be less than [max_floor_products ] on the floor to continue dispensing."
+
+/obj/machinery/plumbing/pill_press/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_demand, bolt)
+
+ //expertly copypasted from chemmasters
+ var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills)
+ pill_styles = list()
+ for (var/x in 1 to PILL_STYLE_COUNT)
+ var/list/SL = list()
+ SL["id"] = x
+ SL["htmltag"] = assets.icon_tag("pill[x]")
+ pill_styles += list(SL)
+
+
+/obj/machinery/plumbing/pill_press/process()
+ if(stat & NOPOWER)
+ return
+ if(reagents.total_volume >= current_volume)
+ if (product == "pill")
+ var/obj/item/reagent_containers/pill/P = new(src)
+ reagents.trans_to(P, current_volume)
+ P.name = trim("[product_name] pill")
+ stored_products += P
+ if(pill_number == RANDOM_PILL_STYLE)
+ P.icon_state = "pill[rand(1,21)]"
+ else
+ P.icon_state = "pill[pill_number]"
+ if(P.icon_state == "pill4") //mirrored from chem masters
+ P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality."
+ else if (product == "patch")
+ var/obj/item/reagent_containers/pill/patch/P = new(src)
+ reagents.trans_to(P, current_volume)
+ P.name = trim("[product_name] patch")
+ stored_products += P
+ else if (product == "bottle")
+ var/obj/item/reagent_containers/glass/bottle/P = new(src)
+ reagents.trans_to(P, current_volume)
+ P.name = trim("[product_name] bottle")
+ stored_products += P
+ if(stored_products.len)
+ var/pill_amount = 0
+ for(var/obj/item/reagent_containers/pill/P in loc)
+ pill_amount++
+ if(pill_amount >= max_floor_products) //too much so just stop
+ break
+ if(pill_amount < max_floor_products)
+ var/atom/movable/AM = stored_products[1] //AM because forceMove is all we need
+ stored_products -= AM
+ AM.forceMove(drop_location())
+
+
+/obj/machinery/plumbing/pill_press/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/simple/pills),
+ )
+
+/obj/machinery/plumbing/pill_press/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemPress", name)
+ ui.open()
+
+/obj/machinery/plumbing/pill_press/ui_data(mob/user)
+ var/list/data = list()
+ data["pill_style"] = pill_number
+ data["current_volume"] = current_volume
+ data["product_name"] = product_name
+ data["pill_styles"] = pill_styles
+ data["product"] = product
+ data["min_volume"] = min_volume
+ data["max_volume"] = max_volume
+ return data
+
+/obj/machinery/plumbing/pill_press/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("change_pill_style")
+ pill_number = clamp(text2num(params["id"]), 1 , PILL_STYLE_COUNT)
+ if("change_current_volume")
+ current_volume = clamp(text2num(params["volume"]), min_volume, max_volume)
+ if("change_product_name")
+ product_name = html_encode(params["name"])
+ if("change_product")
+ product = params["product"]
+ if (product == "pill")
+ max_volume = max_pill_volume
+ else if (product == "patch")
+ max_volume = max_patch_volume
+ else if (product == "bottle")
+ max_volume = max_bottle_volume
+ current_volume = clamp(current_volume, min_volume, max_volume)
diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm
new file mode 100644
index 0000000000..c24e48098d
--- /dev/null
+++ b/code/modules/plumbing/plumbers/pumps.dm
@@ -0,0 +1,64 @@
+///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We don't need to be wired.
+/obj/machinery/plumbing/liquid_pump
+ name = "liquid pump"
+ desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun
+ icon = 'icons/obj/plumbing/plumbers.dmi'
+ icon_state = "pump"
+ anchored = FALSE
+ density = TRUE
+ idle_power_usage = 10
+ active_power_usage = 1000
+
+ rcd_cost = 30
+ rcd_delay = 40
+
+ ///units we pump per process (2 seconds)
+ var/pump_power = 2
+ ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try
+ var/geyserless = FALSE
+ ///The geyser object
+ var/obj/structure/geyser/geyser
+ ///volume of our internal buffer
+ var/volume = 200
+
+/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
+
+///please note that the component has a hook in the parent call, wich handles activating and deactivating
+/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ . = ..()
+ if(. == SUCCESSFUL_UNFASTEN)
+ geyser = null
+ update_icon()
+ geyserless = FALSE //we switched state, so lets just set this back aswell
+
+/obj/machinery/plumbing/liquid_pump/process()
+ if(!anchored || panel_open || geyserless)
+ return
+
+ if(!geyser)
+ for(var/obj/structure/geyser/G in loc.contents)
+ geyser = G
+ update_icon()
+ if(!geyser) //we didnt find one, abort
+ geyserless = TRUE
+ visible_message("The [name] makes a sad beep!")
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50)
+ return
+
+ pump()
+
+///pump up that sweet geyser nectar
+/obj/machinery/plumbing/liquid_pump/proc/pump()
+ if(!geyser || !geyser.reagents)
+ return
+ geyser.reagents.trans_to(src, pump_power)
+
+/obj/machinery/plumbing/liquid_pump/update_icon_state()
+ if(geyser)
+ icon_state = initial(icon_state) + "-on"
+ else if(panel_open)
+ icon_state = initial(icon_state) + "-open"
+ else
+ icon_state = initial(icon_state)
diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm
new file mode 100644
index 0000000000..949543c300
--- /dev/null
+++ b/code/modules/plumbing/plumbers/reaction_chamber.dm
@@ -0,0 +1,63 @@
+///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents seperated and only reacts under your given terms
+/obj/machinery/plumbing/reaction_chamber
+ name = "reaction chamber"
+ desc = "Keeps chemicals seperated until given conditions are met."
+ icon_state = "reaction_chamber"
+ buffer = 200
+ reagent_flags = TRANSPARENT | NO_REACT
+
+ /**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled.
+ * example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50)
+ */
+ var/list/required_reagents = list()
+ ///our reagent goal has been reached, so now we lock our inputs and start emptying
+ var/emptying = FALSE
+
+/obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/reaction_chamber, bolt)
+
+/obj/machinery/plumbing/reaction_chamber/on_reagent_change()
+ if(reagents.total_volume == 0 && emptying) //we were emptying, but now we aren't
+ emptying = FALSE
+ reagent_flags |= NO_REACT
+
+/obj/machinery/plumbing/reaction_chamber/power_change()
+ . = ..()
+ if(use_power != NO_POWER_USE)
+ icon_state = initial(icon_state) + "_on"
+ else
+ icon_state = initial(icon_state)
+
+/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemReactionChamber", name)
+ ui.open()
+
+/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user)
+ var/list/data = list()
+ var/list/text_reagents = list()
+ for(var/A in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath
+ var/datum/reagent/R = A
+ text_reagents[initial(R.name)] = required_reagents[R]
+
+ data["reagents"] = text_reagents
+ data["emptying"] = emptying
+ return data
+
+/obj/machinery/plumbing/reaction_chamber/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("remove")
+ var/reagent = get_chem_id(params["chem"])
+ if(reagent)
+ required_reagents.Remove(reagent)
+ if("add")
+ var/input_reagent = get_chem_id(params["chem"])
+ if(input_reagent && !required_reagents.Find(input_reagent))
+ var/input_amount = text2num(params["amount"])
+ if(input_amount)
+ required_reagents[input_reagent] = input_amount
diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm
new file mode 100644
index 0000000000..a26813486c
--- /dev/null
+++ b/code/modules/plumbing/plumbers/splitters.dm
@@ -0,0 +1,50 @@
+///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component
+/obj/machinery/plumbing/splitter
+ name = "Chemical Splitter"
+ desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts."
+ icon_state = "splitter"
+ buffer = 100
+ density = FALSE
+
+ ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct.
+ var/turn_straight = TRUE
+ ///how much we must transfer straight. note input can be as high as 10 reagents per process, usually
+ var/transfer_straight = 5
+ ///how much we must transfer to the side
+ var/transfer_side = 5
+ //the maximum you can set the transfer to
+ var/max_transfer = 9
+
+
+/obj/machinery/plumbing/splitter/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/splitter, bolt)
+
+/obj/machinery/plumbing/splitter/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemSplitter", name)
+ ui.open()
+
+/obj/machinery/plumbing/splitter/ui_data(mob/user)
+ var/list/data = list()
+ data["straight"] = transfer_straight
+ data["side"] = transfer_side
+ data["max_transfer"] = max_transfer
+ return data
+
+/obj/machinery/plumbing/splitter/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("set_amount")
+ var/direction = params["target"]
+ var/value = clamp(text2num(params["amount"]), 1, max_transfer)
+ switch(direction)
+ if("straight")
+ transfer_straight = value
+ if("side")
+ transfer_side = value
+ else
+ return FALSE
diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm
new file mode 100644
index 0000000000..c2bc3439ff
--- /dev/null
+++ b/code/modules/plumbing/plumbers/synthesizer.dm
@@ -0,0 +1,111 @@
+///A single machine that produces a single chem. Can be placed in unison with others through plumbing to create chemical factories
+/obj/machinery/plumbing/synthesizer
+ name = "chemical synthesizer"
+ desc = "Produces a single chemical at a given volume. Must be plumbed. Most effective when working in unison with other chemical synthesizers, heaters and filters."
+
+ icon_state = "synthesizer"
+ icon = 'icons/obj/plumbing/plumbers.dmi'
+ rcd_cost = 25
+ rcd_delay = 15
+
+ ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity
+ var/amount = 1
+ ///The maximum we can produce for every process
+ buffer = 5
+ ///I track them here because I have no idea how I'd make tgui loop like that
+ var/static/list/possible_amounts = list(0,1,2,3,4,5)
+ ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial.
+ var/datum/reagent/reagent_id = null
+ ///straight up copied from chem dispenser. Being a subtype would be extremely tedious and making it global would restrict potential subtypes using different dispensable_reagents
+ var/list/dispensable_reagents = list(
+ /datum/reagent/aluminium,
+ /datum/reagent/bromine,
+ /datum/reagent/carbon,
+ /datum/reagent/chlorine,
+ /datum/reagent/copper,
+ /datum/reagent/consumable/ethanol,
+ /datum/reagent/fluorine,
+ /datum/reagent/hydrogen,
+ /datum/reagent/iodine,
+ /datum/reagent/iron,
+ /datum/reagent/lithium,
+ /datum/reagent/mercury,
+ /datum/reagent/nitrogen,
+ /datum/reagent/oxygen,
+ /datum/reagent/phosphorus,
+ /datum/reagent/potassium,
+ /datum/reagent/radium,
+ /datum/reagent/silicon,
+ /datum/reagent/silver,
+ /datum/reagent/sodium,
+ /datum/reagent/stable_plasma,
+ /datum/reagent/consumable/sugar,
+ /datum/reagent/sulfur,
+ /datum/reagent/toxin/acid,
+ /datum/reagent/water,
+ /datum/reagent/fuel,
+ )
+
+/obj/machinery/plumbing/synthesizer/Initialize(mapload, bolt)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt)
+
+/obj/machinery/plumbing/synthesizer/process()
+ if(stat & NOPOWER || !reagent_id || !amount)
+ return
+ if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise
+ return
+ reagents.add_reagent(reagent_id, amount)
+
+/obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemSynthesizer", name)
+ ui.open()
+
+/obj/machinery/plumbing/synthesizer/ui_data(mob/user)
+ var/list/data = list()
+
+ var/is_hallucinating = user.hallucinating()
+ var/list/chemicals = list()
+
+ for(var/A in dispensable_reagents)
+ var/datum/reagent/R = GLOB.chemical_reagents_list[A]
+ if(R)
+ var/chemname = R.name
+ if(is_hallucinating && prob(5))
+ chemname = "[pick_list_replacements("hallucination.json", "chemicals")]"
+ chemicals.Add(list(list("title" = chemname, "id" = ckey(R.name))))
+ data["chemicals"] = chemicals
+ data["amount"] = amount
+ data["possible_amounts"] = possible_amounts
+
+ data["current_reagent"] = ckey(initial(reagent_id.name))
+ return data
+
+/obj/machinery/plumbing/synthesizer/ui_act(action, params)
+ if(..())
+ return
+ . = TRUE
+ switch(action)
+ if("amount")
+ var/new_amount = text2num(params["target"])
+ if(new_amount in possible_amounts)
+ amount = new_amount
+ . = TRUE
+ if("select")
+ var/new_reagent = GLOB.name2reagent[params["reagent"]]
+ if(new_reagent in dispensable_reagents)
+ reagent_id = new_reagent
+ . = TRUE
+ update_icon()
+ reagents.clear_reagents()
+
+/obj/machinery/plumbing/synthesizer/update_overlays()
+ . = ..()
+ var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay")
+ if(reagent_id)
+ r_overlay.color = initial(reagent_id.color)
+ else
+ r_overlay.color = "#FFFFFF"
+ . += r_overlay
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index a70e508476..2480288484 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1009,7 +1009,7 @@
. = UI_INTERACTIVE
/obj/machinery/power/apc/ui_act(action, params)
- if(..() || !can_use(usr, 1) || (locked && area.hasSiliconAccessInArea(usr, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE) && !failure_timer && action != "toggle_nightshift") || (integration_cog && (is_servant_of_ratvar(usr))))
+ if(..() || !can_use(usr, 1) || (locked && !area.hasSiliconAccessInArea(usr, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE) && !failure_timer && action != "toggle_nightshift" && (!integration_cog || !(is_servant_of_ratvar(usr)))))
return
switch(action)
if("lock")
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 78a20e5b62..54b1362518 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -66,7 +66,7 @@
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
var/heat = energy_transfer*(1-efficiency)
- lastgen += energy_transfer*efficiency
+ lastgen += LOGISTIC_FUNCTION(1000000,0.0034,delta_temperature,2000)
hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index d0d846c144..78ca6e9280 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -76,7 +76,8 @@
return 1
/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0)
- if(INTERACTING_WITH(user, A))
+ if(INTERACTING_WITH(user, src) || INTERACTING_WITH(user, A))
+ to_chat(user, "You're already doing that!")
return FALSE
var/num_loaded = 0
if(!can_load(user))
@@ -84,13 +85,16 @@
if(istype(A, /obj/item/ammo_box))
var/obj/item/ammo_box/AM = A
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- if(load_delay && do_after(user, load_delay, target = src))
- var/did_load = give_round(AC, replace_spent)
- if(did_load)
- AM.stored_ammo -= AC
- num_loaded++
- if(!did_load || !multiload)
- break
+ if(load_delay || AM.load_delay)
+ var/loadtime = max(AM.load_delay, load_delay)
+ if(!do_after(user, loadtime, target = src))
+ return FALSE
+ var/did_load = give_round(AC, replace_spent)
+ if(did_load)
+ AM.stored_ammo -= AC
+ num_loaded++
+ if(!did_load || !multiload)
+ break
if(istype(A, /obj/item/ammo_casing))
var/obj/item/ammo_casing/AC = A
if(give_round(AC, replace_spent))
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 0b00c89c02..8cd49bdf16 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -149,6 +149,9 @@
icon = 'icons/obj/ammo.dmi'
icon_state = "shotgunclip"
caliber = "shotgun" // slapped in to allow shell mix n match
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
+ w_class = WEIGHT_CLASS_NORMAL
+ w_volume = ITEM_VOLUME_STRIPPER_CLIP
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 4
var/pixeloffsetx = 4
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index ee073dbfcd..8cddd5d02f 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -62,7 +62,8 @@
var/no_pin_required = FALSE //whether the gun can be fired without a pin
var/obj/item/flashlight/gun_light
- var/can_flashlight = 0
+ var/can_flashlight = FALSE
+ var/gunlight_state = "flight"
var/obj/item/kitchen/knife/bayonet
var/mutable_appearance/knife_overlay
var/can_bayonet = FALSE
@@ -417,14 +418,7 @@
return
to_chat(user, "You attach \the [K] to the front of \the [src].")
bayonet = K
- var/state = "bayonet" //Generic state.
- if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
- state = bayonet.icon_state
- var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
- knife_overlay = mutable_appearance(bayonet_icons, state)
- knife_overlay.pixel_x = knife_x_offset
- knife_overlay.pixel_y = knife_y_offset
- add_overlay(knife_overlay, TRUE)
+ update_icon()
else if(istype(I, /obj/item/screwdriver))
if(gun_light)
var/obj/item/flashlight/seclite/S = gun_light
@@ -439,8 +433,7 @@
var/obj/item/kitchen/knife/K = bayonet
K.forceMove(get_turf(user))
bayonet = null
- cut_overlay(knife_overlay, TRUE)
- knife_overlay = null
+ update_icon()
else
return ..()
@@ -468,22 +461,35 @@
set_light(gun_light.brightness_on, gun_light.flashlight_power, gun_light.light_color)
else
set_light(0)
- cut_overlays(flashlight_overlay, TRUE)
- var/state = "flight[gun_light.on? "_on":""]" //Generic state.
+ else
+ set_light(0)
+ update_icon()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/gun/update_overlays()
+ . = ..()
+ if(gun_light)
+ var/mutable_appearance/flashlight_overlay
+ var/state = "[gunlight_state][gun_light.on? "_on":""]" //Generic state.
if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state?
state = gun_light.icon_state
flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state)
flashlight_overlay.pixel_x = flight_x_offset
flashlight_overlay.pixel_y = flight_y_offset
- add_overlay(flashlight_overlay, TRUE)
- else
- set_light(0)
- cut_overlays(flashlight_overlay, TRUE)
- flashlight_overlay = null
- update_icon(TRUE)
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+ . += flashlight_overlay
+
+ if(bayonet)
+ var/mutable_appearance/knife_overlay
+ var/state = "bayonet" //Generic state.
+ if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
+ state = bayonet.icon_state
+ var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
+ knife_overlay = mutable_appearance(bayonet_icons, state)
+ knife_overlay.pixel_x = knife_x_offset
+ knife_overlay.pixel_y = knife_y_offset
+ . += knife_overlay
/obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A)
if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index fa8099a257..1aefa51a51 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -53,6 +53,8 @@
..()
if (istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
+ if(AM.load_delay && !do_after(user, AM.load_delay, target = src))
+ return FALSE
if (!magazine && istype(AM, mag_type))
if(user.transferItemToLoc(AM, src))
magazine = AM
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index b31fd2d1e0..9210e66f22 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -18,13 +18,15 @@
/obj/item/gun/ballistic/automatic/proto/unrestricted
pin = /obj/item/firing_pin
-/obj/item/gun/ballistic/automatic/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/update_overlays()
+ . = ..()
if(automatic_burst_overlay)
if(!select)
- add_overlay("[initial(icon_state)]semi")
+ . += ("[initial(icon_state)]semi")
if(select == 1)
- add_overlay("[initial(icon_state)]burst")
+ . += "[initial(icon_state)]burst"
+
+/obj/item/gun/ballistic/automatic/update_icon_state()
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/attackby(obj/item/A, mob/user, params)
@@ -115,8 +117,7 @@
. = ..()
empty_alarm()
-/obj/item/gun/ballistic/automatic/c20r/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/c20r/update_icon_state()
icon_state = "c20r[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/wt550
@@ -141,9 +142,8 @@
. = ..()
spread = 0
-/obj/item/gun/ballistic/automatic/wt550/update_icon()
- ..()
- icon_state = "wt550[magazine ? "-[CEILING(( (get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20.
+/obj/item/gun/ballistic/automatic/wt550/update_icon_state()
+ icon_state = "wt550[magazine ? "-[CEILING(((get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20.
/obj/item/gun/ballistic/automatic/mini_uzi
name = "\improper Type U3 Uzi"
@@ -160,6 +160,7 @@
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/gunshot_smg.ogg'
can_suppress = FALSE
+ automatic_burst_overlay = FALSE
var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel
burst_size = 3
burst_shot_delay = 2
@@ -191,18 +192,19 @@
underbarrel.attackby(A, user, params)
else
..()
-/obj/item/gun/ballistic/automatic/m90/update_icon()
- ..()
- cut_overlays()
+/obj/item/gun/ballistic/automatic/m90/update_overlays()
+ . = ..()
switch(select)
if(0)
- add_overlay("[initial(icon_state)]semi")
+ . += "[initial(icon_state)]semi"
if(1)
- add_overlay("[initial(icon_state)]burst")
+ . += "[initial(icon_state)]burst"
if(2)
- add_overlay("[initial(icon_state)]gren")
+ . += "[initial(icon_state)]gren"
+
+/obj/item/gun/ballistic/automatic/m90/update_icon_state()
icon_state = "[initial(icon_state)][magazine ? "" : "-e"]"
- return
+
/obj/item/gun/ballistic/automatic/m90/burst_select()
var/mob/living/carbon/human/user = usr
switch(select)
@@ -257,6 +259,7 @@
weapon_weight = WEAPON_MEDIUM
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/gunshot.ogg'
+ automatic_burst_overlay = FALSE
can_suppress = FALSE
burst_size = 1
pin = /obj/item/firing_pin/implant/pindicate
@@ -269,10 +272,13 @@
. = ..()
update_icon()
-/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_icon()
- cut_overlays()
+/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_icon_state()
+ return
+
+/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_overlays()
+ . = ..()
if(magazine)
- add_overlay("[magazine.icon_state]")
+ . += "[magazine.icon_state]"
icon_state = "bulldog[chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/shotgun/bulldog/afterattack()
@@ -298,6 +304,7 @@
burst_shot_delay = 1
spread = 7
pin = /obj/item/firing_pin/implant/pindicate
+ automatic_burst_overlay = FALSE
/obj/item/gun/ballistic/automatic/l6_saw/unrestricted
pin = /obj/item/firing_pin
@@ -316,7 +323,7 @@
playsound(user, 'sound/weapons/sawclose.ogg', 60, 1)
update_icon()
-/obj/item/gun/ballistic/automatic/l6_saw/update_icon()
+/obj/item/gun/ballistic/automatic/l6_saw/update_icon_state()
icon_state = "l6[cover_open ? "open" : "closed"][magazine ? CEILING(get_ammo(0)/12.5, 1)*25 : "-empty"][suppressed ? "-suppressed" : ""]"
item_state = "l6[cover_open ? "openmag" : "closedmag"]"
@@ -369,9 +376,10 @@
zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
zoom_out_amt = 13
slot_flags = ITEM_SLOT_BACK
+ automatic_burst_overlay = FALSE
actions_types = list()
-/obj/item/gun/ballistic/automatic/sniper_rifle/update_icon()
+/obj/item/gun/ballistic/automatic/sniper_rifle/update_icon_state()
if(magazine)
icon_state = "sniper-mag"
else
@@ -397,9 +405,10 @@
can_suppress = TRUE
w_class = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BACK
+ automatic_burst_overlay = FALSE
actions_types = list()
-/obj/item/gun/ballistic/automatic/surplus/update_icon()
+/obj/item/gun/ballistic/automatic/surplus/update_icon_state()
if(magazine)
icon_state = "surplus"
else
@@ -413,6 +422,7 @@
icon_state = "oldrifle"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/recharge
+ automatic_burst_overlay = FALSE
fire_delay = 2
can_suppress = FALSE
burst_size = 1
@@ -420,7 +430,5 @@
fire_sound = 'sound/weapons/laser.ogg'
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/laser/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/laser/update_icon_state()
icon_state = "oldrifle[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]"
- return
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 004f78235a..9e03207888 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -42,8 +42,7 @@
actions_types = list()
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/gyropistol/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/gyropistol/update_icon_state()
icon_state = "[initial(icon_state)][magazine ? "loaded" : ""]"
/obj/item/gun/ballistic/automatic/speargun
@@ -54,6 +53,7 @@
w_class = WEIGHT_CLASS_BULKY
force = 10
can_suppress = FALSE
+ automatic_burst_overlay = FALSE
mag_type = /obj/item/ammo_box/magazine/internal/speargun
fire_sound = 'sound/weapons/grenadelaunch.ogg'
burst_size = 1
@@ -62,8 +62,9 @@
actions_types = list()
casing_ejector = FALSE
-/obj/item/gun/ballistic/automatic/speargun/update_icon()
- return
+/obj/item/gun/ballistic/automatic/speargun/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/gun/ballistic/automatic/speargun/attack_self()
return
@@ -137,7 +138,7 @@
chamber_round()
update_icon()
-/obj/item/gun/ballistic/rocketlauncher/update_icon()
+/obj/item/gun/ballistic/rocketlauncher/update_icon_state()
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
/obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user)
diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm
index 74b8b210a7..4e27a73300 100644
--- a/code/modules/projectiles/guns/ballistic/magweapon.dm
+++ b/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -75,8 +75,7 @@
recoil = 2
weapon_weight = WEAPON_HEAVY
-/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon_state()
icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
///magpistol///
@@ -92,12 +91,14 @@
fire_delay = 2
inaccuracy_modifier = 0.25
cell_type = /obj/item/stock_parts/cell/magnetic/pistol
+ automatic_burst_overlay = FALSE
-/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon()
- ..()
- cut_overlays()
+/obj/item/gun/ballistic/automatic/magrifle/pistol/update_overlays()
+ . = ..()
if(magazine)
- add_overlay("magpistol-magazine")
+ . += "magpistol-magazine"
+
+/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/magrifle/pistol/nopin
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index cdaadb5c3b..e775fdc05a 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -8,12 +8,12 @@
burst_size = 1
fire_delay = 0
actions_types = list()
+ automatic_burst_overlay = FALSE
/obj/item/gun/ballistic/automatic/pistol/no_mag
spawnwithmagazine = FALSE
-/obj/item/gun/ballistic/automatic/pistol/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/pistol/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload)
@@ -28,6 +28,7 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "cde"
can_unsuppress = TRUE
+ automatic_burst_overlay = FALSE
obj_flags = UNIQUE_RENAME
unique_reskin = list("Default" = "cde",
"N-99" = "n99",
@@ -38,20 +39,18 @@
"PX4 Storm" = "px4"
)
-/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/pistol/modular/update_icon_state()
if(current_skin)
icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
else
icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+
+/obj/item/gun/ballistic/automatic/pistol/modular/update_overlays()
+ . = ..()
if(magazine && suppressed)
- cut_overlays()
- add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
+ . += "[unique_reskin[current_skin]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay
else if (magazine)
- cut_overlays()
- add_overlay("[unique_reskin[current_skin]]-magazine")
- else
- cut_overlays()
+ . += "[unique_reskin[current_skin]]-magazine"
/obj/item/gun/ballistic/automatic/pistol/m1911
name = "\improper M1911"
@@ -77,14 +76,14 @@
force = 14
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = FALSE
+ automatic_burst_overlay = FALSE
-/obj/item/gun/ballistic/automatic/pistol/deagle/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/pistol/deagle/update_overlays()
+ . = ..()
if(magazine)
- cut_overlays()
- add_overlay("deagle_magazine")
- else
- cut_overlays()
+ . += "deagle_magazine"
+
+/obj/item/gun/ballistic/automatic/pistol/deagle/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/pistol/deagle/gold
@@ -142,14 +141,14 @@
actions_types = list()
fire_sound = 'sound/weapons/blastcannon.ogg'
spread = 20 //damn thing has no rifling.
+ automatic_burst_overlay = FALSE
-/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/pistol/antitank/update_overlays()
+ . = ..()
if(magazine)
- cut_overlays()
- add_overlay("atp-mag")
- else
- cut_overlays()
+ . += "atp-mag"
+
+/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index a5ed45dd48..6f1fb96af5 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -348,10 +348,10 @@
else
to_chat(user, "You need at least ten lengths of cable if you want to make a sling!")
-/obj/item/gun/ballistic/revolver/doublebarrel/improvised/update_icon()
- ..()
+/obj/item/gun/ballistic/revolver/doublebarrel/improvised/update_overlays()
+ . = ..()
if(slung)
- icon_state += "sling"
+ . += "[icon_state]sling"
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawoff(mob/user)
. = ..()
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 873b129c8f..ecf6e538b8 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -164,10 +164,10 @@
else
to_chat(user, "You need at least ten lengths of cable if you want to make a sling!")
-/obj/item/gun/ballistic/shotgun/boltaction/improvised/update_icon()
- ..()
+/obj/item/gun/ballistic/shotgun/boltaction/improvised/update_overlays()
+ . = ..()
if(slung)
- icon_state += "sling"
+ . += "[icon_state]sling"
/obj/item/gun/ballistic/shotgun/boltaction/enchanted
name = "enchanted bolt action rifle"
@@ -272,7 +272,7 @@
spread = 2
update_icon()
-/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon()
+/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon_state()
icon_state = "[current_skin ? unique_reskin[current_skin] : "cshotgun"][stock ? "" : "c"]"
//Dual Feed Shotgun
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index 1f66cfdf8a..e7f26670d4 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -27,9 +27,9 @@
burst_size = 1
fire_delay = 0
actions_types = list()
+ automatic_burst_overlay = FALSE
-/obj/item/gun/ballistic/automatic/toy/pistol/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/toy/pistol/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/toy/pistol/riot
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index c2b821dfcf..17dcfa96e6 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -29,7 +29,6 @@
var/charge_sections = 4
ammo_x_offset = 2
var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail
- var/old_ratio = 0 // stores the gun's previous ammo "ratio" to see if it needs an updated icon
var/selfcharge = EGUN_NO_SELFCHARGE // EGUN_SELFCHARGE if true, EGUN_SELFCHARGE_BORG drains the cyborg's cell to recharge its own
var/charge_tick = 0
var/charge_delay = 4
@@ -64,10 +63,20 @@
START_PROCESSING(SSobj, src)
update_icon()
+/obj/item/gun/energy/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/gun/energy/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
+/obj/item/gun/energy/handle_atom_del(atom/A)
+ if(A == cell)
+ cell = null
+ update_icon()
+ return ..()
+
/obj/item/gun/energy/examine(mob/user)
. = ..()
if(!right_click_overridden)
@@ -226,46 +235,47 @@
#undef DECREMENT_OR_WRAP
#undef IS_VALID_INDEX
-/obj/item/gun/energy/update_icon(force_update)
- if(QDELETED(src))
+/obj/item/gun/energy/update_icon_state()
+ if(initial(item_state))
return
..()
+ var/ratio = get_charge_ratio()
+ var/new_item_state = ""
+ new_item_state = initial(icon_state)
+ if(modifystate)
+ var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
+ new_item_state += "[shot.select_name]"
+ new_item_state += "[ratio]"
+ item_state = new_item_state
+
+/obj/item/gun/energy/update_overlays()
+ . = ..()
+ if(QDELETED(src))
+ return
if(!automatic_charge_overlays)
return
- var/ratio = can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
- // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if it's power cell is removed.
- // TG issues #5361 & #47908
- if(ratio == old_ratio && !force_update)
- return
- old_ratio = ratio
- cut_overlays()
- var/iconState = "[icon_state]_charge"
- var/itemState = null
- if(!initial(item_state))
- itemState = icon_state
+ var/overlay_icon_state = "[icon_state]_charge"
+ var/ratio = get_charge_ratio()
if (modifystate)
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
- add_overlay("[icon_state]_[shot.select_name]")
- iconState += "_[shot.select_name]"
- if(itemState)
- itemState += "[shot.select_name]"
+ . += "[icon_state]_[shot.select_name]"
+ overlay_icon_state += "_[shot.select_name]"
if(ratio == 0)
- add_overlay("[icon_state]_empty")
+ . += "[icon_state]_empty"
else
if(!shaded_charge)
- var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState)
+ var/mutable_appearance/charge_overlay = mutable_appearance(icon, overlay_icon_state)
for(var/i = ratio, i >= 1, i--)
charge_overlay.pixel_x = ammo_x_offset * (i - 1)
charge_overlay.pixel_y = ammo_y_offset * (i - 1)
- add_overlay(charge_overlay)
+ . += charge_overlay
else
- add_overlay("[icon_state]_charge[ratio]")
- if(itemState)
- itemState += "[ratio]"
- item_state = itemState
- if(ismob(loc)) //forces inhands to update
- var/mob/M = loc
- M.update_inv_hands()
+ . += "[icon_state]_charge[ratio]"
+
+///Used by update_icon_state() and update_overlays()
+/obj/item/gun/energy/proc/get_charge_ratio()
+ return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0
+ // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed.
/obj/item/gun/energy/suicide_act(mob/living/user)
if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD))
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index 80bb269b21..04eff5afa9 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -207,12 +207,11 @@
to_chat(user,"You switch [src] setting to [setting] mode.")
update_icon()
-/obj/item/gun/energy/dueling/update_icon(force_update)
+/obj/item/gun/energy/dueling/update_overlays(force_update)
. = ..()
if(setting_overlay)
- cut_overlay(setting_overlay)
setting_overlay.icon_state = setting_iconstate()
- add_overlay(setting_overlay)
+ . += setting_overlay
/obj/item/gun/energy/dueling/Destroy()
if(duel)
@@ -363,8 +362,7 @@
STR.max_items = 2
STR.can_hold = typecacheof(/obj/item/gun/energy/dueling)
-/obj/item/storage/lockbox/dueling/update_icon()
- cut_overlays()
+/obj/item/storage/lockbox/dueling/update_icon_state()
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
if(locked)
icon_state = "medalbox+l"
diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index 1b835d35a4..2c9794f391 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -19,17 +19,13 @@
cell_type = /obj/item/stock_parts/cell{charge = 600; maxcharge = 600}
ammo_x_offset = 2
charge_sections = 3
+ gunlight_state = "mini-light"
can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update
/obj/item/gun/energy/e_gun/mini/Initialize()
gun_light = new /obj/item/flashlight/seclite(src)
return ..()
-/obj/item/gun/energy/e_gun/mini/update_icon()
- ..()
- if(gun_light && gun_light.on)
- add_overlay("mini-light")
-
/obj/item/gun/energy/e_gun/stun
name = "tactical energy gun"
desc = "Military issue energy gun, is able to fire stun rounds."
@@ -138,15 +134,15 @@
return
fail_chance = min(fail_chance + round(15/severity), 100)
-/obj/item/gun/energy/e_gun/nuclear/update_icon()
- ..()
+/obj/item/gun/energy/e_gun/nuclear/update_overlays()
+ . = ..()
if(crit_fail)
- add_overlay("[icon_state]_fail_3")
+ . += "[icon_state]_fail_3"
else
switch(fail_tick)
if(0)
- add_overlay("[icon_state]_fail_0")
+ . += "[icon_state]_fail_0"
if(1 to 150)
- add_overlay("[icon_state]_fail_1")
+ . += "[icon_state]_fail_1"
if(151 to INFINITY)
- add_overlay("[icon_state]_fail_2")
+ . += "[icon_state]_fail_2"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 0c723199a1..c1f47ccd1a 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -46,13 +46,6 @@
range = 4
log_override = TRUE
-/obj/item/gun/energy/kinetic_accelerator/premiumka/update_icon()
- ..()
- if(!can_shoot())
- add_overlay("[icon_state]_empty")
- else
- cut_overlays()
-
/obj/item/gun/energy/kinetic_accelerator/getinaccuracy(mob/living/user, bonus_spread, stamloss)
var/old_fire_delay = fire_delay //It's pretty irrelevant tbh but whatever.
fire_delay = overheat_time
@@ -186,12 +179,10 @@
update_icon()
overheat = FALSE
-/obj/item/gun/energy/kinetic_accelerator/update_icon()
- ..()
+/obj/item/gun/energy/kinetic_accelerator/update_overlays()
+ . = ..()
if(!can_shoot())
- add_overlay("[icon_state]_empty")
- else
- cut_overlays()
+ . += "[icon_state]_empty"
//Casing
/obj/item/ammo_casing/energy/kinetic
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 20e847326e..19ca42022d 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -34,11 +34,11 @@
pin = null
ammo_x_offset = 1
-/obj/item/gun/energy/decloner/update_icon()
+/obj/item/gun/energy/decloner/update_overlays()
..()
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
if(!QDELETED(cell) && (cell.charge > shot.e_cost))
- add_overlay("decloner_spin")
+ . += "decloner_spin"
/obj/item/gun/energy/floragun
name = "floral somatoray"
@@ -134,9 +134,10 @@
tool_behaviour = TOOL_WELDER
toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders
-/obj/item/gun/energy/plasmacutter/Initialize()
+/obj/item/gun/energy/plasmacutter/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg')
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/gun/energy/plasmacutter/examine(mob/user)
. = ..()
@@ -166,9 +167,6 @@
/obj/item/gun/energy/plasmacutter/use(amount)
return cell.use(amount * 100)
-/obj/item/gun/energy/plasmacutter/update_icon()
- return
-
/obj/item/gun/energy/plasmacutter/adv
name = "advanced plasma cutter"
icon_state = "adv_plasmacutter"
@@ -183,11 +181,12 @@
icon_state = "wormhole_projector"
pin = null
inaccuracy_modifier = 0.25
+ automatic_charge_overlays = FALSE
var/obj/effect/portal/p_blue
var/obj/effect/portal/p_orange
var/atmos_link = FALSE
-/obj/item/gun/energy/wormhole_projector/update_icon()
+/obj/item/gun/energy/wormhole_projector/update_icon_state()
icon_state = "[initial(icon_state)][current_firemode_index]"
item_state = icon_state
@@ -256,8 +255,9 @@
can_charge = 0
use_cyborg_cell = 1
-/obj/item/gun/energy/printer/update_icon()
- return
+/obj/item/gun/energy/printer/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/gun/energy/printer/emp_act()
return
@@ -321,14 +321,14 @@
inaccuracy_modifier = 0.25
cell_type = /obj/item/stock_parts/cell/super
ammo_type = list(/obj/item/ammo_casing/energy/emitter)
+ automatic_charge_overlays = FALSE
-/obj/item/gun/energy/emitter/update_icon()
- ..()
+/obj/item/gun/energy/emitter/update_icon_state()
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
if(!QDELETED(cell) && (cell.charge > shot.e_cost))
- add_overlay("emitter_carbine_empty")
+ icon_state = "emitter_carbine_empty"
else
- add_overlay("emitter_carbine")
+ icon_state = "emitter_carbine"
//the pickle ray
/obj/item/gun/energy/pickle_gun
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index fd09aa7f9d..5e250d44e2 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -35,6 +35,7 @@
slowdown = 1
item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND | NEEDS_PERMIT
pin = null
+ automatic_charge_overlays = FALSE
var/aiming = FALSE
var/aiming_time = 14
var/aiming_time_fire_threshold = 5
@@ -152,13 +153,13 @@
current_zoom_x = 0
current_zoom_y = 0
-/obj/item/gun/energy/beam_rifle/update_icon()
- cut_overlays()
+/obj/item/gun/energy/beam_rifle/update_overlays()
+ . = ..()
var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1]
if(!QDELETED(cell) && (cell.charge > primary_ammo.e_cost))
- add_overlay(charged_overlay)
+ . += charged_overlay
else
- add_overlay(drained_overlay)
+ . += drained_overlay
/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
if(!structure_piercing)
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index 1c8d519ba8..60b7565333 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -41,18 +41,16 @@
user.put_in_hands(bomb)
user.visible_message("[user] detaches [bomb] from [src].")
bomb = null
+ name = initial(name)
+ desc = initial(desc)
update_icon()
return ..()
-/obj/item/gun/blastcannon/update_icon()
+/obj/item/gun/blastcannon/update_icon_state()
if(bomb)
icon_state = icon_state_loaded
- name = "blast cannon"
- desc = "A makeshift device used to concentrate a bomb's blast energy to a narrow wave."
else
icon_state = initial(icon_state)
- name = initial(name)
- desc = initial(desc)
/obj/item/gun/blastcannon/attackby(obj/O, mob/user)
if(istype(O, /obj/item/transfer_valve))
@@ -65,6 +63,8 @@
return FALSE
user.visible_message("[user] attaches [T] to [src]!")
bomb = T
+ name = "blast cannon"
+ desc = "A makeshift device used to concentrate a bomb's blast energy to a narrow wave."
update_icon()
return TRUE
return ..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index c2662a8342..c489edf88e 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -1165,3 +1165,9 @@
random_reagents += R
var/picked_reagent = pick(random_reagents)
return picked_reagent
+
+/proc/get_chem_id(chem_name)
+ for(var/X in GLOB.chemical_reagents_list)
+ var/datum/reagent/R = GLOB.chemical_reagents_list[X]
+ if(ckey(chem_name) == ckey(lowertext(R.name)))
+ return X
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 207325e1b3..32ac7cecba 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -1,5 +1,3 @@
-#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die
-#define RANDOM_PILL_STYLE 22 //Dont change this one though
/obj/machinery/chem_master
name = "ChemMaster 3000"
diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
index a539897c9d..d22523c4b8 100644
--- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm
+++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm
@@ -36,6 +36,14 @@
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating
+/obj/machinery/smoke_machine/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated))
+ AddComponent(/datum/component/plumbing/simple_demand) //this SURELY CANT' LEAD TO BAD THINGS HAPPENING.
+
+/obj/machinery/smoke_machine/proc/can_be_rotated(mob/user, rotation_type)
+ return !anchored
+
/obj/machinery/smoke_machine/update_icon_state()
if((!is_operational()) || (!on) || (reagents.total_volume == 0))
if (panel_open)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index a85ac8b085..672127cb11 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
if (length(initial(R.name)))
.[ckey(initial(R.name))] = t
+
//Various reagents
//Toxin & acid reagents
//Hydroponics stuff
@@ -52,6 +53,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/metabolizing = FALSE
var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME
var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo?
+ var/datum/material/material //are we made of material?
+
+/datum/reagent/New()
+ . = ..()
+
+ if(material)
+ material = SSmaterials.GetMaterialRef(material)
+
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
@@ -220,4 +229,3 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force)
if(blood_change)
bloodsuckerdatum.AddBloodVolume(blood_change)
-
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index a6e78ae98c..18203f1a4c 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -132,8 +132,8 @@
"You're covered in boiling oil!")
M.emote("scream")
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
- var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
- M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20
+ var/oil_damage = min((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit
+ M.adjustFireLoss(oil_damage * min(reac_volume,20)) //Damage caps at 20
else
..()
return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 8bb34c0a82..37010cbbb5 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -515,12 +515,13 @@
overdose_threshold = 30
pH = 2
value = REAGENT_VALUE_UNCOMMON
+ var/healing = 0.5
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-0.5*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- M.adjustBruteLoss(-0.5*REM, 0)
- M.adjustFireLoss(-0.5*REM, 0)
+ M.adjustToxLoss(-healing*REM, 0)
+ M.adjustOxyLoss(-healing*REM, 0)
+ M.adjustBruteLoss(-healing*REM, 0)
+ M.adjustFireLoss(-healing*REM, 0)
..()
. = 1
@@ -532,6 +533,12 @@
..()
. = 1
+/datum/reagent/medicine/omnizine/protozine
+ name = "Protozine"
+ description = "A less environmentally friendly and somewhat weaker variant of omnizine."
+ color = "#d8c7b7"
+ healing = 0.2
+
/datum/reagent/medicine/calomel
name = "Calomel"
description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 3433824282..5c01fd8cf6 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -313,6 +313,13 @@
metabolization_rate = 45 * REAGENTS_METABOLISM
. = 1
+/datum/reagent/water/hollowwater
+ name = "Hollow Water"
+ description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
+ color = "#88878777"
+ taste_description = "emptyiness"
+
+
/datum/reagent/water/holywater
name = "Holy Water"
description = "Water blessed by some deity."
@@ -950,6 +957,7 @@
color = "#1C1300" // rgb: 30, 20, 0
taste_description = "sour chalk"
pH = 5
+ material = /datum/material/diamond
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
if(!isspaceturf(T))
@@ -1072,6 +1080,7 @@
pH = 6
overdose_threshold = 30
color = "#c2391d"
+ material = /datum/material/iron
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
if((HAS_TRAIT(C, TRAIT_NOMARROW)))
@@ -1103,6 +1112,7 @@
reagent_state = SOLID
color = "#F7C430" // rgb: 247, 196, 48
taste_description = "expensive metal"
+ material = /datum/material/gold
/datum/reagent/silver
name = "Silver"
@@ -1110,6 +1120,7 @@
reagent_state = SOLID
color = "#D0D0D0" // rgb: 208, 208, 208
taste_description = "expensive yet reasonable metal"
+ material = /datum/material/silver
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.has_bane(BANE_SILVER))
@@ -1123,6 +1134,7 @@
color = "#B8B8C0" // rgb: 184, 184, 192
taste_description = "the inside of a reactor"
pH = 4
+ material = /datum/material/uranium
/datum/reagent/uranium/on_mob_life(mob/living/carbon/M)
M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
@@ -1144,6 +1156,7 @@
taste_description = "fizzling blue"
pH = 12
value = REAGENT_VALUE_RARE
+ material = /datum/material/bluespace
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
@@ -1182,6 +1195,7 @@
color = "#A8A8A8" // rgb: 168, 168, 168
taste_mult = 0
pH = 10
+ material = /datum/material/glass
/datum/reagent/fuel
name = "Welding fuel"
@@ -2206,6 +2220,66 @@
color = "#f7685e"
metabolization_rate = REAGENTS_METABOLISM * 0.25
+/datum/reagent/wittel
+ name = "Wittel"
+ description = "An extremely rare metallic-white substance only found on demon-class planets."
+ color = "#FFFFFF" // rgb: 255, 255, 255
+ taste_mult = 0 // oderless and tasteless
+
+/datum/reagent/metalgen
+ name = "Metalgen"
+ data = list("material"=null)
+ description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches."
+ color = "#b000aa"
+ taste_mult = 0 // oderless and tasteless
+ var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ var/minumum_material_amount = 100
+
+/datum/reagent/metalgen/reaction_obj(obj/O, volume)
+ metal_morph(O)
+ return
+
+/datum/reagent/metalgen/reaction_turf(turf/T, volume)
+ metal_morph(T)
+ return
+
+///turn an object into a special material
+/datum/reagent/metalgen/proc/metal_morph(atom/A)
+ var/metal_ref = data["material"]
+ if(!metal_ref)
+ return
+ var/metal_amount = 0
+
+ for(var/B in A.custom_materials) //list with what they're made of
+ metal_amount += A.custom_materials[B]
+
+ if(!metal_amount)
+ metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist
+
+ var/list/metal_dat = list()
+ metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf
+
+ A.material_flags = applied_material_flags
+ A.set_custom_materials(metal_dat)
+
+/datum/reagent/gravitum
+ name = "Gravitum"
+ description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even
+ color = "#050096" // rgb: 5, 0, 150
+ taste_mult = 0 // oderless and tasteless
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use
+ var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche
+
+/datum/reagent/gravitum/reaction_obj(obj/O, volume)
+ O.AddElement(/datum/element/forced_gravity, 0)
+
+ addtimer(CALLBACK(O, .proc/_RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier)
+
+/datum/reagent/gravitum/on_mob_add(mob/living/L)
+ L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
+
+/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L)
+ L.RemoveElement(/datum/element/forced_gravity, 0)
//body bluids
/datum/reagent/consumable/semen
@@ -2334,6 +2408,7 @@ datum/reagent/eldritch
color = "#E6E6DA"
taste_mult = 0
+
/datum/reagent/hairball
name = "Hairball"
description = "A bundle of keratinous bits and fibers, not easily digestible."
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 8dca028b4a..07934d9880 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -64,6 +64,7 @@
toxpwr = 3
pH = 4
value = REAGENT_VALUE_RARE //sheets are worth more
+ material = /datum/material/plasma
/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C)
if(holder.has_reagent(/datum/reagent/medicine/epinephrine))
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index bb9a951cac..9e0c78d2e6 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -219,6 +219,12 @@
results = list(/datum/reagent/medicine/strange_reagent = 3)
required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+/datum/chemical_reaction/strange_reagent/alt
+ name = "Strange Reagent"
+ id = /datum/reagent/medicine/strange_reagent
+ results = list(/datum/reagent/medicine/strange_reagent = 2)
+ required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+
/datum/chemical_reaction/mannitol
name = "Mannitol"
id = /datum/reagent/medicine/mannitol
@@ -345,4 +351,20 @@
/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
- new /obj/item/stack/medical/mesh/advanced(location)
\ No newline at end of file
+ new /obj/item/stack/medical/mesh/advanced(location)
+
+/datum/chemical_reaction/suture
+ required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/styptic_powder = 2)
+
+/datum/chemical_reaction/suture/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/stack/medical/suture/(location)
+
+/datum/chemical_reaction/mesh
+ required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/silver_sulfadiazine = 2)
+
+/datum/chemical_reaction/mesh/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/stack/medical/mesh/(location)
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 09b7eabbc1..92861a94ed 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -1,3 +1,34 @@
+/datum/chemical_reaction/metalgen
+ name = "metalgen"
+ id = /datum/reagent/metalgen
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/metalgen_imprint
+ name = "metalgen imprint"
+ id = /datum/reagent/metalgen
+ required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1)
+ results = list(/datum/reagent/metalgen = 1)
+
+/datum/chemical_reaction/holywater
+ name = "Holy Water"
+ id = /datum/reagent/water/holywater
+ results = list(/datum/reagent/water/holywater = 1)
+ required_reagents = list(/datum/reagent/water/hollowwater = 1)
+ required_catalysts = list(/datum/reagent/water/holywater = 1)
+
+/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume)
+ var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen)
+ for(var/datum/reagent/R in holder.reagent_list)
+ if(R.material && R.volume >= 40)
+ MM.data["material"] = R.material
+ holder.remove_reagent(R.type, 40)
+
+/datum/chemical_reaction/gravitum
+ name = "gravitum"
+ id = /datum/reagent/gravitum
+ required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10)
+ results = list(/datum/reagent/gravitum = 10)
/datum/chemical_reaction/sterilizine
name = "Sterilizine"
@@ -711,7 +742,7 @@
/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/slime_extract/grey(location)
-
+
// Liquid Carpets
/datum/chemical_reaction/carpet
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 9b25a80680..926ed27854 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -19,6 +19,10 @@
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
var/spray_delay = 3 //The amount of sleep() delay between each chempuff step.
+ /// Last world.time of spray
+ var/last_spray = 0
+ /// Spray cooldown
+ var/spray_cooldown = CLICK_CD_MELEE
var/can_fill_from_container = TRUE
amount_per_transfer_from_this = 5
volume = 250
@@ -27,8 +31,6 @@
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
. = ..()
- if(!user.CheckActionCooldown(CLICK_CD_MELEE))
- return
if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
@@ -49,7 +51,8 @@
to_chat(user, "[src] is empty!")
return
- spray(A)
+ if(!spray(A))
+ return
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.last_action = world.time
@@ -64,10 +67,10 @@
if(reagents.has_reagent(/datum/reagent/lube))
message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [ADMIN_VERBOSEJMP(T)].")
log_game("[key_name(user)] fired Space lube from \a [src] at [AREACOORD(T)].")
- return
-
/obj/item/reagent_containers/spray/proc/spray(atom/A)
+ if((last_spray + spray_cooldown) > world.time)
+ return
var/range = clamp(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE)
@@ -79,10 +82,11 @@
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list)
var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2)
- do_spray(A, wait_step, D, range, puff_reagent_left)
+ last_spray = world.time
+ INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left)
+ return TRUE
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
- set waitfor = FALSE
var/range_left = range
for(var/i=0, i[user.name] [anchored ? "fasten" : "unfasten"] [src]", \
+ "You [anchored ? "fasten" : "unfasten"] [src]")
+ var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing)
+ if(anchored)
+ CP.enable()
+ else
+ CP.disable()
+
+/obj/structure/reagent_dispensers/plumbed/ComponentInitialize()
+ AddComponent(/datum/component/plumbing/simple_supply)
+
+/obj/structure/reagent_dispensers/plumbed/storage
+ name = "stationairy storage tank"
+ icon_state = "tank_stationairy"
+ reagent_id = null //start empty
+
+/obj/structure/reagent_dispensers/plumbed/storage/ComponentInitialize()
+ AddComponent(/datum/component/plumbing/tank)
+
//////////////
//Fuel Tanks//
//////////////
@@ -271,5 +304,3 @@
icon_state = "bluekeg"
reagent_id = /datum/reagent/consumable/ethanol/neurotoxin
tank_volume = 100 //2.5x less than the other kegs because it's harder to get
-
-
diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
index 329fb7bf6e..84a3ed10d5 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
@@ -105,3 +105,11 @@
build_path = /obj/item/circuitboard/machine/bloodbankgen
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
category = list ("Medical Machinery")
+
+/datum/design/board/medipen_refiller
+ name = "Machine Design (Medipen Refiller)"
+ desc = "The circuit board for a Medipen Refiller."
+ id = "medipen_refiller"
+ build_path = /obj/item/circuitboard/machine/medipen_refiller
+ category = list ("Medical Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm
index 5cbff1c66a..af4f650793 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_service.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm
@@ -81,6 +81,14 @@
category = list ("Hydroponics Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/board/hydroponics/auto
+ name = "Machine Design (Automatic Hydroponics Tray Board)"
+ desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN."
+ id = "autohydrotray"
+ build_path = /obj/machinery/hydroponics/constructable/automagic
+ category = list ("Hydroponics Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/board/monkey_recycler
name = "Machine Design (Monkey Recycler Board)"
desc = "The circuit board for a monkey recycler."
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index e1e55f3476..0a9fce2e67 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -961,3 +961,158 @@
build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+
+/datum/design/acclimator
+ name = "Plumbing Acclimator"
+ desc = "A heating and cooling device for pipes!"
+ id = "acclimator"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/acclimator
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/disposer
+ name = "Plumbing Disposer"
+ desc = "Using the power of Science, dissolves reagents into nothing (almost)."
+ id = "disposer"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 100)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/disposer
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_filter
+ name = "Plumbing Filter"
+ desc = "Filters out chemicals by their NTDB ID."
+ id = "plumb_filter"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/filter
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_synth
+ name = "Plumbing Synthesizer"
+ desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe."
+ id = "plumb_synth"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/plastic = 1000)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/synthesizer
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_grinder
+ name = "Plumbing-Linked Autogrinder"
+ desc = "Automatically extracts reagents from an item by grinding it. Think of the possibilities! Note: does not grind people."
+ id = "plumb_grinder"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/grinder_chemical
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/reaction_chamber
+ name = "Plumbing Reaction Chamber"
+ desc = "You can set a list of allowed reagents and amounts. Once the chamber has these reagents, will let the products through."
+ id = "reaction_chamber"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/reaction_chamber
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/duct_print
+ name = "Plumbing Ducts"
+ desc = "Ducts for plumbing! Now lathed for efficiency."
+ id = "duct_print"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/plastic = 400)
+ construction_time = 1
+ build_path = /obj/item/stack/ducts
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_splitter
+ name = "Plumbing Chemical Splitter"
+ desc = "A splitter. Has 2 outputs. Can be configured to allow a certain amount through each side."
+ id = "plumb_splitter"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 750, /datum/material/glass = 250)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/splitter
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/pill_press
+ name = "Plumbing Automatic Pill Former"
+ desc = "Automatically forms pills to the required parameters with piped reagents! A good replacement for those lazy, useless chemists."
+ id = "pill_press"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/pill_press
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_pump
+ name = "Liquid Extraction Pump"
+ desc = "Use it for extracting liquids from lavaland's geysers!"
+ id = "plumb_pump"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/liquid_pump
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_in
+ name = "Plumbing Input Device"
+ desc = "A big piped funnel for putting stuff in the pipe network."
+ id = "plumb_in"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 400, /datum/material/glass = 400)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/input
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_out
+ name = "Plumbing Output Device"
+ desc = "A big piped funnel for taking stuff out of the pipe network."
+ id = "plumb_out"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 400, /datum/material/glass = 400)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/output
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_tank
+ name = "Plumbed Storage Tank"
+ desc = "A tank for storing plumbed reagents."
+ id = "plumb_tank"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, /datum/material/plastic = 4000)
+ construction_time = 15
+ build_path = /obj/machinery/plumbing/tank
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/plumb_rcd
+ name = "Plumbed Autoconstruction Device"
+ desc = "A RCD for plumbing machines! Cannot make ducts."
+ id = "plumb_rcd"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 20000, /datum/material/titanium = 2000, /datum/material/diamond = 800, /datum/material/gold = 2000, /datum/material/silver = 2000)
+ construction_time = 150
+ build_path = /obj/item/construction/plumbing
+ category = list("Misc","Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
diff --git a/code/modules/research/nanites/extra_settings/text.dm b/code/modules/research/nanites/extra_settings/text.dm
index 56aa3dd07f..d3cad27bcf 100644
--- a/code/modules/research/nanites/extra_settings/text.dm
+++ b/code/modules/research/nanites/extra_settings/text.dm
@@ -10,6 +10,9 @@
/datum/nanite_extra_setting/text/get_copy()
return new /datum/nanite_extra_setting/text(value)
+/datum/nanite_extra_setting/text/get_value()
+ return html_encode(value)
+
/datum/nanite_extra_setting/text/get_frontend_list(name)
return list(list(
"name" = name,
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index 3b0d6d0d06..d2aa243fee 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -176,7 +176,7 @@
sent_message = message_setting.get_value()
if(host_mob.stat == DEAD)
return
- to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[sent_message]\"")
+ to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[html_encode(sent_message)]\"")
/datum/nanite_program/comm/hallucination
name = "Hallucination"
diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm
index 3a9e654b81..150e420c09 100644
--- a/code/modules/research/techweb/nodes/medical_nodes.dm
+++ b/code/modules/research/techweb/nodes/medical_nodes.dm
@@ -24,6 +24,23 @@
design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+/datum/techweb_node/plumbing
+ id = "plumbing"
+ display_name = "Reagent Plumbing Technology"
+ description = "Plastic tubes, and machinery used for manipulating things in them."
+ prereq_ids = list("base")
+ design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank", "medipen_refiller")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
+
+
+/datum/techweb_node/advplumbing
+ id = "advplumbing"
+ display_name = "Advanced Plumbing Technology"
+ description = "Plumbing RCD."
+ prereq_ids = list("plumbing", "adv_engi")
+ design_ids = list("plumb_rcd", "autohydrotray")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
//////////////////////Cybernetics/////////////////////
/datum/techweb_node/surplus_limbs
diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm
index 7d1fda6740..3fe4cad794 100644
--- a/code/modules/ruins/spaceruin_code/clericsden.dm
+++ b/code/modules/ruins/spaceruin_code/clericsden.dm
@@ -21,7 +21,6 @@
desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
icon_state = "proteon"
icon_living = "proteon"
- threat = 0.4
maxHealth = 35
health = 35
melee_damage_lower = 8
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
index f5a11db60f..b3d99f22ab 100644
--- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
@@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
. = ..()
internal_shuttle_creator = new()
internal_shuttle_creator.owner_rsd = src
+ desc += " Attention, the max size of the shuttle is [SHUTTLE_CREATOR_MAX_SIZE]."
overlay_holder = new()
/obj/item/shuttle_creator/Destroy()
@@ -237,13 +238,13 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
port.register()
- icon_state = "rsd_used"
+ icon_state = "rsd_empty"
//Clear highlights
overlay_holder.clear_highlights()
GLOB.custom_shuttle_count ++
- message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
- log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles)")
+ log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles)")
return TRUE
/obj/item/shuttle_creator/proc/create_shuttle_area(mob/user)
@@ -350,7 +351,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
loggedOldArea = get_area(get_turf(user))
loggedTurfs |= turfs
overlay_holder.highlight_area(turfs)
- //TODO READD THIS SHIT: icon_state = "rsd_used"
+ //TODO READD THIS SHIT: icon_state = "rsd_empty"
to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.")
return turfs
diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm
index 59826daf07..9d6d71a89f 100644
--- a/code/modules/spells/spell_types/taeclowndo.dm
+++ b/code/modules/spells/spell_types/taeclowndo.dm
@@ -42,6 +42,8 @@
return
. = ..()
+ if(!.)
+ return
new /obj/item/grown/bananapeel(target)
/obj/effect/proc_holder/spell/aimed/banana_peel/update_icon()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 3d88282937..e90f86bf1c 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -598,7 +598,7 @@
var/datum/species/S = H.dna.species
base_bp_icon = S?.icon_limbs || DEFAULT_BODYPART_ICON
- species_id = S.limbs_id
+ species_id = S.mutant_bodyparts["limbs_id"]
species_flags_list = H.dna.species.species_traits
//body marking memes
@@ -613,7 +613,6 @@
if(S.use_skintones)
skin_tone = H.skin_tone
- base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
skin_tone = ""
@@ -626,13 +625,9 @@
species_color = S.fixed_mut_color
else
species_color = H.dna.features["mcolor"]
- base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
species_color = ""
- if(base_bp_icon != DEFAULT_BODYPART_ICON)
- color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
-
if(S.mutant_bodyparts["legs"])
if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG)
if(DIGITIGRADE in S.species_traits)
@@ -652,11 +647,16 @@
body_markings = "plain"
aux_marking = "plain"
markings_color = list(colorlist)
-
else
body_markings = null
aux_marking = null
+ if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
+ base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
+
+ if(base_bp_icon != DEFAULT_BODYPART_ICON)
+ color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
+
if(!dropping_limb && H.dna.check_mutation(HULK))
mutation_color = "00aa00"
else
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 049fc5b5d4..9172ce00bc 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -265,6 +265,10 @@
var/C = input(owner, "Select Color", "Select color", "#ffffff") as color|null
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
return
+ var/list/hsv = ReadHSV(RGBtoHSV(C))
+ if(hsv[2] > 125)
+ to_chat(user, "A color that saturated? Surely not!")
+ return
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
if(!isnum(range))
return
@@ -396,4 +400,4 @@
#undef BLURRY_VISION_ONE
#undef BLURRY_VISION_TWO
-#undef BLIND_VISION_THREE
\ No newline at end of file
+#undef BLIND_VISION_THREE
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index a43e3fc2ce..58cb43996d 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -177,6 +177,7 @@
organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
item = /obj/item/storage/box/syndie_kit/guardian
cost = 15
+ limited_stock = 1 // you can only have one holopara apparently?
refundable = TRUE
cant_discount = TRUE
surplus = 0
diff --git a/code/modules/uplink/uplink_items/uplink_explosives.dm b/code/modules/uplink/uplink_items/uplink_explosives.dm
index 6cc1c9fe05..f44966fb3b 100644
--- a/code/modules/uplink/uplink_items/uplink_explosives.dm
+++ b/code/modules/uplink/uplink_items/uplink_explosives.dm
@@ -80,6 +80,7 @@
item = /obj/item/cartridge/virus/syndicate
cost = 5
restricted = TRUE
+ limited_stock = 1
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm
index dc4f4e9273..a78a4e6ef4 100644
--- a/code/modules/vending/kinkmate.dm
+++ b/code/modules/vending/kinkmate.dm
@@ -36,6 +36,7 @@
/obj/item/clothing/under/misc/keyholesweater = 2,
/obj/item/clothing/under/misc/stripper/mankini = 2,
/obj/item/clothing/under/costume/jabroni = 2,
+ /obj/item/clothing/gloves/evening/black = 2,
/obj/item/dildo/flared/huge = 3
)
premium = list(
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 34de3b490c..795d35adc4 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -46,7 +46,8 @@
/obj/item/wrench/medical = 1,
/obj/item/storage/belt/medolier/full = 2,
/obj/item/gun/syringe/dart = 2,
- /obj/item/storage/briefcase/medical = 2)
+ /obj/item/storage/briefcase/medical = 2,
+ /obj/item/plunger/reinforced = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
diff --git a/html/changelog.html b/html/changelog.html
index 43bac219ab..edaf74afca 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,203 @@
-->
+
28 August 2020
+
EmeraldSundisk updated:
+
+ - Adds more paper to the library
+ - The law office now has a desk window
+ - Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.
+ - Updates some of CogStation's paperwork
+ - The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.
+ - Adjusts some area designations so cameras should receive power properly
+ - Cleans up an errant decal
+
+
Hatterhat updated:
+
+ - Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.
+ - PDA bombs can now only be bought once per uplink.
+
+
lolman360 updated:
+
+ - atmos = radiation = chemistry.
+
+
shellspeed1 updated:
+
+ - Adds slow mode for iv drips
+
+
timothyteakettle updated:
+
+ - an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors
+ - customization features appear in alphabetical order where necessary
+ - bokken do two more stamina damage now
+ - you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)
+
+
+
27 August 2020
+
silicons updated:
+
+ - eyebeam lighting can only have 128 maximum HSV saturation now.
+ - no more shotgun stripper clips in boxes.
+ - goliath tentacles now do 20 damage to mechs at 25% ap
+
+
timothyteakettle updated:
+
+ - changing your character's gender won't randomize its hairstyle and facial hairstyle now
+
+
+
26 August 2020
+
ancientpower updated:
+
+ - Ghosts can read newscasters by clicking on them.
+
+
silicons updated:
+
+ - hierophant vortex blasts now have 50% armor penetration vs mecha
+ - ventcrawling now kicks off every attached/buckled mob, even for non humans.
+
+
+
25 August 2020
+
Hatterhat updated:
+
+ - Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
+
+
Literallynotpickles updated:
+
+ - You can now equip handheld crew monitors on all medical-related winter coats.
+
+
Putnam3145 updated:
+
+ - vore now ejects occupants on death
+
+
raspy-on-osu updated:
+
+ - Thermoelectric Generator power output
+
+
timothyteakettle updated:
+
+ - I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
+
+
+
24 August 2020
+
MrJWhit updated:
+
+ - Fixes areas on expanded airlocks
+
+
silicons updated:
+
+ - wormhole jaunters work
+ - wormhole jaunters no longer get interference from bags of holding
+ - airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
+
+
timothyteakettle updated:
+
+ - three new items are in the loadout for all donators
+
+
zeroisthebiggay updated:
+
+ - contraband black evening gloves in kinkvend
+
+
+
23 August 2020
+
DeltaFire15 updated:
+
+ - silicons and clockies can now access APCs properly
+
+
EmeraldSundisk updated:
+
+ - Medbay now has a smartfridge for organ storage
+ - Slight enhancements to the station's electrical wiring layout
+ - Very small library renovation
+ - Exterior airlocks have been given proper air systems for safety's sake
+
+
Ghommie updated:
+
+ - Stops shielded hardsuits from slowly turning the wearer into a big glowing ball of stacked energy shield overlays.
+ - the shielding overlay is merely visual as result. Aim your clicks.
+
+
Ludox235 updated:
+
+ - no more 10 pop xenos (25pop now)
+
+
MrJWhit updated:
+
+ - Increases the majority of airlocks by 1 tile.
+ - Minor adjustments to the TEG engine.
+
+
Putnam3145 updated:
+
+ - Simplemobs no longer count in dynamic.
+ - "Story" storyteller no longer starts at a ludicrously low threat, always.
+ - Blob threat now scales with coverage.
+ - One person with their pref on no longer overpowers 40 people who might not even know there is one.
+ - Negative-weight rulesets are no longer put into the list.
+
+
kiwedespars updated:
+
+ - removed durathread from armwraps recipe.
+
+
lolman360 updated:
+
+ - breath mask balaclava
+
+
timothyteakettle updated:
+
+ - lizards are now a recommended species for mam snouts
+
+
zeroisthebiggay updated:
+
+ - new sprites for the temporal katana
+ - suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
+ - twilight isnt earrape
+
+
+
22 August 2020
+
Time-Green (copypasta'd by lolman360) updated:
+
+ - plumbing
+ - automatic hydro trays
+
+
+
21 August 2020
+
LetterN updated:
+
+ - Updates and adds some of the tips
+
+
Putnam3145 updated:
+
+ - added reftracking as a compile flag
+
+
SmArtKar updated:
+
+ - RSD limitation is now 500 tiles
+ - Fixed broken RSD sprites
+ - Removed that shuttle limit
+
+
timothyteakettle updated:
+
+ - two snouts can once again be chosen in customization
+ - lizard snouts work again
+
+
+
20 August 2020
+
DeltaFire15 updated:
+
+ - The cooking oil damage formula is no longer scuffed.
+ - Changed the clockie help-link to lead to our own wiki.
+
+
Fikou updated:
+
+ - admins can now do html in ahelps properly
+
+
Hatterhat updated:
+
+ - Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
+
+
tiramisuapimancer updated:
+
+ - Ethereal hair is now their body color instead of accidentally white
+
+
18 August 2020
DeltaFire15 updated:
@@ -1280,160 +1477,6 @@
- support for custom blood colours implemented, slimes blood colour now equivalent to their body colour
-
- 27 June 2020
- Detective-Google updated:
-
- timothyteakettle updated:
-
- - felinids now nya when tabled
-
-
- 26 June 2020
- Ghommie updated:
-
- - Snore spam.
- - Hostile mobs shouldn't hit their original spawner structures or thoses of the same faction.
-
- silicons updated:
-
- - soap cleans blood again
-
-
- 25 June 2020
- Anonymous updated:
-
- - Added kepi and orvilike kepi. Available through loadout.
-
- Detective Google updated:
-
- Detective-Google updated:
-
- - malf AIs can no longer yeet the station while shunted
- - SMESes can now properly use self charging cells
- - ghosts now show up when the round ends
- - away missions
-
- Funce updated:
-
- - Mentor SQL queries are now deleted properly.
-
- Linzolle updated:
-
- - analyze function on chem master is no longer broken
- - organs now decay inside dead bodies again
-
- dapnee updated:
-
- - wataur bottle item
- - wataur bottle and overlay
-
-
- 24 June 2020
- DeltaFire15 updated:
-
- - Choosing a random item in your uplink will no longer sometimes reroll your contract.
- - Syndicate crate event cannot fire as a random event anymore.
-
- Detective-Google updated:
-
- - singulos no longer succ infinite rods out of the ice
- - one of the directions for the diag hudpatch was blu instead of orang
-
- timothyteakettle updated:
-
- - bonfires/grills no longer produce infinite quantities of food
- - slime's alter form ability now updates their hair colour when changing their body colour
-
-
- 22 June 2020
- Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:
-
- - Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
- - Added single-order options for several existing products in the Cargo Catalog.
- - Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
- - You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
- - Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
- - Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
-
- kevinz000 updated:
-
- - Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
-
- shellspeed1 updated:
-
-
- 21 June 2020
- kevinz000 updated:
-
- - calculations for punch hit chance has been drastically buffed in favor of the attacker.
-
-
- 20 June 2020
- LetterN updated:
-
- - Asset cache from tg
- - Made the map viewer not look bad
- - Admin matrix right-bracket
-
- bunny232 updated:
-
- - Removed unsavory things from the vent clog event
-
-
- 19 June 2020
- Bhijn updated:
-
- - Atmos can no longer become completely bricked
-
- Funce updated:
-
- - Square root circuit should now actually work.
-
- SmArtKar updated:
-
- TheSpaghetti updated:
-
- - more insectoid insects
-
- kevinz000 updated:
-
- - bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
-
- timothyteakettle updated:
-
- - Adds the brain trauma event, where one player gets a random brain trauma!
- - Adds the wisdom cow event, where the wisdom cow appears on the station!
- - Adds the fake virus event, where people get fake virus symptoms.
- - Adds the stray cargo pod event, where a cargo pod crashes into the station.
- - Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
-
-
- 18 June 2020
- Detective-Google updated:
-
- - cog is now less the suck
- - couple little derpy bits
- - malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
-
- SmArtKar updated:
-
- - Ported shuttles from beestation
-
- timothyteakettle updated:
-
- - embeds got reworked, sticky tape was added, more bullets that ricochet also added
- - medbots can now be tipped over
- - added more medbot sounds
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index f8749c8dc5..139ca99af0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26998,3 +26998,132 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- refactor: snowflake code for mutant bodypart selection has been rewritten to be
~14x shorter
- tweak: meat type and horns can now be selected by any species
+2020-08-20:
+ DeltaFire15:
+ - bugfix: The cooking oil damage formula is no longer scuffed.
+ - tweak: Changed the clockie help-link to lead to our own wiki.
+ Fikou:
+ - admin: admins can now do html in ahelps properly
+ Hatterhat:
+ - balance: Pirate threats are now announced as "business propositions", and their
+ arrivals are now also announced properly.
+ tiramisuapimancer:
+ - bugfix: Ethereal hair is now their body color instead of accidentally white
+2020-08-21:
+ LetterN:
+ - rscadd: Updates and adds some of the tips
+ Putnam3145:
+ - admin: added reftracking as a compile flag
+ SmArtKar:
+ - tweak: RSD limitation is now 500 tiles
+ - bugfix: Fixed broken RSD sprites
+ - config: Removed that shuttle limit
+ timothyteakettle:
+ - bugfix: two snouts can once again be chosen in customization
+ - bugfix: lizard snouts work again
+2020-08-22:
+ Time-Green (copypasta'd by lolman360):
+ - rscadd: plumbing
+ - rscadd: automatic hydro trays
+2020-08-23:
+ DeltaFire15:
+ - bugfix: silicons and clockies can now access APCs properly
+ EmeraldSundisk:
+ - rscadd: Medbay now has a smartfridge for organ storage
+ - rscadd: Slight enhancements to the station's electrical wiring layout
+ - rscadd: Very small library renovation
+ - bugfix: Exterior airlocks have been given proper air systems for safety's sake
+ Ghommie:
+ - bugfix: Stops shielded hardsuits from slowly turning the wearer into a big glowing
+ ball of stacked energy shield overlays.
+ - tweak: the shielding overlay is merely visual as result. Aim your clicks.
+ Ludox235:
+ - tweak: no more 10 pop xenos (25pop now)
+ MrJWhit:
+ - tweak: Increases the majority of airlocks by 1 tile.
+ - tweak: Minor adjustments to the TEG engine.
+ Putnam3145:
+ - balance: Simplemobs no longer count in dynamic.
+ - balance: '"Story" storyteller no longer starts at a ludicrously low threat, always.'
+ - balance: Blob threat now scales with coverage.
+ - tweak: One person with their pref on no longer overpowers 40 people who might
+ not even know there is one.
+ - bugfix: Negative-weight rulesets are no longer put into the list.
+ kiwedespars:
+ - tweak: removed durathread from armwraps recipe.
+ lolman360:
+ - rscadd: breath mask balaclava
+ timothyteakettle:
+ - bugfix: lizards are now a recommended species for mam snouts
+ zeroisthebiggay:
+ - rscadd: new sprites for the temporal katana
+ - rscadd: suiciding with the temporal katana omae wa mou shinderius you into the
+ shadow realm
+ - soundadd: twilight isnt earrape
+2020-08-24:
+ MrJWhit:
+ - bugfix: Fixes areas on expanded airlocks
+ silicons:
+ - bugfix: wormhole jaunters work
+ - tweak: wormhole jaunters no longer get interference from bags of holding
+ - bugfix: airlocks now only shock on pulse/wirecutters instead of on tgui panel
+ open.
+ timothyteakettle:
+ - rscadd: three new items are in the loadout for all donators
+ zeroisthebiggay:
+ - rscadd: contraband black evening gloves in kinkvend
+2020-08-25:
+ Hatterhat:
+ - rscadd: Insidious combat gloves have been replaced by insidious guerilla gloves.
+ They're generally the same, except now you can tackle with them.
+ Literallynotpickles:
+ - tweak: You can now equip handheld crew monitors on all medical-related winter
+ coats.
+ Putnam3145:
+ - tweak: vore now ejects occupants on death
+ raspy-on-osu:
+ - tweak: Thermoelectric Generator power output
+ timothyteakettle:
+ - tweak: I.P.Cs now short their circuits when expressing emotion, causing sparks
+ to appear around them.
+2020-08-26:
+ ancientpower:
+ - tweak: Ghosts can read newscasters by clicking on them.
+ silicons:
+ - balance: hierophant vortex blasts now have 50% armor penetration vs mecha
+ - balance: ventcrawling now kicks off every attached/buckled mob, even for non humans.
+2020-08-27:
+ silicons:
+ - tweak: eyebeam lighting can only have 128 maximum HSV saturation now.
+ - balance: no more shotgun stripper clips in boxes.
+ - balance: goliath tentacles now do 20 damage to mechs at 25% ap
+ timothyteakettle:
+ - tweak: changing your character's gender won't randomize its hairstyle and facial
+ hairstyle now
+2020-08-28:
+ EmeraldSundisk:
+ - rscadd: Adds more paper to the library
+ - rscadd: The law office now has a desk window
+ - tweak: Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding
+ areas to accommodate this.
+ - tweak: Updates some of CogStation's paperwork
+ - tweak: The rat in the morgue turned themselves into a possum. Funniest shit I've
+ ever seen.
+ - bugfix: Adjusts some area designations so cameras should receive power properly
+ - bugfix: Cleans up an errant decal
+ Hatterhat:
+ - tweak: Traitor holoparasites can now only be bought once, because apparently you
+ can only have one active holopara.
+ - balance: PDA bombs can now only be bought once per uplink.
+ lolman360:
+ - rscadd: atmos = radiation = chemistry.
+ shellspeed1:
+ - rscadd: Adds slow mode for iv drips
+ timothyteakettle:
+ - rscadd: an ancient game over a thousand years old has re-emerged among crewmembers
+ - rock paper scissors
+ - tweak: customization features appear in alphabetical order where necessary
+ - tweak: bokken do two more stamina damage now
+ - rscadd: you can now choose a body sprite as an anthromorph or anthromorphic insect,
+ and can choose from aquatic/avian and apid respectively (and obviously back
+ to the defaults too)
diff --git a/html/changelogs/AutoChangeLog-pr-13194.yml b/html/changelogs/AutoChangeLog-pr-13194.yml
deleted file mode 100644
index 8769abd6d5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13194.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - tweak: "Changed the clockie help-link to lead to our own wiki."
diff --git a/html/changelogs/AutoChangeLog-pr-13202.yml b/html/changelogs/AutoChangeLog-pr-13202.yml
deleted file mode 100644
index 8713ea2bd9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13202.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "tiramisuapimancer"
-delete-after: True
-changes:
- - bugfix: "Ethereal hair is now their body color instead of accidentally white"
diff --git a/html/changelogs/AutoChangeLog-pr-13207.yml b/html/changelogs/AutoChangeLog-pr-13207.yml
deleted file mode 100644
index 9f354f34bb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13207.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fikou"
-delete-after: True
-changes:
- - admin: "admins can now do html in ahelps properly"
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 9490595484..8594af8ec2 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 52ef75020c..4ac82ca299 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 916686e63f..60978d55a2 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 989ec8049c..794074bfe4 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index 0ca36ad43d..23d80af9ef 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 59d7bbce69..702c0299b5 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index ace37b1f17..4523403344 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 9c6df36f49..00670916db 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 57105cc089..c5aca2394f 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/lavaland/terrain.dmi b/icons/obj/lavaland/terrain.dmi
new file mode 100644
index 0000000000..4db51145ee
Binary files /dev/null and b/icons/obj/lavaland/terrain.dmi differ
diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi
new file mode 100644
index 0000000000..300d218d2d
Binary files /dev/null and b/icons/obj/machines/medipen_refiller.dmi differ
diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/plumbing/fluid_ducts.dmi
new file mode 100644
index 0000000000..87d9d2233b
Binary files /dev/null and b/icons/obj/plumbing/fluid_ducts.dmi differ
diff --git a/icons/obj/plumbing/plumbers.dmi b/icons/obj/plumbing/plumbers.dmi
new file mode 100644
index 0000000000..242622e000
Binary files /dev/null and b/icons/obj/plumbing/plumbers.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index 4a299f29dd..2b64176878 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 378c70d187..06783df03d 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -7,6 +7,27 @@
category = LOADOUT_CATEGORY_DONATOR
ckeywhitelist = list("This entry should never appear with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard
+/datum/gear/donator/pet
+ name = "Pet Beacon"
+ slot = SLOT_IN_BACKPACK
+ path = /obj/item/choice_beacon/pet
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1 // can be accessed by all donators
+
+/datum/gear/donator/carpet
+ name = "Carpet Beacon"
+ slot = SLOT_IN_BACKPACK
+ path = /obj/item/choice_beacon/box/carpet
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1
+
+/datum/gear/donator/chameleon_bedsheet
+ name = "Chameleon Bedsheet"
+ slot = SLOT_NECK
+ path = /obj/item/bedsheet/chameleon
+ ckeywhitelist = list()
+ donator_group_id = DONATOR_GROUP_TIER_1
+
/datum/gear/donator/donortestingbikehorn
name = "Donor item testing bikehorn"
slot = SLOT_IN_BACKPACK
diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm
index ffa4724f63..09694ddec7 100644
--- a/modular_citadel/code/modules/client/loadout/gloves.dm
+++ b/modular_citadel/code/modules/client/loadout/gloves.dm
@@ -9,6 +9,10 @@
/datum/gear/gloves/evening
name = "Evening gloves"
path = /obj/item/clothing/gloves/evening
+
+/datum/gear/gloves/midnight
+ name = "Midnight gloves"
+ path = /obj/item/clothing/gloves/evening/black
/datum/gear/gloves/goldring
name = "A gold ring"
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
index 20917c4ba5..4829fd921c 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm
@@ -16,13 +16,12 @@
spread = 20
actions_types = list()
-/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_overlays()
+ . = ..()
if(magazine)
- cut_overlays()
- add_overlay("foamsp-magazine")
- else
- cut_overlays()
+ . += "foamsp-magazine"
+
+/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/////////RAYGUN MEMES/////////
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
index 8a1310d2f1..c2bf251de9 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -155,11 +155,15 @@
casing_ejector = 0
spread = 10
recoil = 0.05
+ automatic_burst_overlay = FALSE
+ var/magtype = "flechettegun"
-/obj/item/gun/ballistic/automatic/flechette/update_icon()
- cut_overlays()
+/obj/item/gun/ballistic/automatic/flechette/update_overlays()
+ . = ..()
if(magazine)
- add_overlay("flechettegun-magazine")
+ . += "[magtype]-magazine"
+
+/obj/item/gun/ballistic/automatic/flechette/update_icon_state()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///unique variant///
@@ -185,12 +189,7 @@
w_class = WEIGHT_CLASS_SMALL
spread = 15
recoil = 0.1
-
-/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
- cut_overlays()
- if(magazine)
- add_overlay("shreddergun-magazine")
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+ magtype = "shreddergun"
/*/////////////////////////////////////////////////////////////
//////////////////////// Zero's Meme //////////////////////////
@@ -218,17 +217,19 @@
burst_size = 4 //Shh.
fire_delay = 1
var/body_color = "#3333aa"
+ automatic_burst_overlay = FALSE
-/obj/item/gun/ballistic/automatic/AM4B/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/AM4B/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+/obj/item/gun/ballistic/automatic/AM4B/update_overlays()
+ . = ..()
var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "AM4-Body")
if(body_color)
body_overlay.color = body_color
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
- add_overlay(body_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
+ . += body_overlay
+
/obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user)
. = ..()
if(!in_range(src, user)) //Basic checks to prevent abuse
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
index 3c0a47bfd7..c4cf8fc00f 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm
@@ -55,8 +55,7 @@
/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user)
return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor
-/obj/item/gun/ballistic/automatic/spinfusor/update_icon()
- ..()
+/obj/item/gun/ballistic/automatic/spinfusor/update_icon_state()
icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]"
/obj/item/ammo_box/aspinfusor
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index 49d48e0000..65609f5830 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -14,16 +14,16 @@ obj/item/gun/energy/e_gun/cx
flight_y_offset = 10
var/body_color = "#252528"
-obj/item/gun/energy/e_gun/cx/update_icon()
- ..()
+obj/item/gun/energy/e_gun/cx/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+obj/item/gun/energy/e_gun/cx/update_overlays()
+ . = ..()
var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "cxegun_body")
if(body_color)
body_overlay.color = body_color
- add_overlay(body_overlay)
-
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
+ . += body_overlay
obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
. = ..()
diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
index b864a9fe25..e81c7c18d3 100644
--- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
@@ -52,13 +52,13 @@
if(has_shot)
recharge_newshot(TRUE)
-/obj/item/gun/energy/pumpaction/update_icon() //adds racked indicators
+/obj/item/gun/energy/pumpaction/update_overlays() //adds racked indicators
..()
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
if(chambered)
- add_overlay("[icon_state]_rack_[shot.select_name]")
+ . += "[icon_state]_rack_[shot.select_name]"
else
- add_overlay("[icon_state]_rack_empty")
+ . += "[icon_state]_rack_empty"
/obj/item/gun/energy/pumpaction/proc/pump(mob/M) //pumping proc. Checks if the gun is empty and plays a different sound if it is.
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
diff --git a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi b/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi
deleted file mode 100644
index c8d5ceb0a6..0000000000
Binary files a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
deleted file mode 100644
index 6098dd3567..0000000000
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and /dev/null differ
diff --git a/sound/music/twilight.ogg b/sound/music/twilight.ogg
index 74b811b3e5..635663314d 100644
Binary files a/sound/music/twilight.ogg and b/sound/music/twilight.ogg differ
diff --git a/strings/tips.txt b/strings/tips.txt
index a1d2befab3..5dc4e1b985 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -25,7 +25,7 @@ As the Captain, you have absolute access and control over the station, but this
As the Captain, you have a fancy pen that can be used as a holdout dagger or even as a scalpel in surgery!
As the Captain, you can purchase a new emergency shuttle using a communications console. Some require credits, while others give you credits in exchange. Keep in mind that purchasing dangerous shuttles will incur the ire of your crew.
As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with specially-made high-capacity hypovials that hold double the reagents the standard ones do.
-As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and geneticists during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting.
+As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting.
As a Medical Doctor, pester Research for improved surgical tools. They work faster, combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery), and don't cost many materials to boot!
As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can slice and dice, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version producible with Research's aid, and it has the highest force of most common place weapons, while still remaining sharp.
As a Medical Doctor, your belt can hold a full set of surgical tools. Using sterilizine before each attempt during surgery will reduce your failure chance on tricky steps or when using less-than-optimal equipment.
@@ -34,11 +34,14 @@ As a Medical Doctor, while both heal toxin damage, the difference between charco
As a Medical Doctor, you can surgically implant or extract things from people's chests by performing a cavity implant. This could range from inserting a suicide bomb to embedding the nuke disk into the Captain's chest.
As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation to their chest and remove the rapidly developing alien embryo before it bursts out and immediately kills your patient.
As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step.
-As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and aren't usually revivable or cloneable. However it may prove useful to be creative in your revivification techniques with these bodies.
+As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to be creative in your revivification techniques with these bodies.
As a Medical Doctor, treating plasmamen is not impossible! Salbutamol and epinephrine stops them from suffocating due to lack of internals and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower.
As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them.
As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step.
As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors!
+As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment.
+As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible!
+As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds regeneration! Perfect for drained patients!
As a Medical Doctor, medical gauze is an incredibly underrated tool. It can be used to entirely halt a limb from bleeding or sling one that's been shattered until it can be given proper attention. This even works on the dead, too! Be sure to stop someone's bleeding whether they're in critical condition or a corpse, as dragging someone whom is bleeding will rapidly deplete them of all their blood.
As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. See which chemicals have the best synergy, both in healing, and in harming. Experiment!
As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater.
@@ -135,10 +138,10 @@ As a Security Officer, examining someone while wearing your security HUDglasses
As a Security Officer, you can take out the power cell on your baton to replace it with a better or fully charged one. Just use a screwdriver on your baton to remove the old cell.
As a Security Officer, you can just about any firearm on your vest, this even works with other non-standard armor-substitutes like security winter coats!
As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department.
-As the Detective, you can use your forensics scanner from a distance.
+As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers.
As the Detective, your revolver can be loaded with .357 ammunition. Use a screwdriver to permanently modify your revolver into using this type of ammunition, be warned however, firing it has a decent chance to cause the revolver to misfire and shoot you in the foot.
As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime.
-As the Lawyer, you can try to convince the captain and Head of Security to hold trials for prisoners in the courtroom.
+As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom.
As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain.
As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out and your comparative vulnerability.
As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer.
@@ -187,7 +190,7 @@ As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to min
As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage.
As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die.
As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them!
-As a Traitor, the cryptographic sequencer (emag) can not only open doors, but also lockers, crates, APCs and more. It can hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you may just be able to create some difficult to obtain substances, or contact your employers to request special objectives! Experiment!
+As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment!
As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you!
As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully.
As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool if you manage to nab an autolathe for yourself.
@@ -235,6 +238,7 @@ As a Changeling, absorbing someone will give you their full memory. This can inc
As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits.
As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you.
As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
+As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person.
As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win.
As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face.
As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, stamina damage to Ratvarian scum, and some damage to fellow cultists of Nar-Sie nearby, but will create a fire where the rune stands on use.
@@ -281,12 +285,17 @@ As a Devil, you gain power for every three souls you control, however you also b
As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed.
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other.
-When hacking doors, cutting and mending the "test light wire" will restore power to the door.
-When hacking, remote singulars pulse when attached to a wire and pinged. This can allow you to hack things or set traps from far away.
+When hacking doors, cutting and mending a "test light wire" will restore power to the door.
When crafting most items, you can either manually combine parts or use the crafting menu.
Suit storage units not only remove blood and dirt from clothing, but also radiation!
-Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine.
Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes.
+You can light a cigar on a supermatter crystal.
+Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth!
+In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity?
+Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles!
+Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time!
+Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter.
+Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine.
Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses.
Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting.
Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
diff --git a/strings/traumas.json b/strings/traumas.json
index 58170bd55a..f8fed95c98 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -131,7 +131,8 @@
"@pick(semicolon)*weh",
"@pick(semicolon)My balls finally feel full, again.",
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
- ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP"
+ ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
+ "@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!"
],
"mutations": [
@@ -199,7 +200,7 @@
"abdoocters",
"revinent"
],
-
+
"bug": [
"",
"IS TIS A BUG??",
@@ -207,7 +208,7 @@
"BUG!!!",
"HUE, FEATURE!!"
],
-
+
"semicolon": [
"",
";",
@@ -271,7 +272,7 @@
"arrdee",
"sek"
],
-
+
"cargo": [
"GUNS",
"HATS",
@@ -279,7 +280,7 @@
"MEMES",
"GLOWY CYSTAL"
],
-
+
"s_roles": [
"ert",
"shadowlig",
diff --git a/tgstation.dme b/tgstation.dme
index 61a7eec79e..de6ee1a6bf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -81,6 +81,7 @@
#include "code\__DEFINES\networks.dm"
#include "code\__DEFINES\pinpointers.dm"
#include "code\__DEFINES\pipe_construction.dm"
+#include "code\__DEFINES\plumbing.dm"
#include "code\__DEFINES\pool.dm"
#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
@@ -95,6 +96,7 @@
#include "code\__DEFINES\reagents_specific_heat.dm"
#include "code\__DEFINES\research.dm"
#include "code\__DEFINES\robots.dm"
+#include "code\__DEFINES\rockpaperscissors.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"
@@ -301,6 +303,7 @@
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fail2topic.dm"
#include "code\controllers\subsystem\fire_burning.dm"
+#include "code\controllers\subsystem\fluid.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\holodeck.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
@@ -376,6 +379,7 @@
#include "code\datums\datumvars.dm"
#include "code\datums\dna.dm"
#include "code\datums\dog_fashion.dm"
+#include "code\datums\ductnet.dm"
#include "code\datums\emotes.dm"
#include "code\datums\ert.dm"
#include "code\datums\explosion.dm"
@@ -489,6 +493,11 @@
#include "code\datums\components\fantasy\affix.dm"
#include "code\datums\components\fantasy\prefixes.dm"
#include "code\datums\components\fantasy\suffixes.dm"
+#include "code\datums\components\plumbing\_plumbing.dm"
+#include "code\datums\components\plumbing\chemical_acclimator.dm"
+#include "code\datums\components\plumbing\filter.dm"
+#include "code\datums\components\plumbing\reaction_chamber.dm"
+#include "code\datums\components\plumbing\splitter.dm"
#include "code\datums\components\storage\storage.dm"
#include "code\datums\components\storage\ui.dm"
#include "code\datums\components\storage\concrete\_concrete.dm"
@@ -1282,6 +1291,7 @@
#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
#include "code\game\objects\structures\icemoon\cave_entrance.dm"
+#include "code\game\objects\structures\lavaland\geyser.dm"
#include "code\game\objects\structures\lavaland\necropolis_tendril.dm"
#include "code\game\objects\structures\signs\_signs.dm"
#include "code\game\objects\structures\signs\signs_departments.dm"
@@ -1394,6 +1404,7 @@
#include "code\modules\admin\view_variables\mark_datum.dm"
#include "code\modules\admin\view_variables\mass_edit_variables.dm"
#include "code\modules\admin\view_variables\modify_variables.dm"
+#include "code\modules\admin\view_variables\reference_tracking.dm"
#include "code\modules\admin\view_variables\topic.dm"
#include "code\modules\admin\view_variables\topic_basic.dm"
#include "code\modules\admin\view_variables\topic_list.dm"
@@ -2858,6 +2869,21 @@
#include "code\modules\photography\photos\album.dm"
#include "code\modules\photography\photos\frame.dm"
#include "code\modules\photography\photos\photo.dm"
+#include "code\modules\plumbing\ducts.dm"
+#include "code\modules\plumbing\plumbers\_plumb_machinery.dm"
+#include "code\modules\plumbing\plumbers\acclimator.dm"
+#include "code\modules\plumbing\plumbers\autohydro.dm"
+#include "code\modules\plumbing\plumbers\bottler.dm"
+#include "code\modules\plumbing\plumbers\destroyer.dm"
+#include "code\modules\plumbing\plumbers\fermenter.dm"
+#include "code\modules\plumbing\plumbers\filter.dm"
+#include "code\modules\plumbing\plumbers\grinder_chemical.dm"
+#include "code\modules\plumbing\plumbers\medipenrefill.dm"
+#include "code\modules\plumbing\plumbers\pill_press.dm"
+#include "code\modules\plumbing\plumbers\pumps.dm"
+#include "code\modules\plumbing\plumbers\reaction_chamber.dm"
+#include "code\modules\plumbing\plumbers\splitters.dm"
+#include "code\modules\plumbing\plumbers\synthesizer.dm"
#include "code\modules\pool\pool_controller.dm"
#include "code\modules\pool\pool_drain.dm"
#include "code\modules\pool\pool_effects.dm"