diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm
index 044f69fd1d..479610b0b7 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm
@@ -35,10 +35,6 @@
/obj/effect/decal/cleanable/cobweb/cobweb2,
/turf/open/floor/plasteel/cult,
/area/ruin/unpowered/buried_library)
-"aj" = (
-/obj/structure/bookcase/random,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/buried_library)
"ak" = (
/turf/closed/mineral/random/snow/no_caves,
/area/ruin/unpowered/buried_library)
@@ -100,10 +96,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/ruin/unpowered/buried_library)
-"aB" = (
-/obj/structure/girder,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/buried_library)
"aC" = (
/obj/item/feather,
/turf/closed/mineral/random/snow/no_caves,
@@ -674,7 +666,7 @@ ah
ak
ah
bh
-aj
+ah
az
ah
ak
@@ -695,7 +687,7 @@ ai
ar
al
bc
-aj
+ah
aL
ah
aA
@@ -777,7 +769,7 @@ ac
ba
ac
ac
-aB
+br
ad
aa
ad
diff --git a/_maps/icebox.json b/_maps/icebox.json
index 3af7d64a08..89777d0a6b 100644
--- a/_maps/icebox.json
+++ b/_maps/icebox.json
@@ -18,7 +18,8 @@
"traits":[
{
"Up":1,
- "Mining":true,
+ "Mining":true,
+ "Station":false,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
@@ -27,7 +28,8 @@
{
"Down":-1,
"Up":1,
- "Mining":true,
+ "Mining":true,
+ "Station":false,
"Linkage":null,
"Gravity":true,
"Ice Ruins Underground":true,
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 60e4d767cc..75efefd8e1 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -3098,7 +3098,9 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"agd" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"age" = (
@@ -6473,16 +6475,6 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
-"alX" = (
-/obj/machinery/button/door{
- id = "atmos";
- name = "Atmospherics Lockdown";
- pixel_x = 24;
- pixel_y = 4;
- req_access_txt = "24"
- },
-/turf/open/floor/plasteel,
-/area/engine/atmos)
"alY" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -39435,7 +39427,10 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPe" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Ports"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPf" = (
@@ -39453,10 +39448,10 @@
/area/engine/atmos)
"bPh" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engine/atmos)
"bPi" = (
@@ -40719,7 +40714,9 @@
/area/engine/atmos)
"bSM" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/general/visible,
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"bSP" = (
@@ -41475,13 +41472,16 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUN" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bUO" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Ports to External"
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -41912,8 +41912,9 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bVZ" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Ports to External"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -46658,8 +46659,8 @@
/turf/closed/wall/r_wall,
/area/engine/atmos)
"ciu" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plating,
/area/engine/atmos)
"civ" = (
@@ -53524,8 +53525,9 @@
/turf/open/floor/plasteel,
/area/security/brig)
"daq" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"daI" = (
@@ -53947,9 +53949,7 @@
/turf/open/floor/plating,
/area/security/prison)
"eqq" = (
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"eqA" = (
@@ -55364,7 +55364,7 @@
"ivJ" = (
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
/turf/open/floor/plating,
@@ -55417,7 +55417,7 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plating,
/area/engine/atmos)
"iLJ" = (
@@ -55708,11 +55708,7 @@
/turf/closed/wall/r_wall,
/area/engine/gravity_generator)
"jBQ" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "Pure to Ports"
- },
-/obj/machinery/atmospherics/pipe/simple/general/visible,
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"jCq" = (
@@ -56728,6 +56724,10 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"moS" = (
+/obj/machinery/atmospherics/pipe/manifold4w/yellow/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"mps" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -57773,7 +57773,9 @@
/area/crew_quarters/fitness)
"pCj" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 5
+ },
/turf/open/floor/plating,
/area/engine/atmos)
"pDe" = (
@@ -57915,10 +57917,11 @@
/turf/open/floor/plasteel,
/area/security/processing)
"pUP" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 5
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"qaY" = (
/obj/structure/table/reinforced,
@@ -58469,6 +58472,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/fore)
+"rTo" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "External to Pumps"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"rTu" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -60034,18 +60044,18 @@
/turf/open/floor/plasteel/white,
/area/science/circuit)
"vPQ" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 8;
- name = "External to Pumps"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 10
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/atmos)
"vQf" = (
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/cyan/visible,
-/obj/machinery/atmospherics/components/binary/pump/on{
+/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "Mix to External"
},
@@ -93433,7 +93443,7 @@ bQp
alk
gAu
eqq
-pUP
+bOd
bOd
bOd
bOd
@@ -93689,8 +93699,8 @@ bJF
bVX
bRA
bTP
+rTo
bOd
-vPQ
bOd
bOd
bOd
@@ -93947,7 +93957,7 @@ bMQ
bRC
rdl
daq
-bUN
+bUO
bOd
bOd
bOd
@@ -94204,7 +94214,7 @@ cBF
bRD
rdl
daq
-bUN
+bUO
bOd
bOd
bOd
@@ -94460,7 +94470,7 @@ bPc
bQs
cez
ceA
-bOd
+daq
bUO
bOd
bOd
@@ -94718,7 +94728,7 @@ bQv
bRF
bSM
bVZ
-bUN
+bOd
bOd
bOd
bOd
@@ -94973,7 +94983,7 @@ bOc
udT
omk
nTU
-bSM
+pUP
jBQ
agd
cCB
@@ -95487,8 +95497,8 @@ oVN
bPf
bQx
bRH
-bMQ
-bTU
+vPQ
+moS
kGv
bUS
cCE
@@ -96002,15 +96012,15 @@ ivJ
bQy
bRI
bSP
-bPh
+ivJ
jzM
bRI
cCF
-bPh
+ivJ
bQy
bRI
bQy
-bPh
+ivJ
bQy
bRI
bSP
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 2cb2cf3497..a18d3ab68e 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -716,8 +716,15 @@
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
/area/icemoon/surface/outdoors)
"abY" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
-/area/icemoon/surface/outdoors)
+/area/engine/engineering)
"aca" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -9185,7 +9192,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
dir = 1
},
-/turf/open/floor/plating/airless,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/science/xenobiology)
"asD" = (
/obj/structure/table/wood,
@@ -9395,7 +9402,7 @@
roundstart_template = /datum/map_template/shuttle/labour/box;
width = 9
},
-/turf/open/floor/plating/asteroid/snow/icemoon,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"atp" = (
/obj/machinery/door/airlock/external{
@@ -9821,7 +9828,7 @@
roundstart_template = /datum/map_template/shuttle/arrival/box;
width = 7
},
-/turf/closed/mineral/random/snow/no_caves,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"auB" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -10103,7 +10110,7 @@
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"avn" = (
/obj/machinery/door/airlock{
@@ -10166,7 +10173,7 @@
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 10
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"avv" = (
/obj/machinery/camera{
@@ -10196,7 +10203,7 @@
/area/maintenance/fore/secondary)
"avx" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"avy" = (
/obj/machinery/door/airlock{
@@ -10242,7 +10249,7 @@
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"avC" = (
/obj/structure/chair{
@@ -10458,14 +10465,14 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 10
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"awe" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"awg" = (
/obj/structure/cable{
@@ -10611,7 +10618,7 @@
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"awt" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
@@ -10656,7 +10663,7 @@
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 5
},
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"awx" = (
/obj/structure/cable{
@@ -10829,7 +10836,7 @@
/area/maintenance/starboard/fore)
"awN" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plating,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"awO" = (
/obj/structure/cable{
@@ -48519,9 +48526,6 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cmU" = (
@@ -53144,6 +53148,18 @@
},
/turf/open/floor/plasteel/dark,
/area/hallway/primary/central)
+"cQU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"cSA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -55341,19 +55357,15 @@
/turf/open/floor/carpet,
/area/library)
"hsZ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plating,
/area/engine/engineering)
"hzK" = (
/turf/open/floor/plasteel/yellowsiding/corner{
@@ -55373,6 +55385,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/engine,
/area/engine/engineering)
"hBw" = (
@@ -55497,6 +55512,12 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/engine,
/area/engine/engineering)
"hSl" = (
@@ -56689,12 +56710,13 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"kZE" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
- },
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/engine,
/area/engine/engineering)
"kZS" = (
@@ -58198,6 +58220,9 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/wood,
/area/crew_quarters/bar)
"plS" = (
@@ -59313,6 +59338,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/engine,
/area/engine/engineering)
"spz" = (
@@ -59452,6 +59480,18 @@
},
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
+"sCS" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"sEi" = (
/obj/machinery/vr_sleeper{
dir = 4
@@ -59643,15 +59683,18 @@
/turf/closed/wall,
/area/engine/atmos)
"sVb" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
/turf/open/floor/engine,
/area/engine/engineering)
"sWR" = (
@@ -60626,6 +60669,18 @@
},
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/locker)
+"viD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/open/floor/engine,
+/area/engine/engineering)
"viF" = (
/obj/structure/table/wood,
/obj/item/instrument/trumpet,
@@ -61108,6 +61163,10 @@
/obj/item/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
+"wgZ" = (
+/obj/structure/cable,
+/turf/open/floor/plasteel,
+/area/engine/engineering)
"wig" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -70287,11 +70346,11 @@ crk
aBM
aBM
aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
aBM
aBM
aBM
@@ -70544,11 +70603,11 @@ asE
arB
aBM
aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
aBM
aBM
arB
@@ -70801,11 +70860,11 @@ cwT
aAC
aBM
aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
aBM
aBM
aAC
@@ -71057,13 +71116,13 @@ iEJ
asE
arB
aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
+crk
+crk
aBM
arB
asE
@@ -71315,11 +71374,11 @@ awW
aAD
awW
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
awW
awW
@@ -71572,11 +71631,11 @@ azy
auP
cIh
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
azy
auP
@@ -71829,11 +71888,11 @@ awW
awW
awW
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
awW
awW
@@ -72085,13 +72144,13 @@ cqr
azz
aAF
awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
+crk
+crk
awW
aOf
azz
@@ -72342,13 +72401,13 @@ aIK
ayl
aAE
awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
+crk
+crk
awW
aOe
ayl
@@ -72599,13 +72658,13 @@ aIK
ayl
aAH
awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
+crk
+crk
awW
aOh
ayl
@@ -72856,13 +72915,13 @@ cry
azA
aAG
awW
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
+crk
+crk
awW
aOg
azA
@@ -73114,11 +73173,11 @@ awW
awW
awW
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
awW
awW
@@ -73371,11 +73430,11 @@ azy
auP
cIh
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
azy
auP
@@ -73628,11 +73687,11 @@ awW
aAD
awW
crk
-aBM
-aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
+crk
+crk
crk
awW
awW
@@ -73884,13 +73943,13 @@ ayo
azB
awW
aBM
-aBM
-aBM
-aBM
+crk
+crk
+crk
auA
-aBM
-aBM
-aBM
+crk
+crk
+crk
aBM
awW
aPt
@@ -74684,8 +74743,8 @@ aBM
aBM
aBM
aBM
-wWu
-wWu
+aBM
+aBM
aBM
aBM
aBM
@@ -74940,10 +74999,10 @@ beO
beO
beO
beO
-wWu
-wWu
-wWu
-wWu
+aBM
+aBM
+aBM
+aBM
aBM
aBM
aBM
@@ -76228,7 +76287,7 @@ beO
wWu
wWu
wWu
-aBM
+wWu
aBM
aBM
aBM
@@ -76484,7 +76543,7 @@ cAJ
beO
wWu
wWu
-aBM
+wWu
aBM
aBM
aBM
@@ -76739,8 +76798,8 @@ bjf
beO
beO
beO
-aBM
-aBM
+wWu
+wWu
aBM
aBM
aBM
@@ -81068,7 +81127,7 @@ alU
alU
amC
alU
-ats
+crk
rJw
arO
amC
@@ -81844,7 +81903,7 @@ alU
ayF
ayF
ayF
-ats
+crk
avY
axo
arP
@@ -83115,15 +83174,15 @@ ayF
ayF
ayF
ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
arP
vqP
inw
@@ -83372,15 +83431,15 @@ ayF
ayF
ayF
ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
aqQ
uCo
gzY
@@ -83629,15 +83688,15 @@ ayF
ayF
ayF
ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
aqQ
aqR
aqR
@@ -83886,15 +83945,15 @@ ayF
ayF
ayF
ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
+crk
aqQ
uCo
gzY
@@ -84143,15 +84202,15 @@ ayF
ayF
ayF
ayF
-ayF
-ayF
-ayF
-ayF
-ayF
-ayF
+crk
+crk
+crk
+crk
+crk
+crk
ato
-ayF
-ayF
+crk
+crk
arP
aqR
aqR
@@ -88609,7 +88668,7 @@ cmG
cnt
cob
coL
-cgR
+wgZ
cgR
thz
mZO
@@ -88865,7 +88924,7 @@ cTc
cTe
cfG
cgw
-uvd
+abY
fkR
uvd
ccw
@@ -89122,7 +89181,7 @@ clJ
cmF
cgR
cgI
-sYC
+hsZ
eon
bHg
bHg
@@ -89636,7 +89695,7 @@ cTd
ckF
ckF
qiK
-oZv
+cQU
wKZ
uut
cVt
@@ -90661,9 +90720,9 @@ cjf
cSX
ckK
clJ
-hsZ
-ckH
-jrl
+cmL
+cgR
+fkR
sVb
lIY
oYj
@@ -90921,7 +90980,7 @@ clJ
cmL
cnv
uvd
-oxl
+sCS
wKZ
sPm
rOg
@@ -91176,9 +91235,9 @@ cfb
cfb
ccw
cmN
-ckH
-jrl
-sVb
+cgR
+fkR
+viD
lIY
nRl
mKq
@@ -97318,13 +97377,13 @@ bvd
bKH
bzs
avm
-abY
+ayF
avm
-abY
+ayF
avB
-abY
+ayF
avm
-abY
+ayF
avB
awd
awe
@@ -97592,7 +97651,7 @@ bPj
bQA
bPj
bOh
-abY
+ayF
bMK
cyG
bMK
@@ -97849,7 +97908,7 @@ cbI
ccC
cdD
bOh
-abY
+ayF
bMQ
cyG
bMK
@@ -98106,7 +98165,7 @@ cbH
ccB
cbH
bOh
-abY
+ayF
bMQ
cyG
cKT
@@ -98363,7 +98422,7 @@ cbH
ccD
cbH
bOh
-abY
+ayF
bMQ
cyG
bMK
@@ -98620,7 +98679,7 @@ bOh
bOh
bOh
bOh
-abY
+ayF
bMK
axm
sUh
@@ -98873,11 +98932,11 @@ avx
avx
avx
aww
-abY
-abY
-abY
-abY
-abY
+ayF
+ayF
+ayF
+ayF
+ayF
cfj
cfU
cfj
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 75af28d174..9d36d26f6f 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -39336,6 +39336,9 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"byY" = (
@@ -40124,6 +40127,7 @@
/obj/structure/cable/yellow{
icon_state = "2-4"
},
+/obj/machinery/light/small,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bAI" = (
@@ -41633,7 +41637,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
},
-/turf/closed/wall/r_wall,
+/turf/closed/wall,
/area/engine/atmos)
"bDS" = (
/obj/effect/turf_decal/tile/yellow{
@@ -42650,7 +42654,7 @@
/area/engine/atmos)
"bFI" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/closed/wall,
+/turf/closed/wall/r_wall,
/area/engine/atmos)
"bFJ" = (
/obj/structure/disposalpipe/segment{
@@ -42659,7 +42663,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
-/turf/open/floor/plasteel/dark/corner,
+/turf/open/floor/plasteel,
/area/engine/atmos)
"bFM" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
@@ -42702,15 +42706,13 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFR" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 6
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/turf/open/floor/plasteel,
+/turf/closed/wall,
/area/engine/atmos)
"bFS" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible{
- dir = 9
- },
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bFT" = (
@@ -43345,9 +43347,8 @@
/area/engine/atmos)
"bHx" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/obj/machinery/atmospherics/pipe/simple/cyan/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 1
},
/turf/open/floor/plating,
/area/engine/atmos)
@@ -44017,7 +44018,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/turf/closed/wall/r_wall,
+/turf/closed/wall,
/area/engine/atmos)
"bIP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
@@ -44047,27 +44048,29 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIT" = (
-/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
- dir = 4
- },
/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIU" = (
-/obj/machinery/atmospherics/pipe/simple/purple/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Air to Ports"
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIV" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
- dir = 6
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Ports"
},
-/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bIW" = (
-/obj/machinery/atmospherics/pipe/manifold/yellow/visible,
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
+ },
+/turf/closed/wall,
/area/engine/atmos)
"bIX" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
@@ -44786,8 +44789,12 @@
/turf/open/floor/plasteel,
/area/storage/tcom)
"bKu" = (
-/obj/effect/turf_decal/bot,
-/turf/closed/wall/r_wall,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/purple/visible,
+/turf/open/floor/plating,
/area/engine/atmos)
"bKw" = (
/obj/structure/cable/yellow{
@@ -44800,7 +44807,7 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
},
-/turf/closed/wall/r_wall,
+/turf/closed/wall,
/area/engine/atmos)
"bKz" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -44830,7 +44837,9 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKE" = (
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bKF" = (
@@ -45559,9 +45568,9 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump/on{
+/obj/machinery/atmospherics/components/binary/pump{
dir = 1;
- name = "Mix to External"
+ name = "Port to External"
},
/turf/open/floor/plasteel,
/area/engine/atmos)
@@ -45569,7 +45578,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
-/turf/closed/wall/r_wall,
+/turf/closed/wall,
/area/engine/atmos)
"bMh" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -46436,7 +46445,12 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bNR" = (
@@ -47128,6 +47142,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
+/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/floor/plasteel,
/area/engine/atmos)
"bPr" = (
@@ -50108,7 +50123,9 @@
},
/area/engine/atmos)
"bVI" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel/dark/corner{
dir = 1
},
@@ -50860,6 +50877,9 @@
/obj/structure/cable/yellow{
icon_state = "1-8"
},
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 9
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"bXq" = (
@@ -53689,9 +53709,7 @@
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump{
- name = "Mix to Fuel Pipe"
- },
+/obj/machinery/atmospherics/pipe/simple/dark/visible,
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"ccP" = (
@@ -78788,11 +78806,10 @@
name = "Inner Pipe Access";
req_access_txt = "24"
},
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 4;
- name = "Mix to Engine"
- },
/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/atmos)
"dhj" = (
@@ -81294,6 +81311,15 @@
},
/turf/open/floor/plating,
/area/quartermaster/storage)
+"dLd" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"dLK" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -81536,6 +81562,12 @@
/obj/item/integrated_circuit_printer,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"gRX" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"gXY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -81605,6 +81637,13 @@
},
/turf/open/floor/plasteel/white,
/area/science/lab)
+"izM" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Ports"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"iCn" = (
/obj/machinery/vr_sleeper,
/turf/open/floor/plasteel,
@@ -81613,6 +81652,13 @@
/obj/structure/table,
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"iRL" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 0;
+ name = "Mix to Engine"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"iSt" = (
/obj/machinery/door/airlock/grunge,
/obj/structure/cable/yellow{
@@ -81677,6 +81723,15 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+"jAj" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"jBe" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -82064,6 +82119,12 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
+"nBn" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"nIb" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/mining{
@@ -82143,6 +82204,13 @@
/obj/structure/table/reinforced,
/turf/open/floor/plasteel/white,
/area/science/circuit)
+"oms" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
+/obj/machinery/meter,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"omz" = (
/obj/machinery/status_display/supply,
/turf/closed/wall,
@@ -82218,6 +82286,13 @@
/obj/structure/grille,
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"pbF" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"pmc" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -82403,6 +82478,12 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"rpR" = (
+/obj/machinery/atmospherics/pipe/simple/orange/visible{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"rzX" = (
/obj/structure/chair/office/light{
dir = 1;
@@ -82416,6 +82497,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/lab)
+"rAc" = (
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"rLV" = (
/obj/structure/table,
/obj/item/folder,
@@ -82483,6 +82570,13 @@
/obj/structure/grille,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"siI" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Port to Filter"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"soe" = (
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
@@ -82501,6 +82595,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"stP" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Port to Fuel Pipe"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"syk" = (
/obj/machinery/door/airlock{
id_tag = "AuxShower";
@@ -82649,6 +82749,10 @@
/obj/machinery/cryopod,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/cryopod)
+"uku" = (
+/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"upN" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -82867,6 +82971,12 @@
/obj/machinery/vending/cola/random,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"xgC" = (
+/obj/machinery/atmospherics/pipe/simple/dark/visible{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"xkG" = (
/obj/item/integrated_electronics/wirer,
/obj/structure/table/reinforced,
@@ -122977,7 +123087,7 @@ bpg
brA
bep
bvd
-bxd
+bxc
byR
bAB
bCh
@@ -123234,7 +123344,7 @@ bpg
brB
bep
bve
-bxd
+bxc
byS
bAC
dBJ
@@ -123491,7 +123601,7 @@ bpg
brC
bep
bCK
-bxd
+bxc
byT
bAD
bCj
@@ -124005,7 +124115,7 @@ bpi
brE
btz
bvh
-bxd
+bxc
byV
bAF
bCk
@@ -124013,7 +124123,7 @@ dBJ
bFH
bHq
bCk
-bKu
+bxd
bxc
bxc
bxc
@@ -124522,10 +124632,10 @@ bep
bxc
bKy
bAG
-bxg
+bFR
dBM
bza
-bxl
+bIW
bIO
bMg
bMb
@@ -124536,8 +124646,8 @@ bSg
bDS
bDS
bVI
-dBJ
-bCi
+jAj
+bYw
bYw
cbe
ccO
@@ -124784,7 +124894,7 @@ bDT
bFM
bHu
bIP
-bKw
+dLd
bKw
bNQ
bPq
@@ -125041,9 +125151,9 @@ bDU
bFN
bAO
bIS
+siI
bCi
-bCi
-bCi
+rAc
bCi
bCi
bCi
@@ -125298,9 +125408,9 @@ bDV
bFO
bHv
bIR
-bCi
-bCi
-bCi
+nBn
+stP
+xgC
bCi
bCi
bCi
@@ -125555,8 +125665,8 @@ bMe
bFP
bMe
bMf
-bCi
-bCi
+uku
+pbF
bCi
bCi
bCi
@@ -125812,8 +125922,8 @@ bDW
bFQ
bHw
bIT
-bCi
-bCi
+oms
+pbF
bCi
bCi
bCi
@@ -126066,11 +126176,11 @@ bzc
bAL
ddF
bDX
-bFR
+bCi
bHx
bIU
-bCi
-bCi
+uku
+pbF
bCi
bCi
bKD
@@ -126324,11 +126434,11 @@ bAM
bCt
bDY
bFS
-bHy
+bKu
bIV
-bCi
-bCi
-bCi
+uku
+iRL
+rpR
bCi
bCi
bCi
@@ -126582,10 +126692,10 @@ bCu
bDZ
bFT
bHz
-bIW
+bNR
+izM
bKD
-bCi
-bCi
+gRX
bCi
bCi
bCi
@@ -126842,7 +126952,7 @@ bHy
bIX
bKE
bNR
-bCi
+gRX
bCi
bCi
bCi
diff --git a/byond-extools.dll b/byond-extools.dll
new file mode 100644
index 0000000000..a83ea1e543
Binary files /dev/null and b/byond-extools.dll differ
diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm
index 65be8258a1..bad64846d6 100644
--- a/code/__DEFINES/MC.dm
+++ b/code/__DEFINES/MC.dm
@@ -25,35 +25,38 @@
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
//subsystem does not initialize.
-#define SS_NO_INIT 1
+#define SS_NO_INIT (1<<0)
//subsystem does not fire.
// (like can_fire = 0, but keeps it from getting added to the processing subsystems list)
// (Requires a MC restart to change)
-#define SS_NO_FIRE 2
+#define SS_NO_FIRE (1<<1)
//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick)
// SS_BACKGROUND has its own priority bracket
-#define SS_BACKGROUND 4
+#define SS_BACKGROUND (1<<2)
//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background))
-#define SS_NO_TICK_CHECK 8
+#define SS_NO_TICK_CHECK (1<<3)
//Treat wait as a tick count, not DS, run every wait ticks.
// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems)
// (implies all runlevels because of how it works)
// (overrides SS_BACKGROUND)
// This is designed for basically anything that works as a mini-mc (like SStimer)
-#define SS_TICKER 16
+#define SS_TICKER (1<<4)
//keep the subsystem's timing on point by firing early if it fired late last fire because of lag
// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds.
-#define SS_KEEP_TIMING 32
+#define SS_KEEP_TIMING (1<<5)
//Calculate its next fire after its fired.
// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be)
// This flag overrides SS_KEEP_TIMING
-#define SS_POST_FIRE_TIMING 64
+#define SS_POST_FIRE_TIMING (1<<6)
+
+/// Show in stat() by default even if SS_NO_FIRE
+#define SS_ALWAYS_SHOW_STAT (1<<7)
//SUBSYSTEM STATES
#define SS_IDLE 0 //aint doing shit.
diff --git a/code/__DEFINES/_tick.dm b/code/__DEFINES/_tick.dm
index 10b815e547..fc6147c430 100644
--- a/code/__DEFINES/_tick.dm
+++ b/code/__DEFINES/_tick.dm
@@ -1,13 +1,28 @@
-#define TICK_LIMIT_RUNNING 80
+/// Percentage of tick to leave for master controller to run
+#define MAPTICK_MC_MIN_RESERVE 70
+/// internal_tick_usage is updated every tick by extools
+#define MAPTICK_LAST_INTERNAL_TICK_USAGE ((GLOB.internal_tick_usage / world.tick_lag) * 100)
+/// Tick limit while running normally
+#define TICK_BYOND_RESERVE 2
+#define TICK_LIMIT_RUNNING (max(100 - TICK_BYOND_RESERVE - MAPTICK_LAST_INTERNAL_TICK_USAGE, MAPTICK_MC_MIN_RESERVE))
+/// Tick limit used to resume things in stoplag
#define TICK_LIMIT_TO_RUN 70
+/// Tick limit for MC while running
#define TICK_LIMIT_MC 70
-#define TICK_LIMIT_MC_INIT_DEFAULT 98
+/// Tick limit while initializing
+#define TICK_LIMIT_MC_INIT_DEFAULT (100 - TICK_BYOND_RESERVE)
-#define TICK_USAGE world.tick_usage //for general usage
-#define TICK_USAGE_REAL world.tick_usage //to be used where the result isn't checked
+/// for general usage of tick_usage
+#define TICK_USAGE world.tick_usage
+/// to be used where the result isn't checked
+#define TICK_USAGE_REAL world.tick_usage
+/// Returns true if tick_usage is above the limit
#define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit )
+/// runs stoplag if tick_usage is above the limit
#define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 )
+/// Returns true if tick usage is above 95, for high priority usage
#define TICK_CHECK_HIGH_PRIORITY ( TICK_USAGE > 95 )
+/// runs stoplag if tick_usage is above 95, for high priority usage
#define CHECK_TICK_HIGH_PRIORITY ( TICK_CHECK_HIGH_PRIORITY? stoplag() : 0 )
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index eba99f484b..f9c3b0d427 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -259,10 +259,10 @@
//HELPERS
#define PIPING_LAYER_SHIFT(T, PipingLayer) \
- if(T.dir & NORTH || T.dir & SOUTH) { \
+ if(T.dir & (NORTH|SOUTH)) { \
T.pixel_x = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_X;\
} \
- if(T.dir & WEST || T.dir & EAST) { \
+ if(T.dir & (WEST|EAST)) { \
T.pixel_y = (PipingLayer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y;\
}
diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm
index 2f54d066a0..77ec97f47e 100644
--- a/code/__DEFINES/construction.dm
+++ b/code/__DEFINES/construction.dm
@@ -59,8 +59,6 @@
//let's just pretend fulltile windows being children of border windows is fine
#define FULLTILE_WINDOW_DIR NORTHEAST
-//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
-#define MINERAL_MATERIAL_AMOUNT 2000
//The maximum size of a stack object.
#define MAX_STACK_SIZE 50
//maximum amount of cable in a coil
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index b8fe76fb1d..649e0a029b 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -132,7 +132,7 @@
#define FEMALE_UNIFORM_FULL 1
#define FEMALE_UNIFORM_TOP 2
-//flags for outfits that have mutantrace variants: These are hard sprited too.
+//flags for outfits that have mutant race variants: Most of these require additional sprites to work.
#define STYLE_DIGITIGRADE (1<<0) //jumpsuits, suits and shoes
#define STYLE_MUZZLE (1<<1) //hats or masks
#define STYLE_SNEK_TAURIC (1<<2) //taur-friendly suits
@@ -140,6 +140,9 @@
#define STYLE_HOOF_TAURIC (1<<4)
#define STYLE_ALL_TAURIC (STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC|STYLE_HOOF_TAURIC)
#define STYLE_NO_ANTHRO_ICON (1<<5) //When digis fit the default sprite fine and need no copypasted states. This is the case of skirts and winter coats, for example.
+#define USE_SNEK_CLIP_MASK (1<<6)
+#define USE_QUADRUPED_CLIP_MASK (1<<7)
+#define USE_TAUR_CLIP_MASK (USE_SNEK_CLIP_MASK|USE_QUADRUPED_CLIP_MASK)
//digitigrade legs settings.
#define NOT_DIGITIGRADE 0
diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index f4a30cd482..a6c31bf965 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -1,6 +1,8 @@
//Defines for atom layers and planes
//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
+#define PLANE_VOID -100
+
#define CLICKCATCHER_PLANE -99
#define PLANE_SPACE -95
@@ -89,6 +91,8 @@
#define MASSIVE_OBJ_LAYER 11
#define POINT_LAYER 12
+#define CHAT_LAYER 12.1
+
#define EMISSIVE_BLOCKER_PLANE 12
#define EMISSIVE_BLOCKER_LAYER 12
#define EMISSIVE_BLOCKER_RENDER_TARGET "*EMISSIVE_BLOCKER_PLANE"
diff --git a/code/__DEFINES/mapping/maploader.dm b/code/__DEFINES/mapping/maploader.dm
new file mode 100644
index 0000000000..e225e68867
--- /dev/null
+++ b/code/__DEFINES/mapping/maploader.dm
@@ -0,0 +1,3 @@
+//map template annihilate_bounds
+#define MAP_TEMPLATE_ANNIHILATE_PRELOAD 1 //annihilate bounds before starting loading
+#define MAP_TEMPLATE_ANNIHILATE_LOADING 2 //"sweeping" delete during loading
diff --git a/code/__DEFINES/material/worth.dm b/code/__DEFINES/material/worth.dm
new file mode 100644
index 0000000000..db79d7317b
--- /dev/null
+++ b/code/__DEFINES/material/worth.dm
@@ -0,0 +1,2 @@
+/// cm3 of material matter per sheet
+#define MINERAL_MATERIAL_AMOUNT 2000
diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm
index 89553d9c6c..e2ae22345f 100644
--- a/code/__DEFINES/materials.dm
+++ b/code/__DEFINES/materials.dm
@@ -7,5 +7,5 @@
/// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes.
#define MATERIAL_COLOR (1<<0)
#define MATERIAL_ADD_PREFIX (1<<1)
-#define MATERIAL_NO_EFFECTS (1<<2)
+#define MATERIAL_EFFECTS (1<<2)
#define MATERIAL_AFFECT_STATISTICS (1<<3)
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 8bc8c8bebe..42095aba41 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -35,15 +35,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be.
#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup)
-#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
-#define DAMAGE_LAYER 23 //damage indicators (cuts and burns)
-#define UNIFORM_LAYER 22
-#define ID_LAYER 21
-#define HANDS_PART_LAYER 20
-#define SHOES_LAYER 19
-#define GLOVES_LAYER 18
-#define EARS_LAYER 17
-#define BODY_TAUR_LAYER 16
+#define BODY_ADJ_UPPER_LAYER 24
+#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
+#define DAMAGE_LAYER 22 //damage indicators (cuts and burns)
+#define UNIFORM_LAYER 21
+#define ID_LAYER 20
+#define HANDS_PART_LAYER 19
+#define SHOES_LAYER 18
+#define GLOVES_LAYER 17
+#define EARS_LAYER 16
#define SUIT_LAYER 15
#define GENITALS_EXPOSED_LAYER 14
#define GLASSES_LAYER 13
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 111c9850ba..17aff463dc 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -289,4 +289,8 @@
#define HUMAN_FIRE_STACK_ICON_NUM 3
+#define GRAB_PIXEL_SHIFT_PASSIVE 6
+#define GRAB_PIXEL_SHIFT_AGGRESSIVE 12
+#define GRAB_PIXEL_SHIFT_NECK 16
+
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 6b14e4012c..507126867f 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -53,3 +53,4 @@
#define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change.
#define ORGAN_VITAL (1<<4) //Currently only the brain
#define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances
+#define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment.
diff --git a/code/__DEFINES/research/stock_parts.dm b/code/__DEFINES/research/stock_parts.dm
new file mode 100644
index 0000000000..457e3b632e
--- /dev/null
+++ b/code/__DEFINES/research/stock_parts.dm
@@ -0,0 +1,5 @@
+// the clamps are just sanity checks.
+/// Efficiency scaling for stock part level to material usage. All code concerning lathing and production from raw material sheet should be using this.
+#define STANDARD_PART_LEVEL_LATHE_COEFFICIENT(level) clamp(1 - (level * 0.1), 0, 1)
+/// Efficiency scaling for stock part level to ore factor. All code concerning lathing and production from raw ores to raw material sheets should be using this.
+#define STANDARD_PART_LEVEL_ORE_COEFFICIENT(level) clamp(1 + (level * 0.125), 1, 10)
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index 8c18225f6a..593edf4705 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -34,6 +34,8 @@
#define STATUS_EFFECT_HIPPOCRATIC_OATH /datum/status_effect/hippocraticOath //Gives you an aura of healing as well as regrowing the Rod of Asclepius if lost
+#define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core //removes damage slowdown while giving a slow regenerating effect
+
/////////////
// DEBUFFS //
/////////////
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index cadc1113c5..3abef3a61c 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -132,8 +132,15 @@
#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME)
-
-
+// SSair run section
+#define SSAIR_PIPENETS 1
+#define SSAIR_ATMOSMACHINERY 2
+#define SSAIR_REACTQUEUE 3
+#define SSAIR_EXCITEDGROUPS 4
+#define SSAIR_HIGHPRESSURE 5
+#define SSAIR_HOTSPOTS 6
+#define SSAIR_SUPERCONDUCTIVITY 7
+#define SSAIR_REBUILD_PIPENETS 8
#define COMPILE_OVERLAYS(A)\
if (TRUE) {\
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 4d18e60b71..91a4a6f2c3 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -78,6 +78,7 @@
#define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE
#define TRAIT_PACIFISM "pacifism"
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
+#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
#define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness
#define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination
#define TRAIT_DISFIGURED "disfigured"
@@ -187,7 +188,7 @@
#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_NO_ALCOHOL "alcohol_intolerance"
#define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing.
-#define TRAIT_FAST_PUMP "fast_pump"
+#define TRAIT_FAST_PUMP "fast_pump"
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 38e25b04c5..bcfaa1bed2 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -88,6 +88,7 @@
init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes)
INVOKE_ASYNC(GLOBAL_PROC, /proc/init_ref_coin_values) //so the current procedure doesn't sleep because of UNTIL()
+ INVOKE_ASYNC(GLOBAL_PROC, /proc/setupGenetics)
//creates every subtype of prototype (excluding prototype) and adds it to list L.
//if no list/L is provided, one is created.
@@ -113,3 +114,25 @@
UNTIL(C.flags_1 & INITIALIZED_1) //we want to make sure the value is calculated and not null.
GLOB.coin_values[path] = C.value
qdel(C)
+
+/proc/setupGenetics()
+ var/list/mutations = subtypesof(/datum/mutation/human)
+ shuffle_inplace(mutations)
+ for(var/A in subtypesof(/datum/generecipe))
+ var/datum/generecipe/GR = A
+ GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result)
+ for(var/i in 1 to LAZYLEN(mutations))
+ var/path = mutations[i] //byond gets pissy when we do it in one line
+ var/datum/mutation/human/B = new path ()
+ B.alias = "Mutation #[i]"
+ GLOB.all_mutations[B.type] = B
+ GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks)
+ if(B.locked)
+ continue
+ if(B.quality == POSITIVE)
+ GLOB.good_mutations |= B
+ else if(B.quality == NEGATIVE)
+ GLOB.bad_mutations |= B
+ else if(B.quality == MINOR_NEGATIVE)
+ GLOB.not_good_mutations |= B
+ CHECK_TICK
\ No newline at end of file
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index e69052ad8d..e0714a87b3 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -163,9 +163,11 @@
"tail_lizard" = pick(GLOB.tails_list_lizard),
"tail_human" = "None",
"wings" = "None",
+ "wings_color" = "FFF",
"deco_wings" = "None",
"snout" = pick(GLOB.snouts_list),
- "horns" = pick(GLOB.horns_list),
+ "horns" = "None",
+ "horns_color" = "85615a",
"ears" = "None",
"frills" = pick(GLOB.frills_list),
"spines" = pick(GLOB.spines_list),
@@ -174,7 +176,7 @@
"caps" = pick(GLOB.caps_list),
"insect_wings" = pick(GLOB.insect_wings_list),
"insect_fluff" = "None",
- "insect_markings" = pick(GLOB.insect_markings_list),
+ "insect_markings" = pick(GLOB.insect_markings_list),
"taur" = "None",
"mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
"mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index c4ed2d9266..52eff15492 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -266,6 +266,16 @@ GLOBAL_LIST_INIT(bitfields, list(
"STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS,
"STORAGE_LIMIT_VOLUME" = STORAGE_LIMIT_VOLUME
),
+ "mutantrace_variation" = list(
+ "STYLE_DIGITIGRADE" = STYLE_DIGITIGRADE,
+ "STYLE_MUZZLE" = STYLE_MUZZLE,
+ "STYLE_SNEK_TAURIC" = STYLE_SNEK_TAURIC,
+ "STYLE_PAW_TAURIC" = STYLE_PAW_TAURIC,
+ "STYLE_HOOF_TAURIC" = STYLE_HOOF_TAURIC,
+ "STYLE_NO_ANTHRO_ICON" = STYLE_NO_ANTHRO_ICON,
+ "USE_SNEK_CLIP_MASK" = USE_SNEK_CLIP_MASK,
+ "USE_QUADRUPED_CLIP_MASK" = USE_QUADRUPED_CLIP_MASK
+ ),
"vis_flags" = list(
"VIS_INHERIT_ICON" = VIS_INHERIT_ICON,
"VIS_INHERIT_ICON_STATE" = VIS_INHERIT_ICON_STATE,
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 968995e81d..aacb1737a2 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -137,8 +137,8 @@ GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT))
#define UPLINK_PEN "Pen" //like a real spy!
GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN))
- //Female Uniforms
-GLOBAL_LIST_EMPTY(female_clothing_icons)
+//List of cached alpha masked icons.
+GLOBAL_LIST_EMPTY(alpha_masked_worn_icons)
//radical shit
GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF"))
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index af483bf888..b039e6d114 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -33,3 +33,5 @@ GLOBAL_VAR(bible_icon_state)
GLOBAL_VAR(bible_item_state)
GLOBAL_VAR(holy_weapon_type)
GLOBAL_VAR(holy_armor_type)
+
+GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 28fd7397b0..4b963c730d 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -162,7 +162,7 @@
#define ui_ghost_orbit "SOUTH:6,CENTER-1:24"
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
-#define ui_ghost_pai "SOUTH: 6, CENTER+2:24"
+#define ui_ghost_spawners "SOUTH: 6, CENTER+2:24"
//UI position overrides for 1:1 screen layout. (default is 7:5)
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index 14da637f18..0cdac111b0 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -36,13 +36,13 @@
var/mob/dead/observer/G = usr
G.dead_tele()
-/obj/screen/ghost/pai
- name = "pAI Candidate"
- icon_state = "pai"
+/obj/screen/ghost/spawners
+ name = "Ghost role spawners"
+ icon_state = "spawners"
-/obj/screen/ghost/pai/Click()
+/obj/screen/ghost/spawners/Click()
var/mob/dead/observer/G = usr
- G.register_pai()
+ G.open_spawners_menu()
/datum/hud/ghost/New(mob/owner)
..()
@@ -68,8 +68,8 @@
using.hud = src
static_inventory += using
- using = new /obj/screen/ghost/pai()
- using.screen_loc = ui_ghost_pai
+ using = new /obj/screen/ghost/spawners()
+ using.screen_loc = ui_ghost_spawners
using.hud = src
static_inventory += using
diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm
index 19fef28597..28803f0979 100644
--- a/code/controllers/admin.dm
+++ b/code/controllers/admin.dm
@@ -3,9 +3,7 @@
name = "Initializing..."
var/target
-INITIALIZE_IMMEDIATE(/obj/effect/statclick)
-
-/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical
+/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical
. = ..()
name = text
src.target = target
@@ -33,6 +31,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick)
usr.client.debug_variables(target)
message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].")
+/obj/effect/statclick/misc_subsystems/Click()
+ if(!usr.client.holder)
+ return
+ var/subsystem = input(usr, "Debug which subsystem?", "Debug nonprocessing subsystem") as null|anything in (Master.subsystems - Master.statworthy_subsystems)
+ if(!subsystem)
+ return
+ usr.client.debug_variables(subsystem)
+ message_admins("Admin [key_name_admin(usr)] is debugging the [subsystem] subsystem.")
// Debug verbs.
/client/proc/restart_controller(controller in list("Master", "Failsafe"))
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 8772fac5af..cdbea1de85 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -28,6 +28,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// List of subsystems to process().
var/list/subsystems
+ /// List of subsystems to include in the MC stat panel.
+ var/list/statworthy_subsystems
// Vars for keeping track of tick drift.
var/init_timeofday
@@ -36,6 +38,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/sleep_delta = 1
+ ///Only run ticker subsystems for the next n ticks.
+ var/skip_ticks = 0
+
var/make_runtime = 0
var/initializations_finished_with_no_players_logged_in //I wonder what this could be?
@@ -62,6 +67,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
//used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits
var/static/current_ticklimit = TICK_LIMIT_RUNNING
+ /// Statclick for misc subsystems
+ var/obj/effect/statclick/misc_subsystems/misc_statclick
+
/datum/controller/master/New()
if(!config)
config = new
@@ -84,6 +92,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
_subsystems += new I
Master = src
+ // We want to see all subsystems during init.
+ statworthy_subsystems = subsystems.Copy()
+
+ misc_statclick = new(null, "Debug")
+
if(!GLOB)
new /datum/controller/global_vars
@@ -254,10 +267,14 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/list/tickersubsystems = list()
var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel
var/timer = world.time
+ statworthy_subsystems = list()
for (var/thing in subsystems)
var/datum/controller/subsystem/SS = thing
if (SS.flags & SS_NO_FIRE)
+ if(SS.flags & SS_ALWAYS_SHOW_STAT)
+ statworthy_subsystems += SS
continue
+ statworthy_subsystems += SS
SS.queued_time = 0
SS.queue_next = null
SS.queue_prev = null
@@ -335,7 +352,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
new/datum/controller/failsafe() // (re)Start the failsafe.
//now do the actual stuff
- if (!queue_head || !(iteration % 3))
+ if (!skip_ticks)
var/checking_runlevel = current_runlevel
if(cached_runlevel != checking_runlevel)
//resechedule subsystems
@@ -381,6 +398,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
iteration++
last_run = world.time
+ if (skip_ticks)
+ skip_ticks--
src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta)
current_ticklimit = TICK_LIMIT_RUNNING
if (processing * sleep_delta <= world.tick_lag)
@@ -444,10 +463,12 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
while (queue_node)
if (ran && TICK_USAGE > TICK_LIMIT_RUNNING)
break
-
queue_node_flags = queue_node.flags
queue_node_priority = queue_node.queued_priority
+ if (!(queue_node_flags & SS_TICKER) && skip_ticks)
+ queue_node = queue_node.queue_next
+ continue
//super special case, subsystems where we can't make them pause mid way through
//if we can't run them this tick (without going over a tick)
//we bump up their priority and attempt to run them next tick
@@ -455,14 +476,15 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// in those cases, so we just let them run)
if (queue_node_flags & SS_NO_TICK_CHECK)
if (queue_node.tick_usage > TICK_LIMIT_RUNNING - TICK_USAGE && ran_non_ticker)
- queue_node.queued_priority += queue_priority_count * 0.1
- queue_priority_count -= queue_node_priority
- queue_priority_count += queue_node.queued_priority
- current_tick_budget -= queue_node_priority
- queue_node = queue_node.queue_next
+ if (!(queue_node_flags & SS_BACKGROUND))
+ queue_node.queued_priority += queue_priority_count * 0.1
+ queue_priority_count -= queue_node_priority
+ queue_priority_count += queue_node.queued_priority
+ current_tick_budget -= queue_node_priority
+ queue_node = queue_node.queue_next
continue
- if ((queue_node_flags & SS_BACKGROUND) && !bg_calc)
+ if (!bg_calc && (queue_node_flags & SS_BACKGROUND))
current_tick_budget = queue_priority_count_bg
bg_calc = TRUE
@@ -515,7 +537,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
queue_node.paused_ticks = 0
queue_node.paused_tick_usage = 0
- if (queue_node_flags & SS_BACKGROUND) //update our running total
+ if (bg_calc) //update our running total
queue_priority_count_bg -= queue_node_priority
else
queue_priority_count -= queue_node_priority
@@ -583,14 +605,19 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
log_world("MC: SoftReset: Finished.")
. = 1
+/// Warns us that the end of tick byond map_update will be laggier then normal, so that we can just skip running subsystems this tick.
+/datum/controller/master/proc/laggy_byond_map_update_incoming()
+ if (!skip_ticks)
+ skip_ticks = 1
/datum/controller/master/stat_entry()
if(!statclick)
statclick = new/obj/effect/statclick/debug(null, "Initializing...", src)
- stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))")
- stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])"))
+ stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)")
+ stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration]) (TickLimit: [round(Master.current_ticklimit, 0.1)])"))
+ stat("Misc Subsystems", misc_statclick)
/datum/controller/master/StartLoadingMap()
//disallow more than one map to load at once, multithreading it will just cause race conditions
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 13facc7666..d8c7724333 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -1,11 +1,3 @@
-#define SSAIR_PIPENETS 1
-#define SSAIR_ATMOSMACHINERY 2
-#define SSAIR_REACTQUEUE 3
-#define SSAIR_EXCITEDGROUPS 4
-#define SSAIR_HIGHPRESSURE 5
-#define SSAIR_HOTSPOTS 6
-#define SSAIR_SUPERCONDUCTIVITY 7
-
SUBSYSTEM_DEF(air)
name = "Atmospherics"
init_order = INIT_ORDER_AIR
@@ -20,6 +12,7 @@ SUBSYSTEM_DEF(air)
var/cost_hotspots = 0
var/cost_superconductivity = 0
var/cost_pipenets = 0
+ var/cost_rebuilds = 0
var/cost_atmos_machinery = 0
var/list/excited_groups = list()
@@ -27,6 +20,7 @@ SUBSYSTEM_DEF(air)
var/list/turf_react_queue = list()
var/list/hotspots = list()
var/list/networks = list()
+ var/list/pipenets_needing_rebuilt = list()
var/list/obj/machinery/atmos_machinery = list()
var/list/pipe_init_dirs_cache = list()
@@ -39,7 +33,7 @@ SUBSYSTEM_DEF(air)
var/list/currentrun = list()
- var/currentpart = SSAIR_PIPENETS
+ var/currentpart = SSAIR_REBUILD_PIPENETS
var/map_loading = TRUE
var/list/queued_for_activation
@@ -52,6 +46,7 @@ SUBSYSTEM_DEF(air)
msg += "HS:[round(cost_hotspots,1)]|"
msg += "SC:[round(cost_superconductivity,1)]|"
msg += "PN:[round(cost_pipenets,1)]|"
+ msg += "RB:[round(cost_rebuilds,1)]|"
msg += "AM:[round(cost_atmos_machinery,1)]"
msg += "} "
msg += "AT:[active_turfs.len]|"
@@ -77,6 +72,18 @@ SUBSYSTEM_DEF(air)
/datum/controller/subsystem/air/fire(resumed = 0)
var/timer = TICK_USAGE_REAL
+ if(currentpart == SSAIR_REBUILD_PIPENETS)
+ var/list/pipenet_rebuilds = pipenets_needing_rebuilt
+ for(var/thing in pipenet_rebuilds)
+ var/obj/machinery/atmospherics/AT = thing
+ AT.build_network()
+ cost_rebuilds = MC_AVERAGE(cost_rebuilds, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+ pipenets_needing_rebuilt.Cut()
+ if(state != SS_RUNNING)
+ return
+ resumed = FALSE
+ currentpart = SSAIR_PIPENETS
+
if(currentpart == SSAIR_PIPENETS || !resumed)
process_pipenets(resumed)
cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
@@ -137,9 +144,7 @@ SUBSYSTEM_DEF(air)
if(state != SS_RUNNING)
return
resumed = 0
- currentpart = SSAIR_PIPENETS
-
-
+ currentpart = SSAIR_REBUILD_PIPENETS
/datum/controller/subsystem/air/proc/process_pipenets(resumed = 0)
if (!resumed)
@@ -156,6 +161,9 @@ SUBSYSTEM_DEF(air)
if(MC_TICK_CHECK)
return
+/datum/controller/subsystem/air/proc/add_to_rebuild_queue(atmos_machine)
+ if(istype(atmos_machine, /obj/machinery/atmospherics))
+ pipenets_needing_rebuilt += atmos_machine
/datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0)
var/seconds = wait * 0.1
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm
index 35feab6648..c1644df9c9 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/atoms.dm
@@ -16,7 +16,6 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Initialize(timeofday)
GLOB.fire_overlay.appearance_flags = RESET_COLOR
- setupGenetics() //to set the mutations' sequence.
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
@@ -107,28 +106,6 @@ SUBSYSTEM_DEF(atoms)
old_initialized = SSatoms.old_initialized
BadInitializeCalls = SSatoms.BadInitializeCalls
-/datum/controller/subsystem/atoms/proc/setupGenetics()
- var/list/mutations = subtypesof(/datum/mutation/human)
- shuffle_inplace(mutations)
- for(var/A in subtypesof(/datum/generecipe))
- var/datum/generecipe/GR = A
- GLOB.mutation_recipes[initial(GR.required)] = initial(GR.result)
- for(var/i in 1 to LAZYLEN(mutations))
- var/path = mutations[i] //byond gets pissy when we do it in one line
- var/datum/mutation/human/B = new path ()
- B.alias = "Mutation #[i]"
- GLOB.all_mutations[B.type] = B
- GLOB.full_sequences[B.type] = generate_gene_sequence(B.blocks)
- if(B.locked)
- continue
- if(B.quality == POSITIVE)
- GLOB.good_mutations |= B
- else if(B.quality == NEGATIVE)
- GLOB.bad_mutations |= B
- else if(B.quality == MINOR_NEGATIVE)
- GLOB.not_good_mutations |= B
- CHECK_TICK
-
/datum/controller/subsystem/atoms/proc/InitLog()
. = ""
for(var/path in BadInitializeCalls)
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index c0b6467f27..b234c4c4f2 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -213,7 +213,7 @@ SUBSYSTEM_DEF(mapping)
z_list = SSmapping.z_list
-/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE)
+/datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE, orientation = SOUTH)
. = list()
var/start_time = REALTIMEOFDAY
@@ -253,7 +253,7 @@ SUBSYSTEM_DEF(mapping)
// load the maps
for (var/P in parsed_maps)
var/datum/parsed_map/pm = P
- if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE))
+ if (!pm.load(1, 1, start_z + parsed_maps[P], no_changeturf = TRUE, orientation = orientation))
errorList |= pm.original_path
if(!silent)
INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!")
@@ -269,7 +269,7 @@ SUBSYSTEM_DEF(mapping)
// load the station
station_start = world.maxz + 1
INIT_ANNOUNCE("Loading [config.map_name]...")
- LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION)
+ LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION, FALSE, config.orientation)
if(SSdbcore.Connect())
var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]")
diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm
index 4171b5f8c1..8cd63c6949 100644
--- a/code/controllers/subsystem/processing/projectiles.dm
+++ b/code/controllers/subsystem/processing/projectiles.dm
@@ -3,7 +3,6 @@ PROCESSING_SUBSYSTEM_DEF(projectiles)
wait = 1
stat_tag = "PP"
flags = SS_NO_INIT|SS_TICKER
- var/global_max_tick_moves = 10
var/global_pixel_speed = 2
var/global_iterations_per_move = 16
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 428f355c31..3f71d192e3 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -150,6 +150,8 @@
friend_talk(message)
/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
+ if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
+ create_chat_message(speaker, message_language, raw_message, spans, message_mode)
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source))
/mob/camera/imaginary_friend/proc/friend_talk(message)
diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm
new file mode 100644
index 0000000000..cbcb34ac5e
--- /dev/null
+++ b/code/datums/chatmessage.dm
@@ -0,0 +1,236 @@
+#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS
+#define CHAT_MESSAGE_LIFESPAN 5 SECONDS
+#define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS
+#define CHAT_MESSAGE_EXP_DECAY 0.7 // Messages decay at pow(factor, idx in stack)
+#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 // Increase message decay based on the height of the message
+#define CHAT_MESSAGE_APPROX_LHEIGHT 11 // Approximate height in pixels of an 'average' line, used for height decay
+#define CHAT_MESSAGE_WIDTH 96 // pixels
+#define CHAT_MESSAGE_MAX_LENGTH 110 // characters
+#define WXH_TO_HEIGHT(x) text2num(copytext((x), findtextEx((x), "x") + 1)) // thanks lummox
+
+/**
+ * # Chat Message Overlay
+ *
+ * Datum for generating a message overlay on the map
+ */
+/datum/chatmessage
+ /// The visual element of the chat messsage
+ var/image/message
+ /// The location in which the message is appearing
+ var/atom/message_loc
+ /// The client who heard this message
+ var/client/owned_by
+ /// Contains the scheduled destruction time
+ var/scheduled_destruction
+ /// Contains the approximate amount of lines for height decay
+ var/approx_lines
+
+/**
+ * Constructs a chat message overlay
+ *
+ * Arguments:
+ * * text - The text content of the overlay
+ * * target - The target atom to display the overlay at
+ * * owner - The mob that owns this overlay, only this mob will be able to view it
+ * * extra_classes - Extra classes to apply to the span that holds the text
+ * * lifespan - The lifespan of the message in deciseconds
+ */
+/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = null, lifespan = CHAT_MESSAGE_LIFESPAN)
+ . = ..()
+ if (!istype(target))
+ CRASH("Invalid target given for chatmessage")
+ if(QDELETED(owner) || !istype(owner) || !owner.client)
+ stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner")
+ qdel(src)
+ return
+ INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, extra_classes, lifespan)
+
+/datum/chatmessage/Destroy()
+ if (owned_by)
+ if (owned_by.seen_messages)
+ LAZYREMOVEASSOC(owned_by.seen_messages, message_loc, src)
+ owned_by.images.Remove(message)
+ owned_by = null
+ message_loc = null
+ message = null
+ return ..()
+
+/**
+ * Generates a chat message image representation
+ *
+ * Arguments:
+ * * text - The text content of the overlay
+ * * target - The target atom to display the overlay at
+ * * owner - The mob that owns this overlay, only this mob will be able to view it
+ * * extra_classes - Extra classes to apply to the span that holds the text
+ * * lifespan - The lifespan of the message in deciseconds
+ */
+/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
+ // Register client who owns this message
+ owned_by = owner.client
+ RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/qdel, src)
+
+ // Clip message
+ var/maxlen = owned_by.prefs.max_chat_length
+ if (length_char(text) > maxlen)
+ text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment
+
+ // Calculate target color if not already present
+ if (!target.chat_color || target.chat_color_name != target.name)
+ target.chat_color = colorize_string(target.name)
+ target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85)
+ target.chat_color_name = target.name
+
+ // Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag
+ var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g")
+ text = replacetext(text, url_scheme, "")
+
+ // Reject whitespace
+ var/static/regex/whitespace = new(@"^\s*$")
+ if (whitespace.Find(text))
+ qdel(src)
+ return
+
+ // Non mobs speakers can be small
+ if (!ismob(target))
+ extra_classes |= "small"
+
+ // Append radio icon if from a virtual speaker
+ if (extra_classes.Find("virtual-speaker"))
+ var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio")
+ text = "\icon[r_icon] " + text
+
+ // We dim italicized text to make it more distinguishable from regular text
+ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color
+
+ // Approximate text height
+ // Note we have to replace HTML encoded metacharacters otherwise MeasureText will return a zero height
+ // BYOND Bug #2563917
+ // Construct text
+ var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
+ var/complete_text = "[text]"
+ var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH))
+ approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
+
+ // Translate any existing messages upwards, apply exponential decay factors to timers
+ message_loc = target
+ if (owned_by.seen_messages)
+ var/idx = 1
+ var/combined_height = approx_lines
+ for(var/msg in owned_by.seen_messages[message_loc])
+ var/datum/chatmessage/m = msg
+ animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME)
+ combined_height += m.approx_lines
+ var/sched_remaining = m.scheduled_destruction - world.time
+ if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME)
+ var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height)
+ m.scheduled_destruction = world.time + remaining_time
+ addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE)
+
+ // Build message image
+ message = image(loc = message_loc, layer = CHAT_LAYER)
+ message.plane = GAME_PLANE
+ message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART
+ message.alpha = 0
+ message.pixel_y = owner.bound_height * 0.95
+ message.maptext_width = CHAT_MESSAGE_WIDTH
+ message.maptext_height = mheight
+ message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5
+ message.maptext = complete_text
+
+ // View the message
+ LAZYADDASSOC(owned_by.seen_messages, message_loc, src)
+ owned_by.images |= message
+ animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME)
+
+ // Prepare for destruction
+ scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE)
+ addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE)
+
+/**
+ * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
+ */
+/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE)
+ animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL)
+ QDEL_IN(src, fadetime)
+
+/**
+ * Creates a message overlay at a defined location for a given speaker
+ *
+ * Arguments:
+ * * speaker - The atom who is saying this message
+ * * message_language - The language that the message is said in
+ * * raw_message - The text content of the message
+ * * spans - Additional classes to be added to the message
+ * * message_mode - Bitflags relating to the mode of the message
+ */
+/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, message_mode)
+ // Ensure the list we are using, if present, is a copy so we don't modify the list provided to us
+ spans = spans?.Copy()
+
+ // Check for virtual speakers (aka hearing a message through a radio)
+ var/atom/movable/originalSpeaker = speaker
+ if (istype(speaker, /atom/movable/virtualspeaker))
+ var/atom/movable/virtualspeaker/v = speaker
+ speaker = v.source
+ spans |= "virtual-speaker"
+
+ // Ignore virtual speaker (most often radio messages) from ourself
+ if (originalSpeaker != src && speaker == src)
+ return
+
+ // Display visual above source
+ new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans)
+
+
+// Tweak these defines to change the available color ranges
+#define CM_COLOR_SAT_MIN 0.6
+#define CM_COLOR_SAT_MAX 0.7
+#define CM_COLOR_LUM_MIN 0.65
+#define CM_COLOR_LUM_MAX 0.75
+
+/**
+ * Gets a color for a name, will return the same color for a given string consistently within a round.atom
+ *
+ * Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map.
+ *
+ * Arguments:
+ * * name - The name to generate a color for
+ * * sat_shift - A value between 0 and 1 that will be multiplied against the saturation
+ * * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence
+ */
+/datum/chatmessage/proc/colorize_string(name, sat_shift = 1, lum_shift = 1)
+ // seed to help randomness
+ var/static/rseed = rand(1,26)
+
+ // get hsl using the selected 6 characters of the md5 hash
+ var/hash = copytext(md5(name + GLOB.round_id), rseed, rseed + 6)
+ var/h = hex2num(copytext(hash, 1, 3)) * (360 / 255)
+ var/s = (hex2num(copytext(hash, 3, 5)) >> 2) * ((CM_COLOR_SAT_MAX - CM_COLOR_SAT_MIN) / 63) + CM_COLOR_SAT_MIN
+ var/l = (hex2num(copytext(hash, 5, 7)) >> 2) * ((CM_COLOR_LUM_MAX - CM_COLOR_LUM_MIN) / 63) + CM_COLOR_LUM_MIN
+
+ // adjust for shifts
+ s *= clamp(sat_shift, 0, 1)
+ l *= clamp(lum_shift, 0, 1)
+
+ // convert to rgb
+ var/h_int = round(h/60) // mapping each section of H to 60 degree sections
+ var/c = (1 - abs(2 * l - 1)) * s
+ var/x = c * (1 - abs((h / 60) % 2 - 1))
+ var/m = l - c * 0.5
+ x = (x + m) * 255
+ c = (c + m) * 255
+ m *= 255
+ switch(h_int)
+ if(0)
+ return "#[num2hex(c, 2)][num2hex(x, 2)][num2hex(m, 2)]"
+ if(1)
+ return "#[num2hex(x, 2)][num2hex(c, 2)][num2hex(m, 2)]"
+ if(2)
+ return "#[num2hex(m, 2)][num2hex(c, 2)][num2hex(x, 2)]"
+ if(3)
+ return "#[num2hex(m, 2)][num2hex(x, 2)][num2hex(c, 2)]"
+ if(4)
+ return "#[num2hex(x, 2)][num2hex(m, 2)][num2hex(c, 2)]"
+ if(5)
+ return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]"
diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm
index 14ab751d2b..49d7a8dfea 100644
--- a/code/datums/components/crafting/recipes/recipes_misc.dm
+++ b/code/datums/components/crafting/recipes/recipes_misc.dm
@@ -413,15 +413,6 @@
subcategory = CAT_MISCELLANEOUS
category = CAT_MISC
-/datum/crafting_recipe/paperwork
- name = "Filed Paper Work"
- result = /obj/item/folder/paperwork_correct
- time = 10 //Takes time for people to file and complete paper work!
- tools = list(/obj/item/pen)
- reqs = list(/obj/item/folder/paperwork = 1)
- subcategory = CAT_MISCELLANEOUS
- category = CAT_MISC
-
/datum/crafting_recipe/coconut_bong
name = "Coconut Bong"
result = /obj/item/bong/coconut
diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm
index de4425e208..56b41533f5 100644
--- a/code/datums/components/mirage_border.dm
+++ b/code/datums/components/mirage_border.dm
@@ -39,4 +39,5 @@
/obj/effect/abstract/mirage_holder
name = "Mirage holder"
anchored = TRUE
+ plane = PLANE_SPACE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 00bb392787..651acda6e1 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -20,6 +20,8 @@
var/ride_check_ridden_incapacitated = FALSE
var/list/offhands = list() // keyed list containing all the current riding offsets associated by mob
+ var/del_on_unbuckle_all = FALSE
+
/datum/component/riding/Initialize()
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
@@ -28,8 +30,11 @@
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved)
/datum/component/riding/proc/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE)
+ var/atom/movable/AM = parent
restore_position(M)
unequip_buckle_inhands(M)
+ if(del_on_unbuckle_all && !AM.has_buckled_mobs())
+ qdel(src)
/datum/component/riding/proc/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
handle_vehicle_offsets()
@@ -194,6 +199,7 @@
///////Yes, I said humans. No, this won't end well...//////////
/datum/component/riding/human
+ del_on_unbuckle_all = TRUE
var/fireman_carrying = FALSE
/datum/component/riding/human/Initialize()
@@ -261,6 +267,7 @@
user.visible_message("[AM] pushes [user] off of [AM.p_them()]!")
/datum/component/riding/cyborg
+ del_on_unbuckle_all = TRUE
/datum/component/riding/cyborg/Initialize()
. = ..()
diff --git a/code/datums/elements/dusts_on_leaving_area.dm b/code/datums/elements/dusts_on_leaving_area.dm
index 9527e1fd3a..7b1807a15c 100644
--- a/code/datums/elements/dusts_on_leaving_area.dm
+++ b/code/datums/elements/dusts_on_leaving_area.dm
@@ -1,28 +1,20 @@
/datum/element/dusts_on_leaving_area
element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
id_arg_index = 2
- var/list/attached_mobs = list()
var/list/area_types = list()
/datum/element/dusts_on_leaving_area/Attach(datum/target,types)
. = ..()
if(!ismob(target))
return ELEMENT_INCOMPATIBLE
- attached_mobs += target
area_types = types
- START_PROCESSING(SSprocessing,src)
+ RegisterSignal(target,COMSIG_ENTER_AREA,.proc/check_dust)
/datum/element/dusts_on_leaving_area/Detach(mob/M)
. = ..()
- if(M in attached_mobs)
- attached_mobs -= M
- if(!attached_mobs.len)
- STOP_PROCESSING(SSprocessing,src)
+ UnregisterSignal(M,COMSIG_ENTER_AREA)
-/datum/element/dusts_on_leaving_area/process()
- for(var/m in attached_mobs)
- var/mob/M = m
- var/area/A = get_area(M)
- if(!(A.type in area_types))
- M.dust(force = TRUE)
- Detach(M)
+/datum/element/dusts_on_leaving_area/proc/check_dust(datum/source, area/A)
+ var/mob/M = source
+ if(istype(M) && !(A.type in area_types))
+ M.dust(force = TRUE)
diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm
index a5c6e2725d..d770e0f30d 100644
--- a/code/datums/elements/mob_holder.dm
+++ b/code/datums/elements/mob_holder.dm
@@ -164,7 +164,7 @@
release()
/obj/item/clothing/head/mob_holder/mob_can_equip(mob/living/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
- if(!ishuman(M)) //monkeys holding monkeys holding monkeys...
+ if(M == held_mob || !ishuman(M)) //monkeys holding monkeys holding monkeys...
return FALSE
return ..()
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 0a44954e51..6e4b1a6305 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -23,14 +23,14 @@
mappath = "[prefix][shuttle_id].dmm"
. = ..()
-/datum/map_template/shuttle/preload_size(path, cache)
+/datum/map_template/shuttle/preload_size(path = mappath, force_cache = FALSE)
. = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map
if(!cached_map)
return
discover_port_offset()
- if(!cache)
+ if(!cached_map)
cached_map = null
/datum/map_template/shuttle/proc/discover_port_offset()
@@ -53,12 +53,11 @@
++xcrd
--ycrd
-/datum/map_template/shuttle/load(turf/T, centered, register=TRUE)
+/datum/map_template/shuttle/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, register = TRUE)
. = ..()
if(!.)
return
- var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]),
- locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ]))
+ var/list/turfs = get_last_loaded_turf_block()
for(var/i in 1 to turfs.len)
var/turf/place = turfs[i]
if(istype(place, /turf/open/space)) // This assumes all shuttles are loaded in a single spot then moved to their real destination.
diff --git a/code/datums/skills/_skill_holder.dm b/code/datums/skills/_skill_holder.dm
index 352adc46ff..e16804ab7f 100644
--- a/code/datums/skills/_skill_holder.dm
+++ b/code/datums/skills/_skill_holder.dm
@@ -15,7 +15,7 @@
CRASH("Invalid get_skill_value call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
if(!skills)
return null
- return skills[skill]
+ return LAZYACCESS(skills, skill)
/**
* Grabs our affinity for a skill. !!This is a multiplier!!
@@ -25,7 +25,7 @@
CRASH("Invalid get_skill_affinity call. Use typepaths.") //until a time when we somehow need text ids for dynamic skills, I'm enforcing this.
if(!skills)
return 1
- var/affinity = skill_affinities[skill]
+ var/affinity = LAZYACCESS(skill_affinities, skill)
if(isnull(affinity))
return 1
return affinity
@@ -39,7 +39,7 @@
LAZYINITLIST(skills)
value = sanitize_skill_value(skill, value)
if(!isnull(value))
- skills[skill] = value
+ LAZYSET(skills, skill, value)
return TRUE
return FALSE
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 86afd2cc15..e080e597a3 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -550,3 +550,30 @@
else if(isanimal(L))
var/mob/living/simple_animal/SM = L
SM.adjustHealth(-3.5, forced = TRUE)
+
+/obj/screen/alert/status_effect/regenerative_core
+ name = "Reinforcing Tendrils"
+ desc = "You can move faster than your broken body could normally handle!"
+ icon_state = "regenerative_core"
+ name = "Regenerative Core Tendrils"
+
+/datum/status_effect/regenerative_core
+ id = "Regenerative Core"
+ duration = 1 MINUTES
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /obj/screen/alert/status_effect/regenerative_core
+
+/datum/status_effect/regenerative_core/on_apply()
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core")
+ owner.adjustBruteLoss(-25)
+ if(!AmBloodsucker(owner)) //use your coffin you lazy bastard
+ owner.adjustFireLoss(-25)
+ owner.remove_CC()
+ owner.bodytemperature = BODYTEMP_NORMAL
+ return TRUE
+
+/datum/status_effect/regenerative_core/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core")
+ owner.updatehealth()
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index b71f51bd07..dbb6864028 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -50,6 +50,13 @@
var/list/blood_DNA
var/list/suit_fibers
+ /// Last name used to calculate a color for the chatmessage overlays
+ var/chat_color_name
+ /// Last color calculated for the the chatmessage overlays
+ var/chat_color
+ /// A luminescence-shifted value of the last color calculated for chatmessage overlays
+ var/chat_color_darkened
+
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -965,7 +972,7 @@ Proc for attack log creation, because really why not
for(var/x in materials)
var/datum/material/custom_material = SSmaterials.GetMaterialRef(x)
- if(!(material_flags & MATERIAL_NO_EFFECTS))
+ if(material_flags & MATERIAL_EFFECTS)
custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags)
custom_materials[custom_material] += materials[x] * multiplier
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b86c7e9729..32dde45195 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -25,6 +25,7 @@
var/inertia_move_delay = 5
var/pass_flags = 0
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
+ var/atom/movable/moving_from_pull //attempt to resume grab after moving instead of before.
var/list/client_mobs_in_contents // This contains all the client mobs within this container
var/list/acted_explosions //for explosion dodging
glide_size = 8
@@ -207,6 +208,7 @@
if(!Process_Spacemove(get_dir(pulling.loc, A)))
return
step(pulling, get_dir(pulling.loc, A))
+ return TRUE
/atom/movable/proc/check_pulling()
if(pulling)
@@ -224,6 +226,8 @@
if(pulling.anchored || pulling.move_resist > move_force)
stop_pulling()
return
+ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
+ pulledby.stop_pulling()
/atom/movable/Destroy(force)
QDEL_NULL(proximity_monitor)
diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm
index 3f86f23546..68db17f076 100644
--- a/code/game/atoms_movement.dm
+++ b/code/game/atoms_movement.dm
@@ -54,13 +54,8 @@
/atom/movable/Move(atom/newloc, direct)
var/atom/movable/pullee = pulling
var/turf/T = loc
- if(pulling)
- if(pullee && get_dist(src, pullee) > 1)
- stop_pulling()
-
- if(pullee && pullee.loc != loc && !isturf(pullee.loc) ) //to be removed once all code that changes an object's loc uses forceMove().
- log_game("DEBUG:[src]'s pull on [pullee] wasn't broken despite [pullee] being in [pullee.loc]. Pull stopped manually.")
- stop_pulling()
+ if(!moving_from_pull)
+ check_pulling()
if(!loc || !newloc)
return FALSE
var/atom/oldloc = loc
@@ -133,19 +128,16 @@
if(has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s)
return FALSE
- if(pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move.
+ if(pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move.
if(pulling.anchored)
stop_pulling()
else
var/pull_dir = get_dir(src, pulling)
//puller and pullee more than one tile away or in diagonal position
if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir)))
+ pulling.moving_from_pull = src
pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
- if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up
- stop_pulling()
- if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
- pulledby.stop_pulling()
-
+ pulling.moving_from_pull = null
Moved(oldloc, direct)
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index edb31e9dbd..33560dbb8b 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -17,7 +17,6 @@
var/list/L = list()
var/list/LL = list()
var/hacked = FALSE
- var/hackable = TRUE
var/disabled = 0
var/shocked = FALSE
var/hack_wire
@@ -32,7 +31,7 @@
var/selected_category
var/screen = 1
- var/datum/techweb/stored_research = /datum/techweb/specialized/autounlocking/autolathe
+ var/datum/techweb/specialized/autounlocking/stored_research = /datum/techweb/specialized/autounlocking/autolathe
var/list/categories = list(
"Tools",
"Electronics",
@@ -62,6 +61,9 @@
/datum/material/mythril
)
+ /// Base print speed
+ var/base_print_speed = 10
+
/obj/machinery/autolathe/Initialize()
AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert))
. = ..()
@@ -206,7 +208,7 @@
busy = TRUE
use_power(power)
icon_state = "autolathe_n"
- var/time = is_stack ? 32 : 32*coeff*multiplier
+ var/time = is_stack ? 10 : base_print_speed * coeff * multiplier
addtimer(CALLBACK(src, .proc/make_item, power, materials_used, custom_materials, multiplier, coeff, is_stack), time)
else
to_chat(usr, "Not enough materials for this operation.")
@@ -254,10 +256,12 @@
T += MB.rating*75000
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.max_amount = T
- T=1.2
+ var/manips = 0
+ var/total_manip_rating = 0
for(var/obj/item/stock_parts/manipulator/M in component_parts)
- T -= M.rating*0.2
- prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
+ total_manip_rating += M.rating
+ manips++
+ prod_coeff = STANDARD_PART_LEVEL_LATHE_COEFFICIENT(total_manip_rating / (manips? manips : 1))
/obj/machinery/autolathe/examine(mob/user)
. += ..()
@@ -420,11 +424,11 @@
/obj/machinery/autolathe/proc/adjust_hacked(state)
hacked = state
- if(!hackable && hacked)
- return
for(var/id in SSresearch.techweb_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(id)
- if((D.build_type & AUTOLATHE) && ("hacked" in D.category))
+ if(D.build_type & stored_research.design_autounlock_skip_types)
+ continue
+ if((D.build_type & stored_research.design_autounlock_buildtypes) && ("hacked" in D.category))
if(hacked)
stored_research.add_design(D)
else
@@ -436,10 +440,10 @@
/obj/machinery/autolathe/secure
name = "secured autolathe"
- desc = "An autolathe reprogrammed with security protocols to prevent hacking."
- hackable = FALSE
+ desc = "It produces items using metal and glass. This model was reprogrammed without some of the more hazardous designs."
circuit = /obj/item/circuitboard/machine/autolathe/secure
stored_research = /datum/techweb/specialized/autounlocking/autolathe/public
+ base_print_speed = 20
/obj/machinery/autolathe/toy
name = "autoylathe"
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 24fd956677..c26c66a55f 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -53,6 +53,11 @@
using_power = FALSE
update_icon()
+/obj/machinery/recharger/Exited(atom/movable/M, atom/newloc)
+ . = ..()
+ if(charging == M)
+ setCharging()
+
/obj/machinery/recharger/attackby(obj/item/G, mob/user, params)
if(istype(G, /obj/item/wrench))
if(charging)
@@ -111,13 +116,11 @@
charging.update_icon()
charging.forceMove(drop_location())
user.put_in_hands(charging)
- setCharging(null)
/obj/machinery/recharger/attack_tk(mob/user)
if(charging)
charging.update_icon()
charging.forceMove(drop_location())
- setCharging(null)
/obj/machinery/recharger/process()
if(stat & (NOPOWER|BROKEN) || !anchored)
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 7ff8696084..4a4d58ea73 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -530,7 +530,6 @@
equip_cooldown = 0
var/obj/item/gun/medbeam/mech/medigun
custom_materials = list(/datum/material/iron = 15000, /datum/material/glass = 8000, /datum/material/plasma = 3000, /datum/material/gold = 8000, /datum/material/diamond = 2000)
- material_flags = MATERIAL_NO_EFFECTS
/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize()
. = ..()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index fb321665bc..93228c7fee 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -188,7 +188,6 @@
var/location = get_step(src,(dir))
var/obj/item/I = new D.build_path(location)
- I.material_flags |= MATERIAL_NO_EFFECTS //Find a better way to do this.
I.set_custom_materials(res_coef)
say("\The [I] is complete.")
being_built = null
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 0e14af75a9..bacb8c6669 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -55,8 +55,12 @@
M.buckling = null
return FALSE
- if(M.pulledby && buckle_prevents_pull)
- M.pulledby.stop_pulling()
+ if(M.pulledby)
+ if(buckle_prevents_pull)
+ M.pulledby.stop_pulling()
+ else if(isliving(M.pulledby))
+ var/mob/living/L = M.pulledby
+ L.reset_pull_offsets(M, TRUE)
if(!check_loc && M.loc != loc)
M.forceMove(loc)
@@ -137,4 +141,7 @@
"You unbuckle yourself from [src].",\
"You hear metal clanking.")
add_fingerprint(user)
+ if(isliving(M.pulledby))
+ var/mob/living/L = M.pulledby
+ L.set_pull_offsets(M, L.grab_state)
return M
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index f066430c13..992e9c84a7 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -497,7 +497,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
if(!template)
return FALSE
testing("Room \"[template_name]\" placed at ([T.x], [T.y], [T.z])")
- template.load(T, centered = FALSE)
+ template.load(T, centered = FALSE, orientation = dir, rotate_placement_to_orientation = TRUE)
template.loaded++
GLOB.stationroom_landmarks -= src
qdel(src)
@@ -509,7 +509,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
templates = list("Engine SM" = 3, "Engine Singulo" = 3, "Engine Tesla" = 3)
icon = 'icons/rooms/box/engine.dmi'
-
/obj/effect/landmark/stationroom/box/engine/New()
. = ..()
templates = CONFIG_GET(keyed_list/box_random_engine)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index c8e5b15f72..63e73625e6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -898,11 +898,3 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
. = ..()
if(var_name == NAMEOF(src, slowdown))
set_slowdown(var_value) //don't care if it's a duplicate edit as slowdown'll be set, do it anyways to force normal behavior.
-
-//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/item/proc/autolathe_crafted(obj/machinery/autolathe/A)
- return
-
-/obj/item/proc/rnd_crafted(obj/machinery/rnd/production/P)
- return
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 63092b5a13..4d0ed362fc 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -68,10 +68,9 @@
update_icon()
/obj/item/multitool/update_icon_state()
+ icon_state = initial(icon_state)
if(selected_io)
- icon_state = "multitool_red"
- else
- icon_state = "multitool"
+ icon_state += "_red"
/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
if(!io.holder.assembly)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 011837d48b..c2db529675 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -648,7 +648,7 @@
item_state = "mace_greyscale"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS //Material type changes the prefix as well as the color.
custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
slot_flags = ITEM_SLOT_BELT
force = 14
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index c6bb350929..c4bb8c594c 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -123,11 +123,3 @@
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("skubbed")
-/obj/item/supermatterspray
- name = "supermatter spray"
- desc = "A spray bottle containing some kind of magical spray to fix the SM. \"Do not inhale.\" is written on the side. Unless aimed at the supermatter, it does nothing."
- icon = 'icons/obj/supermatter.dmi'
- icon_state = "supermatterspray"
- w_class = WEIGHT_CLASS_SMALL
- var/usesleft = 2
-
diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm
index bdf9ab4270..cd65149f5d 100644
--- a/code/game/objects/items/paint.dm
+++ b/code/game/objects/items/paint.dm
@@ -112,7 +112,7 @@
. = ..()
if(!proximity)
return
- if(!isturf(target) || !isobj(target))
+ if(!isturf(target) && !isobj(target))
return
if(target.color != initial(target.color))
target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index f7bf659f0a..fc7b196bd2 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -107,6 +107,8 @@
return TRUE
/obj/item/shield/proc/user_shieldbash(mob/living/user, atom/target, harmful)
+ if(!(user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE)) //Combat mode has to be enabled for shield bashing
+ return FALSE
if(!(shield_flags & SHIELD_CAN_BASH))
to_chat(user, "[src] can't be used to shield bash!")
return FALSE
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index c8ee6b05c7..fa218c5caa 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -109,7 +109,6 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
merge_type = /obj/item/stack/sheet/plasmaglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
tableVariant = /obj/structure/table/plasmaglass
- material_flags = MATERIAL_NO_EFFECTS
shard_type = /obj/item/shard/plasma
/obj/item/stack/sheet/plasmaglass/fifty
@@ -209,7 +208,6 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5,)
armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
resistance_flags = ACID_PROOF
- material_flags = MATERIAL_NO_EFFECTS
merge_type = /obj/item/stack/sheet/plasmarglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10)
point_value = 23
@@ -259,7 +257,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
item_state = "sheet-plastitaniumglass"
custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- material_flags = MATERIAL_NO_EFFECTS
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plastitaniumglass
shard_type = /obj/item/shard
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 4a7156db72..d28ae52b52 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -324,7 +324,6 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT)
point_value = 45
merge_type = /obj/item/stack/sheet/mineral/plastitanium
- material_flags = MATERIAL_NO_EFFECTS
/obj/item/stack/sheet/mineral/plastitanium/fifty
amount = 50
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 6ddd7c136a..f19dbb2a6b 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -215,7 +215,6 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20)
point_value = 23
tableVariant = /obj/structure/table/reinforced
- material_flags = MATERIAL_NO_EFFECTS
/obj/item/stack/sheet/plasteel/get_main_recipes()
. = ..()
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index 50edc9d15a..1bcd8d72ca 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -78,4 +78,3 @@
turf_type = /turf/open/floor/mineral/plastitanium
mineralType = "plastitanium"
custom_materials = list(/datum/material/titanium=250, /datum/material/plasma=250)
- material_flags = MATERIAL_NO_EFFECTS
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 5acbb2f231..199f0c51e2 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -315,3 +315,11 @@
current_skin = choice
icon_state = unique_reskin[choice]
to_chat(M, "[src] is now skinned as '[choice]'.")
+
+//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)
+ return
+
+/obj/proc/rnd_crafted(obj/machinery/rnd/production/P)
+ return
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index c593451c24..d3e8ecf0a6 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -153,7 +153,7 @@
///Material chair
/obj/structure/chair/greyscale
icon_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
item_chair = /obj/item/chair/greyscale
buildstacktype = null //Custom mats handle this
@@ -382,7 +382,7 @@
/obj/item/chair/greyscale
icon_state = "chair_greyscale_toppled"
item_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
origin_type = /obj/structure/chair/greyscale
/obj/item/chair/stool
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index 2244742f3a..ad128b01c2 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -38,7 +38,4 @@
user.show_message("You weave \the [S.name] into a workable fabric.", MSG_VISUAL)
return TRUE
-/obj/structure/loom/unanchored
- anchored = FALSE
-
#undef FABRIC_PER_SHEET
\ No newline at end of file
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index bbdf6925f9..30e451aa14 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -211,7 +211,7 @@
/obj/structure/table/greyscale
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
icon_state = "table"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_EFFECTS
buildstack = null //No buildstack, so generate from mat datums
/*
diff --git a/code/game/say.dm b/code/game/say.dm
index 85ae9f0681..5fa5a2b35d 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -96,21 +96,26 @@ GLOBAL_LIST_INIT(freqtospan, list(
return "[say_mod(input, message_mode)][spanned ? ", \"[spanned]\"" : ""]"
// Citadel edit [spanned ? ", \"[spanned]\"" : ""]"
-/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode)
+/// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when?
+/atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode)
+ var/pos = findtext(input, "*")
+ return pos? copytext(input, pos + 1) : input
+
+/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, message_mode, no_quote = FALSE)
if(has_language(language))
var/atom/movable/AM = speaker.GetSource()
if(AM) //Basically means "if the speaker is virtual"
- return AM.say_quote(raw_message, spans, message_mode)
+ return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode)
else
- return speaker.say_quote(raw_message, spans, message_mode)
+ return no_quote ? speaker.quoteless_say_quote(raw_message, spans, message_mode) : speaker.say_quote(raw_message, spans, message_mode)
else if(language)
var/atom/movable/AM = speaker.GetSource()
var/datum/language/D = GLOB.language_datum_instances[language]
raw_message = D.scramble(raw_message)
if(AM)
- return AM.say_quote(raw_message, spans, message_mode)
+ return no_quote ? AM.quoteless_say_quote(raw_message, spans, message_mode) : AM.say_quote(raw_message, spans, message_mode)
else
- return speaker.say_quote(raw_message, spans, message_mode)
+ return no_quote ? speaker.quoteless_say_quote(raw_message, spans, message_mode) : speaker.say_quote(raw_message, spans, message_mode)
else
return "makes a strange sound."
diff --git a/code/game/world.dm b/code/game/world.dm
index 1d719ee138..10431e4af9 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -8,6 +8,9 @@ GLOBAL_LIST(topic_status_cache)
//This happens after the Master subsystem new(s) (it's a global datum)
//So subsystems globals exist, but are not initialised
/world/New()
+ var/extools = world.GetConfig("env", "EXTOOLS_DLL") || "./byond-extools.dll"
+ if (fexists(extools))
+ call(extools, "maptick_initialize")()
enable_debugger()
world.Profile(PROFILE_START)
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 14906bc83a..26736ddff1 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -764,7 +764,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
for(var/arg in arguments)
new_args[++new_args.len] = SDQL_expression(source, arg)
if(object == GLOB) // Global proc.
- procname = "/proc/[procname]"
return superuser? (call(procname)(new_args)) : (WrapAdminProcCall(GLOBAL_PROC, procname, new_args))
return superuser? (call(object, procname)(new_args)) : (WrapAdminProcCall(object, procname, new_args))
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index d71cdca991..e89c3ad5a6 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -18,9 +18,12 @@
var/image/item = image('icons/turf/overlays.dmi',S,"greenOverlay")
item.plane = ABOVE_LIGHTING_PLANE
preview += item
+ var/list/orientations = list("South" = SOUTH, "North" = NORTH, "East" = EAST, "West" = WEST)
+ var/choice = input(src, "Which orientation? Maps are normally facing SOUTH.", "Template Orientation", "South") as null|anything in orientations
+ var/orientation = orientations[choice]
images += preview
if(alert(src,"Confirm location.","Template Confirm","Yes","No") == "Yes")
- if(template.load(T, centered = TRUE))
+ if(template.load(T, centered = TRUE, orientation = orientation))
message_admins("[key_name_admin(src)] has placed a map template ([template.name]) at [ADMIN_COORDJMP(T)]")
else
to_chat(src, "Failed to place map")
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index a20a9cef85..e876beb5dc 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -128,6 +128,9 @@ the new instance inside the host to be updated to the template's stats.
link = FOLLOW_LINK(src, to_follow)
else
link = ""
+ // Create map text prior to modifying message for goonchat
+ if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
+ create_chat_message(speaker, message_language, raw_message, spans, message_mode)
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)
to_chat(src, "[link] [message]")
diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm
index 069795cfb8..1c6412dcad 100644
--- a/code/modules/antagonists/slaughter/slaughterevent.dm
+++ b/code/modules/antagonists/slaughter/slaughterevent.dm
@@ -27,6 +27,9 @@
for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
spawn_locs += L.loc
+ for(var/obj/effect/landmark/loneopspawn/L in GLOB.landmarks_list)
+ if(isturf(L.loc))
+ spawn_locs += L.loc
if(!spawn_locs)
message_admins("No valid spawn locations found, aborting...")
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index c47c4a44af..06d73867f8 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -9,7 +9,7 @@
return
-/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh)
+/turf/open/hotspot_expose(exposed_temperature, exposed_volume, soh = FALSE, holo = FALSE)
var/datum/gas_mixture/air_contents = return_air()
if(!air_contents)
return 0
@@ -35,7 +35,7 @@
if(oxy < 0.5)
return 0
- active_hotspot = new /obj/effect/hotspot(src)
+ active_hotspot = new /obj/effect/hotspot(src, holo)
active_hotspot.temperature = exposed_temperature*50
active_hotspot.volume = exposed_volume*25
@@ -67,8 +67,10 @@
var/bypassing = FALSE
var/visual_update_tick = 0
-/obj/effect/hotspot/Initialize()
+/obj/effect/hotspot/Initialize(mapload, holo = FALSE)
. = ..()
+ if(holo)
+ flags_1 |= HOLOGRAM_1
SSair.hotspots += src
perform_exposure()
setDir(pick(GLOB.cardinals))
@@ -192,7 +194,8 @@
if(bypassing)
icon_state = "3"
- location.burn_tile()
+ if(!(flags_1 & HOLOGRAM_1))
+ location.burn_tile()
//Possible spread due to radiated heat
if(location.air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_SPREAD)
@@ -200,7 +203,7 @@
for(var/t in location.atmos_adjacent_turfs)
var/turf/open/T = t
if(!T.active_hotspot)
- T.hotspot_expose(radiated_temperature, CELL_VOLUME/4)
+ T.hotspot_expose(radiated_temperature, CELL_VOLUME/4, flags_1 & HOLOGRAM_1)
else
if(volume > CELL_VOLUME*0.4)
@@ -224,7 +227,8 @@
var/turf/open/T = loc
if(istype(T) && T.active_hotspot == src)
T.active_hotspot = null
- DestroyTurf()
+ if(!(flags_1 & HOLOGRAM_1))
+ DestroyTurf()
return ..()
/obj/effect/hotspot/proc/DestroyTurf()
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 864edfdbe6..8f5ab7dd5e 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -64,6 +64,7 @@
nullifyNode(i)
SSair.atmos_machinery -= src
+ SSair.pipenets_needing_rebuilt -= src
dropContents()
if(pipe_vision_img)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 73cb8eeecb..c164dc5ae3 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -116,7 +116,7 @@
if(node2)
node2.atmosinit()
node2.addMember(src)
- build_network()
+ SSair.add_to_rebuild_queue(src)
return TRUE
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 63a03b1d40..a45728d51f 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -144,7 +144,7 @@
var/datum/pipeline/parent = parents[i]
if(!parent)
stack_trace("Component is missing a pipenet! Rebuilding...")
- build_network()
+ SSair.add_to_rebuild_queue(src)
parent.update = 1
/obj/machinery/atmospherics/components/returnPipenets()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index e013a86fd2..38042fe64d 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -447,6 +447,6 @@
if(node)
node.atmosinit()
node.addMember(src)
- build_network()
+ SSair.add_to_rebuild_queue(src)
#undef CRYOMOBS
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index dbe3c0b90b..dddfdf08c1 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -116,7 +116,7 @@
if(node)
node.atmosinit()
node.addMember(src)
- build_network()
+ SSair.add_to_rebuild_queue(src)
return TRUE
/obj/machinery/atmospherics/components/unary/thermomachine/ui_status(mob/user)
diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
index 33092f5354..bc8fd6777d 100644
--- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm
@@ -31,7 +31,7 @@
nodes = list()
for(var/obj/machinery/atmospherics/A in needs_nullifying)
A.disconnect(src)
- A.build_network()
+ SSair.add_to_rebuild_queue(A)
/obj/machinery/atmospherics/pipe/layer_manifold/proc/get_all_connected_nodes()
return front_nodes + back_nodes + nodes
diff --git a/code/modules/atmospherics/machinery/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm
index 77452fd6fd..aa8ee65bd8 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold.dm
@@ -28,6 +28,8 @@
/obj/machinery/atmospherics/pipe/manifold/update_icon()
cut_overlays()
+ if(!center)
+ center = mutable_appearance(icon, "manifold_center")
PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer)
add_overlay(center)
diff --git a/code/modules/atmospherics/machinery/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
index 1bcca8d5ae..56c0408d18 100644
--- a/code/modules/atmospherics/machinery/pipes/manifold4w.dm
+++ b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
@@ -26,6 +26,8 @@
/obj/machinery/atmospherics/pipe/manifold4w/update_icon()
cut_overlays()
+ if(!center)
+ center = mutable_appearance(icon, "manifold_center")
PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer)
add_overlay(center)
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 1e513b846c..c466a422b2 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -22,7 +22,7 @@
var/obj/machinery/atmospherics/oldN = nodes[i]
..()
if(oldN)
- oldN.build_network()
+ SSair.add_to_rebuild_queue(oldN)
/obj/machinery/atmospherics/pipe/destroy_network()
QDEL_NULL(parent)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index a41bdee3b6..03463ff0f7 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -159,7 +159,6 @@
/obj/machinery/portable_atmospherics/canister/proto
name = "prototype canister"
-
/obj/machinery/portable_atmospherics/canister/proto/default
name = "prototype canister"
desc = "The best way to fix an atmospheric emergency... or the best way to introduce one."
@@ -172,7 +171,6 @@
can_min_release_pressure = (ONE_ATMOSPHERE / 30)
prototype = TRUE
-
/obj/machinery/portable_atmospherics/canister/proto/default/oxygen
name = "prototype canister"
desc = "A prototype canister for a prototype bike, what could go wrong?"
@@ -181,8 +179,6 @@
filled = 1
release_pressure = ONE_ATMOSPHERE*2
-
-
/obj/machinery/portable_atmospherics/canister/New(loc, datum/gas_mixture/existing_mixture)
..()
if(existing_mixture)
@@ -192,7 +188,7 @@
pump = new(src, FALSE)
pump.on = TRUE
pump.stat = 0
- pump.build_network()
+ SSair.add_to_rebuild_queue(pump)
update_icon()
@@ -208,6 +204,7 @@
air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
if(starter_temp)
air_contents.temperature = starter_temp
+
/obj/machinery/portable_atmospherics/canister/air/create_gas()
air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
index 18e4da621a..377e9285e3 100644
--- a/code/modules/atmospherics/machinery/portable/pump.dm
+++ b/code/modules/atmospherics/machinery/portable/pump.dm
@@ -20,7 +20,7 @@
pump = new(src, FALSE)
pump.on = TRUE
pump.stat = 0
- pump.build_network()
+ SSair.add_to_rebuild_queue(pump)
/obj/machinery/portable_atmospherics/pump/Destroy()
var/turf/T = get_turf(src)
diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm
index 60515781f9..d59ef1093f 100644
--- a/code/modules/cargo/exports/manifest.dm
+++ b/code/modules/cargo/exports/manifest.dm
@@ -76,19 +76,3 @@
/datum/export/manifest_correct_denied/get_cost(obj/O)
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
return ..() - M.order_cost
-
-// Paper work done correctly
-
-/datum/export/paperwork_correct
- cost = 120 // finicky number 20 x 120 = 2400 per crate
- k_elasticity = 0
- unit_name = "correct paperwork"
- export_types = list(/obj/item/folder/paperwork_correct)
-
-// Paper work not done retruned
-
-/datum/export/paperwork_incorrect
- cost = -500 // Failed to meet NT standers
- k_elasticity = 0
- unit_name = "returned incorrect paperwork"
- export_types = list(/obj/item/folder/paperwork)
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
index b78f218348..13e223bca3 100644
--- a/code/modules/cargo/order.dm
+++ b/code/modules/cargo/order.dm
@@ -66,12 +66,9 @@
P.info += "Item: [pack.name]
"
P.info += "Contents:
"
P.info += "