diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index be52f6a67f46..77df46175bc6 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -606,7 +606,7 @@
/area/ruin/beach/complex)
"kK" = (
/obj/structure/closet/crate/bin,
-/obj/item/reagent_containers/food/snacks/breadslice/moldy,
+/obj/item/food/breadslice/moldy,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/concrete/slab_4,
/area/ruin/beach/complex)
diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
index 6e70a81ace49..997f6bb56703 100644
--- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm
@@ -240,7 +240,7 @@
},
/obj/structure/table/wood/reinforced,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/reagent_containers/food/snacks/breadslice/moldy{
+/obj/item/food/breadslice/moldy{
pixel_x = 3;
pixel_y = 6
},
@@ -393,7 +393,7 @@
pixel_x = 9;
pixel_y = -1
},
-/obj/item/gun/ballistic/automatic/assault/p16/minutemen{
+/obj/item/gun/ballistic/automatic/assault/cm82{
pixel_y = 7;
pixel_x = -9
},
diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
index 781ae59a84f4..dec4c65755f9 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
@@ -1762,7 +1762,7 @@
/turf/open/floor/plasteel/tech,
/area/ruin/jungle/cavecrew/security)
"vr" = (
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/turf/open/floor/plasteel/patterned,
/area/ruin/jungle/cavecrew/cargo)
"vH" = (
diff --git a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
index 9457e639c5ce..86e2ac4e5477 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
@@ -5381,7 +5381,7 @@
"Ih" = (
/obj/structure/table/wood,
/obj/machinery/light/directional/south,
-/obj/item/reagent_containers/food/snacks/breadslice/moldy{
+/obj/item/food/breadslice/moldy{
pixel_x = -8
},
/obj/item/reagent_containers/food/snacks/grown/berries/poison{
@@ -7509,7 +7509,7 @@
},
/obj/effect/mob_spawn/human/corpse/nanotrasensoldier,
/obj/effect/decal/cleanable/vomit/old,
-/obj/item/reagent_containers/food/snacks/breadslice/moldy{
+/obj/item/food/breadslice/moldy{
pixel_x = -4;
pixel_y = 16
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm
new file mode 100644
index 000000000000..ee1a8c17aad6
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm
@@ -0,0 +1,3947 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ae" = (
+/obj/structure/sign/poster/contraband/c20r,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/canteen)
+"aw" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/railing,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"aD" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"aU" = (
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"bm" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/railing,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"bv" = (
+/obj/structure/window/reinforced/spawner/north,
+/obj/machinery/telecomms/receiver,
+/obj/machinery/door/window/eastleft,
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/operations)
+"bw" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"bA" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"bL" = (
+/obj/structure/flora/tree/dead/tall,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"bT" = (
+/obj/structure/chair/plastic{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"cb" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 10
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 4
+ },
+/obj/machinery/vending/snack/random,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"cm" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark/corner,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"cr" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"cv" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"cB" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/light/directional/south,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"cM" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"cX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/blackbox_recorder,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"db" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"dm" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 8
+ },
+/obj/structure/fluff/paper/stack{
+ dir = 5;
+ pixel_y = 25;
+ layer = 2.89
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"dJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 2
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"dM" = (
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 4
+ },
+/obj/machinery/vending/coffee,
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"dT" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/layer2{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"dY" = (
+/obj/item/ammo_casing/spent,
+/obj/effect/decal/cleanable/blood/splatter{
+ icon_state = "bubblegumfoot"
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"eN" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"eU" = (
+/obj/machinery/button/door{
+ id = "cafeteriashutters";
+ name = "Window Shutters";
+ dir = 1;
+ pixel_y = -20
+ },
+/obj/structure/closet/crate/bin,
+/obj/item/cigbutt{
+ pixel_y = -3
+ },
+/obj/item/cigbutt{
+ pixel_y = -3;
+ pixel_x = -7
+ },
+/obj/item/cigbutt{
+ pixel_y = 17;
+ pixel_x = -10
+ },
+/obj/item/cigbutt{
+ pixel_y = 1;
+ pixel_x = 7
+ },
+/obj/item/cigbutt{
+ pixel_y = 1;
+ pixel_x = -7
+ },
+/obj/item/cigbutt{
+ pixel_y = 15;
+ pixel_x = -7
+ },
+/obj/item/storage/fancy/cigarettes/derringer/gold,
+/obj/item/trash/can,
+/obj/item/trash/sosjerky{
+ pixel_y = 9;
+ pixel_x = -5
+ },
+/obj/item/trash/sosjerky{
+ pixel_y = 2;
+ pixel_x = 6
+ },
+/obj/item/trash/syndi_cakes,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"eW" = (
+/obj/machinery/door/airlock/external/glass{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"eX" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/three_quarters{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"fa" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"fd" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"fg" = (
+/obj/structure/sign/poster/contraband/bulldog,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/commons)
+"fl" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/stairs,
+/area/ruin/unpowered/listening_post/engineering)
+"fo" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"fz" = (
+/obj/machinery/suit_storage_unit/open,
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/unpowered/listening_post)
+"fG" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/structure/chair/bench/red/directional/east,
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"fQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"fZ" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"gr" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"gN" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/crumpled/ruins{
+ pixel_y = 7;
+ pixel_x = -8
+ },
+/obj/item/paper/crumpled/ruins,
+/obj/item/toy/prize/ripley{
+ pixel_y = 13;
+ pixel_x = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"gT" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/obj/structure/fluff/paper/stack{
+ dir = 4;
+ pixel_y = -4;
+ pixel_x = 11
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"gY" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"hh" = (
+/obj/structure/sign/poster/contraband/cybersun,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"hy" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"hA" = (
+/obj/structure/cable{
+ icon_state = "0-1"
+ },
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/machinery/power/port_gen/pacman/super/not_very,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"hC" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"hE" = (
+/obj/structure/curtain,
+/obj/structure/window/plasma/reinforced/plastitanium,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"hX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"ih" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 8
+ },
+/obj/machinery/door/window/brigdoor/northleft{
+ dir = 2
+ },
+/obj/structure/window/reinforced/spawner/east,
+/obj/structure/safe{
+ pixel_y = 9;
+ pixel_x = -4
+ },
+/obj/item/spacecash/bundle/loadsamoney,
+/obj/item/documents/syndicate,
+/obj/machinery/light/small/directional/north,
+/obj/item/folder/documents/syndicate/red,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"iR" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 1
+ },
+/obj/machinery/light_switch{
+ pixel_y = 22
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"jz" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/three_quarters,
+/obj/structure/table/chem,
+/obj/item/tank/internals/anesthetic{
+ pixel_y = 3;
+ pixel_x = 6
+ },
+/obj/item/clothing/mask/breath/medical{
+ pixel_y = 6;
+ pixel_x = -4
+ },
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"jN" = (
+/obj/structure/curtain,
+/obj/effect/turf_decal/techfloor/hole,
+/obj/effect/turf_decal/techfloor/hole/right,
+/obj/structure/window/reinforced/spawner/west,
+/obj/machinery/shower{
+ pixel_y = 19
+ },
+/obj/item/soap/syndie,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/canteen)
+"kb" = (
+/obj/item/kirbyplants/dead{
+ desc = "It doesn't look very healthy...";
+ name = "potted plant";
+ pixel_y = 10
+ },
+/obj/item/cigbutt{
+ pixel_y = -3;
+ pixel_x = -7
+ },
+/obj/item/cigbutt{
+ pixel_y = 17;
+ pixel_x = -10
+ },
+/obj/item/cigbutt{
+ pixel_y = 1;
+ pixel_x = 7
+ },
+/obj/item/cigbutt{
+ pixel_y = 15;
+ pixel_x = -4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"kk" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 4;
+ name = "Bathroom"
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"kz" = (
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"kA" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Engineering"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"kB" = (
+/obj/structure/flora/tree/dead/tall,
+/turf/open/floor/plating/grass/lava/purple,
+/area/ruin/unpowered)
+"lb" = (
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"lj" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 9
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"ls" = (
+/obj/item/toy/figure/syndie{
+ pixel_y = -1;
+ pixel_x = -33
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"lu" = (
+/obj/machinery/airalarm/directional/east,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"lK" = (
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"lZ" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/operations)
+"mc" = (
+/obj/structure/table/reinforced,
+/obj/item/paper_bin{
+ pixel_y = 7
+ },
+/obj/item/pen{
+ pixel_y = 9
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"mf" = (
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"mh" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"mj" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"mp" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/turf/open/floor/plating/grass/lava/purple,
+/area/ruin/unpowered)
+"mF" = (
+/obj/structure/flora/tree/dead/tall/grey,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"mG" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"mU" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/operations)
+"na" = (
+/obj/structure/table/reinforced,
+/obj/machinery/fax{
+ pixel_y = 7
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"nc" = (
+/obj/structure/mirror{
+ pixel_x = 28;
+ icon_state = "mirror_broke";
+ name = "Shattered Mirror"
+ },
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 13
+ },
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 6
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/canteen)
+"np" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"nD" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"nY" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"oi" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 1
+ },
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"op" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"ot" = (
+/obj/structure/closet/cabinet{
+ name = "Alcohol Closet"
+ },
+/obj/item/reagent_containers/food/drinks/bottle/vodka,
+/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium,
+/obj/structure/sign/poster/contraband/syndiemoth{
+ pixel_y = -31
+ },
+/obj/item/reagent_containers/food/drinks/bottle/rum,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"ou" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/three_quarters{
+ dir = 4
+ },
+/obj/structure/bed/roller,
+/obj/effect/decal/cleanable/blood{
+ icon_state = "floor2-old"
+ },
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"oC" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"oG" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"oO" = (
+/obj/structure/toilet{
+ pixel_y = 31;
+ dir = 1
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/canteen)
+"oS" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"oT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/hatch{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"oX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"pa" = (
+/obj/structure/fluff/paper/stack{
+ dir = 1;
+ pixel_x = -16;
+ pixel_y = -2
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"pt" = (
+/obj/machinery/light/directional/east,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wideplating/dark/end,
+/obj/structure/table/reinforced,
+/obj/item/storage/box/cups{
+ pixel_y = 8;
+ pixel_x = 7
+ },
+/obj/item/reagent_containers/food/drinks/colocup{
+ pixel_y = 6;
+ pixel_x = -7
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"pw" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"px" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"pS" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"pW" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"pZ" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Medbay"
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"qo" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"qq" = (
+/obj/structure/girder/reinforced,
+/turf/open/floor/plating/ashplanet,
+/area/ruin/unpowered)
+"qv" = (
+/obj/structure/window/reinforced/spawner,
+/obj/machinery/telecomms/server,
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/operations)
+"qC" = (
+/obj/item/kirbyplants/dead{
+ desc = "It doesn't look very healthy...";
+ name = "potted plant";
+ pixel_y = 10
+ },
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 6
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"qJ" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 4
+ },
+/obj/machinery/airalarm/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"qV" = (
+/turf/template_noop,
+/area/template_noop)
+"qW" = (
+/obj/structure/chair/bench/beige/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"qX" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/toy/figure/secofficer{
+ pixel_y = 10;
+ pixel_x = 7
+ },
+/obj/item/toy/figure/head_of_personnel{
+ pixel_y = 13;
+ pixel_x = -9
+ },
+/obj/item/toy/figure/engineer{
+ pixel_y = 5;
+ pixel_x = -7
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"rb" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/secure_data/laptop,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"rG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/canteen)
+"rQ" = (
+/obj/structure/fluff/paper/stack{
+ dir = 4;
+ pixel_y = -4;
+ pixel_x = 11
+ },
+/obj/item/trash/can{
+ pixel_y = -24;
+ pixel_x = -16
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"sd" = (
+/obj/structure/closet/crate/grave/loot,
+/obj/effect/mob_spawn/human/skeleton,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"sr" = (
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 11
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"sM" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 10
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/canteen)
+"sP" = (
+/obj/machinery/door/airlock/external{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"sX" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"te" = (
+/obj/item/gun/ballistic/automatic/smg/c20r{
+ spawnwithmagazine = 0
+ },
+/obj/item/ammo_box/magazine/smgm45{
+ start_empty = 1
+ },
+/obj/structure/guncloset,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"tf" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"th" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/south,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/unpowered/listening_post)
+"tk" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"to" = (
+/obj/machinery/atmospherics/components/binary/volume_pump/on/layer4{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"tG" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_y = 8;
+ pixel_x = 18
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"tJ" = (
+/obj/structure/sign/departments/engineering,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/engineering)
+"tM" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/turf/open/floor/plating/grass/lava/orange,
+/area/ruin/unpowered)
+"tS" = (
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"tV" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/reinforced,
+/obj/machinery/newscaster/directional/north,
+/obj/item/trash/plate{
+ pixel_y = -27;
+ pixel_x = 1
+ },
+/obj/item/reagent_containers/food/drinks/beer/light{
+ pixel_y = 10;
+ pixel_x = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"tY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post/operations)
+"uv" = (
+/obj/machinery/atmospherics/components/unary/tank/air,
+/obj/structure/railing/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"vu" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"vC" = (
+/obj/structure/flora/ausbushes/grassybush/hell,
+/turf/open/floor/plating/grass/lava/orange,
+/area/ruin/unpowered)
+"vG" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"vJ" = (
+/obj/machinery/suit_storage_unit/mining/eva,
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/unpowered/listening_post)
+"vR" = (
+/obj/effect/decal/cleanable/blood/splatter{
+ icon_state = "floor7"
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"vU" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/item/kirbyplants/dead{
+ desc = "It doesn't look very healthy...";
+ name = "potted plant";
+ pixel_y = 10
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"vY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post/operations)
+"wn" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "commsshutters"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/operations)
+"wr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"wz" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"wL" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half{
+ dir = 1
+ },
+/obj/structure/table/chem,
+/obj/item/stack/medical/gauze/improvised{
+ pixel_y = 9
+ },
+/obj/item/stack/medical/gauze/improvised{
+ pixel_y = 11;
+ pixel_x = -4
+ },
+/obj/item/scalpel,
+/obj/machinery/light/directional/north,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"wO" = (
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_x = 15
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/canteen)
+"xv" = (
+/obj/structure/flora/ausbushes/grassybush/hell,
+/turf/open/floor/plating/grass/lava/purple,
+/area/ruin/unpowered)
+"xR" = (
+/obj/structure/table/reinforced,
+/obj/item/cutting_board{
+ anchored = 1
+ },
+/obj/item/kitchen/knife,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"ya" = (
+/obj/item/trash/can{
+ pixel_y = 35;
+ pixel_x = -26
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"yp" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/fluff/paper/stack{
+ dir = 5;
+ pixel_y = 25;
+ layer = 2.89
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"ys" = (
+/obj/structure/bed,
+/obj/structure/curtain,
+/obj/item/bedsheet/syndie,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"yN" = (
+/turf/open/floor/plating/grass/lava/purple,
+/area/ruin/unpowered)
+"yZ" = (
+/obj/item/trash/can{
+ pixel_y = -12;
+ pixel_x = -7
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"zd" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 11
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"zj" = (
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_y = -5;
+ pixel_x = 33
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"zA" = (
+/obj/structure/table/greyscale,
+/obj/structure/window/reinforced/spawner/east,
+/obj/effect/turf_decal/corner/opaque/syndiered/half{
+ dir = 1
+ },
+/obj/item/storage/firstaid{
+ pixel_y = -17;
+ pixel_x = -9
+ },
+/obj/item/stack/medical/bruise_pack,
+/obj/item/stack/medical/bruise_pack{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/stack/medical/ointment{
+ pixel_y = 6;
+ pixel_x = -6
+ },
+/obj/item/clothing/neck/stethoscope,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"zF" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/unpowered/listening_post)
+"zI" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/canteen)
+"Ao" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"Ap" = (
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"Ax" = (
+/obj/structure/table/reinforced,
+/obj/structure/fluff/paper/stack{
+ dir = 4;
+ pixel_y = -1
+ },
+/obj/item/trash/chips{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"AB" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 8
+ },
+/obj/structure/fluff/paper/stack{
+ dir = 6;
+ pixel_y = 11;
+ pixel_x = 7
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner,
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Bb" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 11
+ },
+/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"Bg" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/three_quarters{
+ dir = 8
+ },
+/obj/structure/table/chem,
+/obj/item/clothing/gloves/color/latex,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"BB" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"BF" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"BL" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "commsshutters";
+ dir = 8
+ },
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/operations)
+"BM" = (
+/obj/machinery/telecomms/processor,
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/operations)
+"BO" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"Cx" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/operations)
+"Di" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Dr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/directional/west,
+/obj/structure/rack,
+/obj/item/reagent_containers/food/snacks/canned/beans{
+ pixel_y = 11;
+ pixel_x = 4
+ },
+/obj/item/reagent_containers/food/snacks/canned/beans{
+ pixel_y = 8;
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/snacks/canned/peaches{
+ pixel_y = 7;
+ pixel_x = 7
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"DE" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/blood/tracks,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"DI" = (
+/obj/structure/table,
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 8;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 6;
+ pixel_x = -7;
+ list_reagents = null
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"DS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/cigarette/syndicate,
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"Ef" = (
+/obj/structure/closet/crate/bin,
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Eh" = (
+/obj/machinery/airalarm/directional/north,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"El" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Eq" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/book/random{
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"Ey" = (
+/obj/structure/bed{
+ dir = 4
+ },
+/obj/structure/curtain,
+/obj/item/bedsheet/syndie{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"EA" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Dormitories"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/commons)
+"EB" = (
+/obj/item/ammo_casing/spent,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"EH" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"EJ" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"EM" = (
+/obj/structure/sign/syndicate,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"Fs" = (
+/obj/structure/chair/bench/beige/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 10
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"FN" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/flashlight/lamp{
+ pixel_y = 6
+ },
+/obj/machinery/light/small/directional/west,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"FQ" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"FW" = (
+/obj/structure/cable{
+ icon_state = "0-1"
+ },
+/obj/machinery/power/smes/engineering,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"Gy" = (
+/obj/machinery/computer/telecomms/monitor{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"GB" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/engineering)
+"GH" = (
+/obj/effect/decal/cleanable/blood/tracks,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"Ip" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"IA" = (
+/obj/structure/chair/bench/beige/directional/west,
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_y = -1;
+ pixel_x = -8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"ID" = (
+/obj/structure/dresser,
+/obj/item/radio/old{
+ pixel_y = 10
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"Jj" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/obj/structure/fluff/paper/stack{
+ dir = 1;
+ pixel_x = -16;
+ pixel_y = -2
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"Jn" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"Jq" = (
+/obj/machinery/atmospherics/components/binary/pump/on/layer2{
+ dir = 1;
+ name = "distribution output pump"
+ },
+/obj/machinery/light/small/directional/west,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"Js" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"JD" = (
+/obj/structure/chair/bench/beige/directional/west,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"KB" = (
+/obj/structure/sign/departments/restroom,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/canteen)
+"KJ" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"KS" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"KV" = (
+/obj/machinery/telecomms/bus,
+/obj/machinery/door/window/eastleft,
+/turf/open/floor/plasteel/freezer,
+/area/ruin/unpowered/listening_post/operations)
+"KW" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half{
+ dir = 4
+ },
+/obj/structure/table/chem,
+/obj/structure/sink/chem{
+ dir = 8
+ },
+/obj/item/cautery{
+ pixel_x = -9;
+ pixel_y = 14
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Li" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Ln" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/commons)
+"LB" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/obj/machinery/door/poddoor/shutters{
+ id = "cafeteriashutters"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"LD" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"LE" = (
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"LI" = (
+/obj/structure/flora/tree/dead/barren,
+/turf/open/floor/plating/grass/lava/orange,
+/area/ruin/unpowered)
+"LV" = (
+/obj/structure/sign/warning/gasmask,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"Mg" = (
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"Mr" = (
+/obj/structure/fluff/paper/stack{
+ dir = 5;
+ pixel_y = 25;
+ layer = 2.89
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"MF" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/corner{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"MN" = (
+/obj/structure/flora/tree/dead/barren,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"MU" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/obj/item/trash/pistachios{
+ pixel_y = 4;
+ pixel_x = -8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"MX" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/mopbucket,
+/obj/item/mop,
+/turf/open/floor/plasteel/tech,
+/area/ruin/unpowered/listening_post/engineering)
+"MZ" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/ration,
+/obj/structure/sign/poster/official/high_class_martini{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"Nb" = (
+/obj/item/toy/plush/moth/firewatch{
+ name = "Syndiemoth plushie"
+ },
+/obj/item/toy/nuke{
+ pixel_x = 12;
+ pixel_y = -5
+ },
+/obj/item/toy/sword{
+ pixel_y = 2;
+ pixel_x = 2
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"Nt" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"NI" = (
+/obj/structure/filingcabinet/double/grey{
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"NK" = (
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post/operations)
+"NP" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"NV" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"NZ" = (
+/obj/structure/table/reinforced,
+/obj/item/trash/plate{
+ pixel_y = 29;
+ pixel_x = -2
+ },
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_y = 17;
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_y = 17;
+ pixel_x = 4
+ },
+/obj/item/reagent_containers/food/drinks/beer/light{
+ pixel_y = 16;
+ pixel_x = -9
+ },
+/obj/effect/turf_decal/siding/thinplating/dark,
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"Oe" = (
+/obj/structure/dresser,
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"Om" = (
+/obj/structure/rack,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"On" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half{
+ dir = 1
+ },
+/obj/structure/closet/wall/med/directional/north,
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/box/masks,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Oo" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"Op" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"OI" = (
+/obj/structure/noticeboard,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post/commons)
+"OP" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"OS" = (
+/obj/machinery/airalarm/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"OW" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Pe" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/structure/chair/bench/red/directional/east,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Pj" = (
+/obj/structure/flora/rock/hell,
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"PC" = (
+/obj/structure/plaque/listeningpost,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"PQ" = (
+/obj/machinery/door/airlock/hatch,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"Qq" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 10
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"QC" = (
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"QD" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/commons)
+"QP" = (
+/turf/open/floor/plating/grass/lava/orange,
+/area/ruin/unpowered)
+"QS" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 8
+ },
+/obj/machinery/vending/snack/random,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 10
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"QY" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post/operations)
+"Rb" = (
+/obj/machinery/atmospherics/components/unary/passive_vent/layer4{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava,
+/area/ruin/unpowered)
+"Ri" = (
+/obj/structure/closet/cabinet,
+/obj/item/storage/backpack/duffelbag/syndie,
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"RV" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"SC" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 10
+ },
+/obj/machinery/button/door{
+ dir = 4;
+ id = "commsshutters";
+ name = "Window Shutters";
+ pixel_x = -23;
+ pixel_y = -6
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 10
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Ta" = (
+/turf/closed/mineral/random/volcanic,
+/area/ruin/unpowered)
+"To" = (
+/obj/structure/sign/departments/medbay/alt,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/unpowered/listening_post)
+"Tp" = (
+/obj/structure/flora/ausbushes/grassybush/hell,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"Ty" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/engineering)
+"TI" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"TK" = (
+/obj/machinery/door/airlock/hatch{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post)
+"TM" = (
+/obj/structure/closet/cabinet,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/gun/ballistic/automatic/pistol/syndicate,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"TS" = (
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"Ut" = (
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ icon_state = "trimline";
+ dir = 9
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 11
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"UB" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/obj/structure/flora/ausbushes/sparsegrass/hell,
+/turf/open/floor/plating/grass/lava/orange,
+/area/ruin/unpowered)
+"UV" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Wa" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/bar/filled/corner,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Wc" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/crumpled/ruins{
+ pixel_y = 1;
+ pixel_x = 6
+ },
+/obj/item/paper/pamphlet{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/obj/item/trash/cheesie{
+ pixel_y = 4
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 5
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"Wo" = (
+/obj/structure/table/wood/reinforced,
+/obj/machinery/light/small/directional/east,
+/obj/item/trash/can/food/beans{
+ pixel_y = 16
+ },
+/obj/item/trash/can/food/beans{
+ pixel_y = 12;
+ pixel_x = -8
+ },
+/obj/item/trash/can/food/beans{
+ pixel_y = 9;
+ pixel_x = 5
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/carpet/nanoweave/red,
+/area/ruin/unpowered/listening_post/commons)
+"Wq" = (
+/obj/structure/chair/office{
+ name = "tactical swivel chair";
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/opaque/syndiered/arrow_ccw{
+ dir = 4
+ },
+/mob/living/simple_animal/hostile/human/syndicate/ranged/space,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post)
+"WL" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/falsewall/plastitanium,
+/turf/open/floor/plating,
+/area/ruin/unpowered/listening_post/canteen)
+"WU" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Xi" = (
+/obj/structure/flora/ausbushes/fullgrass/hell,
+/turf/open/floor/plating/grass/lava,
+/area/ruin/unpowered)
+"Xk" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"Xm" = (
+/obj/machinery/light_switch{
+ pixel_y = 22;
+ pixel_x = -8
+ },
+/obj/structure/reagent_dispensers/water_cooler,
+/obj/effect/turf_decal/siding/thinplating/dark/end{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"XE" = (
+/obj/item/trash/chips{
+ pixel_y = 5
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"XY" = (
+/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Yh" = (
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 5
+ },
+/obj/structure/closet/crate/bin,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"YK" = (
+/obj/structure/table/reinforced,
+/obj/machinery/reagentgrinder{
+ pixel_y = 12
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 9
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"YL" = (
+/obj/item/paper/crumpled/ruins,
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+"YP" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/food/snacks/ration{
+ pixel_x = -8;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/food/snacks/ration{
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/snacks/ration{
+ pixel_y = 7;
+ pixel_x = -9
+ },
+/obj/item/reagent_containers/food/condiment/bbqsauce{
+ pixel_y = 6;
+ pixel_x = 7
+ },
+/obj/effect/turf_decal/siding/thinplating/dark,
+/obj/effect/turf_decal/siding/thinplating/dark{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/cargo_one,
+/area/ruin/unpowered/listening_post/canteen)
+"Zb" = (
+/obj/effect/turf_decal/corner/opaque/syndiered/half,
+/turf/open/floor/hangar/plasteel/white,
+/area/ruin/unpowered/listening_post)
+"Zd" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/canteen)
+"ZY" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/syndiered/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/unpowered/listening_post/operations)
+
+(1,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+"}
+(2,1,1) = {"
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+"}
+(3,1,1) = {"
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+TS
+TS
+Xi
+Xi
+Xi
+Xi
+Xi
+TS
+Ap
+Ap
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+TS
+TS
+TS
+qV
+qV
+qV
+"}
+(4,1,1) = {"
+qV
+Ap
+Ap
+Ap
+TS
+TS
+TS
+TS
+Xi
+Xi
+MN
+Xi
+Xi
+Xi
+TS
+Ap
+Pj
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+dY
+Ap
+TS
+Tp
+BO
+BO
+TS
+qV
+qV
+"}
+(5,1,1) = {"
+qV
+Ap
+Ap
+TS
+TS
+Xi
+Xi
+Xi
+Xi
+Xi
+Xi
+Xi
+TS
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+nD
+EB
+Ap
+EB
+Ap
+EB
+Ap
+TS
+mF
+BO
+TS
+qV
+qV
+"}
+(6,1,1) = {"
+qV
+Ap
+Ap
+TS
+Xi
+Xi
+Xi
+Tp
+Xi
+TS
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+lj
+GH
+vR
+Ap
+Ap
+Ap
+Ap
+Ap
+EB
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Tp
+TS
+qV
+qV
+"}
+(7,1,1) = {"
+qV
+qV
+Xi
+Xi
+Xi
+Xi
+TS
+TS
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+op
+op
+sP
+op
+Ta
+Ta
+Ap
+Ap
+Ap
+Ap
+Ta
+Ta
+Ta
+Ta
+Ap
+Ap
+Ap
+Ap
+Ap
+qV
+qV
+"}
+(8,1,1) = {"
+qV
+Ap
+TS
+TS
+TS
+TS
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ta
+Ta
+Ta
+op
+fz
+th
+op
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ap
+Ap
+Ap
+Ap
+qV
+"}
+(9,1,1) = {"
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+op
+vJ
+zF
+op
+Ta
+Ta
+Ta
+Ta
+zI
+zI
+zI
+zI
+zI
+Ta
+Ta
+Ta
+Ta
+Ap
+Pj
+Ap
+qV
+"}
+(10,1,1) = {"
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+bT
+Ap
+Ap
+Ta
+Ta
+op
+op
+op
+op
+op
+LV
+eW
+op
+op
+op
+op
+op
+zI
+Om
+lb
+Dr
+zI
+zI
+zI
+Ta
+Ta
+Ap
+Ap
+Ap
+qV
+"}
+(11,1,1) = {"
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+DI
+Ap
+Ap
+Ta
+Ta
+op
+ou
+oC
+eX
+pZ
+DE
+fZ
+zd
+vU
+fG
+Pe
+cb
+zI
+MZ
+oX
+ot
+WL
+Nb
+zI
+Ta
+Ta
+Ap
+Ap
+Ap
+qV
+"}
+(12,1,1) = {"
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+sd
+Ap
+Ap
+Ta
+Ta
+op
+zA
+El
+tf
+To
+np
+fQ
+KJ
+sX
+oS
+oS
+fd
+zI
+zI
+oT
+zI
+rG
+zI
+zI
+Ta
+Ta
+yN
+Ap
+Ap
+qV
+"}
+(13,1,1) = {"
+qV
+Ap
+Pj
+Ap
+Ap
+Ap
+ls
+Ap
+Ap
+Ta
+Ta
+op
+wL
+tk
+eN
+hE
+bw
+TI
+cv
+WU
+Wa
+XY
+EJ
+zI
+kb
+LD
+QC
+YK
+Qq
+zI
+Ta
+yN
+yN
+Ap
+qV
+qV
+"}
+(14,1,1) = {"
+qV
+qV
+Ap
+QP
+Ap
+Ap
+Ap
+Ap
+Ap
+Ta
+Ta
+op
+On
+tS
+Zb
+hE
+Di
+OW
+mG
+mG
+EM
+RV
+KS
+zI
+qW
+Fs
+Ao
+Mg
+xR
+LB
+Ap
+mp
+kB
+yN
+qV
+qV
+"}
+(15,1,1) = {"
+qV
+qV
+QP
+QP
+QP
+QP
+QP
+Ap
+Ap
+Ta
+Ta
+op
+Bg
+KW
+jz
+hE
+Yh
+oG
+rb
+Wq
+qJ
+px
+cm
+zI
+tV
+NZ
+Ao
+wr
+YP
+LB
+Ap
+mp
+yN
+yN
+qV
+qV
+"}
+(16,1,1) = {"
+qV
+qV
+QP
+tM
+tM
+QP
+QP
+Ap
+Ap
+Ta
+Ta
+op
+op
+op
+op
+op
+op
+hh
+op
+PC
+op
+Js
+TK
+zI
+JD
+IA
+zj
+Zd
+aU
+LB
+Ap
+mp
+yN
+Ap
+qV
+qV
+"}
+(17,1,1) = {"
+qV
+qV
+QP
+QP
+tM
+tM
+QP
+QP
+Ap
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ln
+iR
+pw
+zI
+Eh
+Zd
+Ao
+Zd
+eU
+zI
+Ta
+mh
+mp
+yN
+qV
+qV
+"}
+(18,1,1) = {"
+qV
+qV
+QP
+QP
+QP
+tM
+tM
+QP
+Ap
+Ta
+Ta
+Ta
+Ta
+Ln
+Ln
+Ln
+Ln
+Ln
+Ln
+Ln
+Ln
+QD
+yp
+PQ
+fa
+Xk
+fo
+OP
+DS
+ae
+Ta
+Ap
+yN
+Ap
+qV
+qV
+"}
+(19,1,1) = {"
+qV
+qV
+QP
+QP
+LI
+QP
+tM
+QP
+Ap
+Ap
+Ta
+Ta
+Ta
+Ln
+ID
+Ey
+FN
+qX
+Ri
+sr
+Ln
+db
+pw
+zI
+Xm
+pt
+tG
+LE
+dM
+zI
+Ta
+Ta
+Ap
+Ap
+qV
+qV
+"}
+(20,1,1) = {"
+qV
+qV
+QP
+QP
+QP
+vC
+QP
+tM
+QP
+Ap
+Ta
+Ta
+Ta
+Ln
+vG
+mj
+NP
+hy
+dJ
+cr
+EA
+Jj
+cB
+zI
+zI
+zI
+kk
+KB
+zI
+zI
+Ta
+Ta
+Ap
+Ap
+qV
+qV
+"}
+(21,1,1) = {"
+qV
+qV
+Ap
+tM
+tM
+QP
+QP
+QP
+QP
+Ap
+Ta
+Ta
+Ta
+Ln
+Oe
+ys
+Wo
+Eq
+TM
+lu
+Ln
+oi
+bA
+fg
+Ta
+zI
+wO
+sM
+oO
+Ta
+Ta
+Ta
+Ap
+Ap
+qV
+qV
+"}
+(22,1,1) = {"
+qV
+qV
+Ap
+QP
+tM
+QP
+LI
+vC
+QP
+Ap
+Ta
+Ta
+Ta
+Ln
+Ln
+Ln
+Ln
+Ln
+Ln
+Ln
+OI
+vu
+gY
+Ln
+Ta
+zI
+jN
+nc
+zI
+Ta
+Ta
+Ta
+Pj
+Ap
+qV
+qV
+"}
+(23,1,1) = {"
+qV
+Ap
+Ap
+QP
+QP
+tM
+QP
+QP
+QP
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ln
+Oo
+gT
+Ln
+Ta
+zI
+zI
+zI
+zI
+Ta
+Ta
+Ta
+Ap
+Ap
+qV
+qV
+"}
+(24,1,1) = {"
+qV
+Ap
+Ap
+Ap
+QP
+tM
+QP
+vC
+QP
+Ap
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ln
+NV
+nY
+Ln
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ap
+qV
+qV
+qV
+"}
+(25,1,1) = {"
+qV
+qV
+Ap
+Ap
+QP
+QP
+UB
+QP
+QP
+Ap
+Ap
+Ta
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+Cx
+mU
+lZ
+GB
+GB
+GB
+GB
+GB
+Ta
+Ta
+Ta
+Ap
+qV
+qV
+qV
+"}
+(26,1,1) = {"
+qV
+qV
+Pj
+Ap
+Ap
+QP
+QP
+QP
+Ap
+Ap
+Ap
+Ta
+lZ
+ih
+gr
+SC
+bv
+BM
+KV
+qv
+Ut
+hC
+MF
+QS
+GB
+Bb
+Jq
+uv
+GB
+GB
+GB
+Ta
+Ap
+qV
+qV
+qV
+"}
+(27,1,1) = {"
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+QP
+QP
+Ap
+Ap
+Ap
+Ap
+lZ
+na
+EH
+AB
+Li
+Li
+qo
+dm
+Ip
+pa
+yZ
+Ef
+GB
+hX
+dT
+bm
+FW
+hA
+GB
+Ta
+TS
+Ap
+qV
+qV
+"}
+(28,1,1) = {"
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Pj
+Ap
+Ap
+wn
+Wc
+Nt
+aD
+vY
+NK
+QY
+tY
+tY
+FQ
+rQ
+ya
+tJ
+Ty
+pS
+lK
+fl
+mf
+GB
+Ta
+TS
+TS
+qV
+qV
+"}
+(29,1,1) = {"
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+BL
+wn
+MU
+gN
+Op
+Mr
+pW
+UV
+YL
+ZY
+kz
+BB
+kA
+BF
+cM
+aw
+FW
+hA
+GB
+Ta
+Tp
+TS
+qV
+qV
+"}
+(30,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+BL
+wn
+NI
+XE
+cX
+Ax
+Gy
+mc
+te
+OS
+qC
+GB
+Jn
+MX
+to
+GB
+GB
+GB
+Ta
+BO
+TS
+qV
+qV
+"}
+(31,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Pj
+Ap
+Ap
+Ap
+Ap
+Ap
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+lZ
+GB
+GB
+GB
+wz
+GB
+Ta
+Ta
+Ta
+TS
+BO
+qV
+qV
+"}
+(32,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+yN
+yN
+yN
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+qq
+Rb
+qq
+Ta
+Ta
+Tp
+TS
+BO
+qV
+qV
+"}
+(33,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+yN
+mp
+mp
+mp
+yN
+yN
+Ap
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ta
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+bL
+BO
+qV
+qV
+"}
+(34,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+yN
+mp
+mp
+mp
+mp
+mp
+yN
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Pj
+Ap
+Ap
+Tp
+qV
+qV
+"}
+(35,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+yN
+mp
+mp
+xv
+yN
+Ap
+Ap
+Ap
+Pj
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+Pj
+Ap
+Ap
+Ap
+Ap
+Ap
+Ap
+qV
+qV
+"}
+(36,1,1) = {"
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+Ap
+Ap
+Ap
+Ap
+Ap
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+"}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
index 138b1e9d31ed..935a852fac76 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm
@@ -721,7 +721,7 @@
/obj/structure/cable/green{
icon_state = "1-4"
},
-/obj/item/reagent_containers/food/snacks/breadslice/moldy{
+/obj/item/food/breadslice/moldy{
pixel_x = 5
},
/turf/open/floor/pod,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
index a4b07632face..6415f9e79293 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
@@ -829,7 +829,7 @@
/area/ruin/unpowered/winter_biodome)
"kb" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/snacks/breadslice/plain,
+/obj/item/food/breadslice/plain,
/obj/item/reagent_containers/food/snacks/grown/cabbage,
/turf/open/floor/wood,
/area/ruin/unpowered/winter_biodome/cabin)
@@ -1006,8 +1006,8 @@
"oR" = (
/obj/effect/turf_decal/corner/opaque/solgovblue/diagonal,
/obj/structure/closet/secure_closet/freezer,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
/obj/item/reagent_containers/food/snacks/grown/cabbage,
/obj/item/reagent_containers/food/snacks/grown/cabbage,
/obj/effect/decal/cleanable/dirt/dust,
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
new file mode 100644
index 000000000000..df70f94b314b
--- /dev/null
+++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
@@ -0,0 +1,6628 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ah" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/rockplanet/distillery)
+"aj" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-10"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"av" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 9
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"aB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/structure/chair/sofa/brown/old/right/directional/south,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"aC" = (
+/obj/structure/catwalk/over,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"aE" = (
+/obj/structure/catwalk/over,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/glass,
+/obj/item/reagent_containers/food/condiment/sugar{
+ pixel_y = 13;
+ pixel_x = -2;
+ layer = 2.8
+ },
+/obj/item/stock_parts/micro_laser{
+ pixel_y = 16;
+ pixel_x = 6;
+ layer = 2.8
+ },
+/obj/machinery/reagentgrinder,
+/obj/item/stock_parts/scanning_module{
+ pixel_x = -6;
+ pixel_y = 6;
+ layer = 2.8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 10;
+ pixel_x = 10
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"aG" = (
+/obj/structure/cable/yellow{
+ icon_state = "5-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-5"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"aJ" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"ba" = (
+/obj/structure/chair/office,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals/neutered,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"bd" = (
+/obj/effect/turf_decal/industrial/hatch/yellow,
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"be" = (
+/obj/machinery/light/floor,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg3"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"bm" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"br" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/machinery/door/airlock/external,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"bu" = (
+/obj/structure/chair/sofa/brown/corpo/left/directional/west,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"bz" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "f";
+ pixel_x = 6;
+ color = "#0094FF"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"bH" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ target_pressure = 500;
+ name = "Air to Distro"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"bI" = (
+/obj/structure/window/reinforced,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/east{
+ pixel_y = -6
+ },
+/obj/machinery/light_switch{
+ dir = 8
+ },
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/light_switch{
+ pixel_x = 22;
+ pixel_y = 5;
+ dir = 8
+ },
+/obj/effect/decal/cleanable/generic,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable/yellow{
+ icon_state = "2-5"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"bS" = (
+/obj/machinery/washing_machine,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/catwalk/over,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "5-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 9
+ },
+/turf/open/floor/plating/rust,
+/area/ruin/rockplanet/distillery/crew)
+"bT" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 8
+ },
+/obj/structure/railing/corner{
+ dir = 8;
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"bX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/sofa/brown/old/left/directional/west,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"bY" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"cf" = (
+/obj/machinery/shower{
+ dir = 1
+ },
+/obj/structure/catwalk/over,
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/machinery/door/window/northleft,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/distillery/crew)
+"co" = (
+/obj/structure/catwalk/over,
+/obj/structure/fermenting_barrel,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"cp" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"cw" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/glass,
+/obj/structure/grille/broken,
+/obj/structure/barricade/wooden,
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery/saloon)
+"cA" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/generic,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"cP" = (
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/condiment/sugar,
+/obj/item/reagent_containers/food/condiment/sugar,
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 3
+ },
+/obj/structure/closet/crate/freezer,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"cQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"cS" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/structure/table,
+/obj/item/clothing/gloves/color/yellow{
+ pixel_y = -16
+ },
+/obj/item/stock_parts/capacitor{
+ pixel_x = -6;
+ pixel_y = -4
+ },
+/obj/item/weldingtool/largetank{
+ pixel_y = 3
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/machinery/light/dim/directional/east,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"dn" = (
+/obj/structure/flora/rock/rockplanet{
+ icon_state = "redrock3"
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "foam_plating"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dw" = (
+/obj/structure/flora/ash/cacti,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dE" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dI" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-9"
+ },
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dJ" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"dK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/port_gen/pacman/super,
+/obj/effect/turf_decal/siding/white/end{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"dP" = (
+/obj/machinery/shower{
+ pixel_y = 12
+ },
+/obj/structure/catwalk/over,
+/obj/structure/window/reinforced/tinted{
+ dir = 8
+ },
+/obj/machinery/door/window/southright,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/distillery/crew)
+"dU" = (
+/obj/structure/flora/ash/cacti,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dZ" = (
+/obj/machinery/vending/cola/random,
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"ed" = (
+/turf/closed/wall/rust,
+/area/ruin/rockplanet/distillery)
+"eh" = (
+/obj/structure/chair{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"em" = (
+/obj/structure/flora/ash/leaf_shroom,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"en" = (
+/obj/effect/turf_decal/industrial/hatch/yellow,
+/obj/item/storage/bottles/moonshine/sealed,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"eF" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken6"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"eG" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"fl" = (
+/obj/structure/reagent_dispensers/cooking_oil{
+ name = "moonshine vat";
+ desc = "A huge metal vat with a tap on the front. Filled with moonshine.";
+ reagent_id = /datum/reagent/consumable/ethanol/moonshine
+ },
+/obj/structure/fermenting_barrel/distiller{
+ pixel_y = -14;
+ density = 0
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"fs" = (
+/obj/structure/fermenting_barrel,
+/obj/effect/decal/cleanable/greenglow,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/broken/directional/south,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg3"
+ },
+/area/ruin/rockplanet/distillery)
+"fv" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ dir = 8;
+ id = "frontier_door";
+ name = "Door Lock";
+ pixel_x = 23;
+ pixel_y = -2;
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/turf/open/floor/plasteel/stairs{
+ dir = 1
+ },
+/area/ruin/rockplanet/distillery)
+"fF" = (
+/obj/structure/cable{
+ icon_state = "1-10"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-5"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"fJ" = (
+/obj/structure/catwalk/over,
+/obj/machinery/light/small/broken/directional/west,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"fM" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/white/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"fO" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 10
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"fW" = (
+/obj/structure/rack,
+/obj/item/storage/bottles/moonshine{
+ pixel_y = 6
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"gg" = (
+/obj/structure/flora/ausbushes/sunnybush{
+ layer = 3
+ },
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"gk" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 6
+ },
+/obj/structure/mopbucket,
+/obj/item/holosign_creator/janibarrier,
+/obj/item/mop,
+/obj/machinery/light/directional/east,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"gu" = (
+/obj/item/mine/pressure/explosive/rusty/live,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"gv" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"gw" = (
+/obj/structure/table/wood/poker,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/item/toy/cards/deck{
+ pixel_x = 6;
+ pixel_y = -4
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"gA" = (
+/obj/structure/table/wood/reinforced,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/ammo_box/magazine/pistolm9mm{
+ pixel_y = 6;
+ pixel_x = 12;
+ layer = 3.1
+ },
+/obj/item/ammo_box/magazine/pistolm9mm{
+ pixel_y = 6;
+ pixel_x = 6;
+ start_empty = 1;
+ layer = 3.1
+ },
+/obj/item/ammo_casing/c9mm,
+/obj/item/ammo_casing/c9mm,
+/obj/item/ammo_casing/c9mm,
+/obj/item/ammo_casing/c9mm,
+/obj/item/ammo_casing/c9mm,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"gM" = (
+/obj/machinery/door/airlock,
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"gU" = (
+/obj/structure/catwalk/over,
+/obj/structure/table/glass,
+/obj/item/cigbutt{
+ pixel_x = 4
+ },
+/obj/item/cigbutt{
+ pixel_x = -3;
+ pixel_y = 4
+ },
+/obj/item/electronics/firealarm{
+ pixel_y = 6;
+ pixel_x = -4
+ },
+/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry{
+ pixel_y = 6;
+ pixel_x = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/distillery)
+"gX" = (
+/obj/structure/reagent_dispensers/beerkeg{
+ reagent_id = /datum/reagent/consumable/ethanol/moonshine;
+ name = "moonshine keg";
+ desc = "A keg full of liver-shredding spirits brewed by amateur bootleggers."
+ },
+/obj/effect/turf_decal/industrial/loading/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"hi" = (
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg1"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"hq" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 8
+ },
+/obj/item/clothing/head/beret/sec/frontier{
+ pixel_x = -4
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"hy" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"hA" = (
+/obj/structure/table/wood/reinforced,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/reagent_containers/food/snacks/chips{
+ pixel_y = 4;
+ pixel_x = -3
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 8;
+ pixel_x = 6
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"hH" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"hN" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/structure/chair/sofa/brown/old/right/directional/south,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"hP" = (
+/obj/structure/catwalk/over,
+/obj/machinery/computer/atmos_alert/retro{
+ dir = 1
+ },
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"hS" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"hY" = (
+/turf/closed/mineral/random/rockplanet,
+/area/overmap_encounter/planetoid/cave/explored)
+"ih" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/machinery/light/dim/directional/north,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/safe/floor,
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "credit"
+ },
+/obj/item/spacecash/bundle/loadsamoney,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"ir" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-1"
+ },
+/obj/machinery/porta_turret/ship/weak,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/ruin/rockplanet/distillery/office)
+"iy" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"iT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg2"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ji" = (
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jm" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/power/smes/shuttle/micro/precharged{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+"jE" = (
+/obj/structure/catwalk/over,
+/turf/closed/mineral/random/rockplanet,
+/area/overmap_encounter/planetoid/cave/explored)
+"jF" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"jI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/sofa/brown/corpo/right/directional/west,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"jM" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/distillery/office)
+"jO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Input to Air"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"jS" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/ash,
+/obj/item/cigbutt{
+ pixel_y = 3;
+ pixel_x = 6
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"kd" = (
+/obj/structure/curtain/cloth/grey,
+/obj/structure/bed{
+ dir = 8;
+ icon_state = "dirty_mattress"
+ },
+/obj/item/bedsheet/dorms,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"kn" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"kq" = (
+/obj/effect/turf_decal/industrial/traffic,
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/machinery/light/dim/directional/south,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"ky" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell{
+ name = "dead grass";
+ desc = "A sparse patch of grass without color.";
+ light_range = 0;
+ light_power = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"kC" = (
+/obj/structure/curtain/cloth/grey,
+/obj/structure/bed{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"kO" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/structure/table,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/machinery/airalarm/directional/north,
+/obj/machinery/light/small/directional/west,
+/obj/machinery/microwave{
+ pixel_y = 6
+ },
+/obj/item/trash/plate{
+ pixel_y = 16
+ },
+/obj/item/reagent_containers/food/snacks/donkpocket/warm/pizza{
+ pixel_y = 18
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"kT" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 1
+ },
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"kU" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/machinery/light/dim/directional/north,
+/obj/structure/chair/sofa/brown/old/directional/south,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"kZ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"lc" = (
+/obj/structure/flora/rock/pile/rockplanet,
+/turf/open/floor/plating/asteroid/rockplanet/wet,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"lD" = (
+/turf/closed/wall/r_wall,
+/area/overmap_encounter/planetoid/cave/explored)
+"lE" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/distillery/crew)
+"lK" = (
+/obj/structure/dresser,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/neck/stethoscope{
+ pixel_y = 8
+ },
+/obj/item/toy/plush/carpplushie{
+ pixel_y = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"lL" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/machinery/turretid/lethal{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"lQ" = (
+/obj/structure/cable{
+ icon_state = "4-9"
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg3"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"lS" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"lU" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ruin/rockplanet/distillery/shuttle)
+"me" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"mk" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"mp" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-6"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"mq" = (
+/obj/item/kirbyplants{
+ icon_state = "plant-14";
+ layer = 3.8
+ },
+/obj/effect/decal/cleanable/glass,
+/obj/item/broken_bottle{
+ pixel_x = 8
+ },
+/obj/item/shard{
+ pixel_x = -4
+ },
+/obj/item/pushbroom{
+ pixel_y = -12;
+ pixel_x = 5;
+ layer = 3.9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/machinery/light/small/broken/directional/west,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"mv" = (
+/obj/structure/table/wood/reinforced,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/item/folder/red{
+ pixel_x = -2;
+ pixel_y = 3
+ },
+/obj/item/folder/yellow{
+ pixel_y = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"mE" = (
+/obj/structure/chair/office{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/structure/railing{
+ dir = 1;
+ layer = 2.7
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"mF" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/oil/streak,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"mK" = (
+/turf/open/floor/plasteel/stairs/wood{
+ color = "#5B3E1D"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"mX" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"mY" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 4
+ },
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ne" = (
+/obj/structure/table,
+/obj/item/stack/cable_coil/yellow,
+/obj/item/stack/cable_coil/red{
+ pixel_y = 3
+ },
+/obj/item/stock_parts/manipulator{
+ pixel_y = 5;
+ pixel_x = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"nf" = (
+/obj/item/stack/ore/salvage/scrapmetal/five,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/cyan/visible{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_y = 6;
+ pixel_x = -22;
+ name = "Window Shutter";
+ id = "engi_window"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/binary/volume_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"ng" = (
+/obj/effect/turf_decal/industrial/loading,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"nm" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"nr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/machinery/newscaster/directional/north,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"nA" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"nR" = (
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"nT" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"nU" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"nX" = (
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/regular,
+/obj/item/reagent_containers/glass/bottle/bicaridine{
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/syringe,
+/obj/item/reagent_containers/glass/bottle/bicaridine{
+ pixel_x = 6
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"nY" = (
+/obj/structure/fermenting_barrel,
+/obj/effect/decal/cleanable/wrapping,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"oh" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"om" = (
+/obj/structure/catwalk/over,
+/obj/structure/closet/crate/hydroponics,
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 8;
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 8;
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = 8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = 8
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"oq" = (
+/obj/structure/flora/ash/garden/waste,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"oD" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"oO" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/item/mine/pressure/explosive/live{
+ layer = 2.8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"oU" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/white/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white/corner{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"oY" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/obj/structure/frame,
+/obj/item/circuitboard/machine/shuttle/engine/electric,
+/obj/item/stack/cable_coil/cut/red,
+/obj/item/stock_parts/capacitor,
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+"pa" = (
+/obj/structure/reagent_dispensers/water_cooler{
+ pixel_x = -4
+ },
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"pm" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/sand/plating,
+/obj/structure/cable/yellow{
+ icon_state = "2-9"
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pD" = (
+/obj/structure/fermenting_barrel/distiller{
+ pixel_y = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/paper/crumpled/muddy/fluff/distillery{
+ name = "note";
+ default_raw_text = "Scored this from an SRM ship passing through the sector. Handy if anything happens to our current still."
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/distillery)
+"pL" = (
+/obj/effect/turf_decal/siding/white/end{
+ dir = 1
+ },
+/obj/structure/toilet,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/mob/living/simple_animal/hostile/human/frontier,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"pM" = (
+/obj/structure/girder/displaced,
+/obj/structure/cable/yellow{
+ icon_state = "4-5"
+ },
+/obj/item/stack/ore/salvage/scrapmetal,
+/turf/open/floor/plating/rust,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pQ" = (
+/obj/structure/table/wood/reinforced,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/item/stamp{
+ pixel_y = 16;
+ pixel_x = 5
+ },
+/obj/item/stamp/denied{
+ pixel_y = 16;
+ pixel_x = -5
+ },
+/obj/item/kirbyplants{
+ icon_state = "plant-11";
+ pixel_y = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"qe" = (
+/obj/structure/reagent_dispensers/water_cooler{
+ pixel_y = 6;
+ pixel_x = 6
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/rockplanet/distillery)
+"qj" = (
+/obj/structure/flora/ash/stem_shroom,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ql" = (
+/obj/effect/turf_decal/industrial/loading{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned,
+/area/ruin/rockplanet/distillery/office)
+"qm" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+"qo" = (
+/obj/structure/curtain/cloth/grey,
+/obj/structure/bed{
+ dir = 8;
+ icon_state = "dirty_mattress"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"qu" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/vomit/old,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"qw" = (
+/obj/structure/flora/tree/cactus,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"qQ" = (
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"qX" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/door/airlock/grunge,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"qY" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood{
+ icon_state = "wood-broken6"
+ },
+/area/ruin/rockplanet/distillery/office)
+"re" = (
+/obj/structure/flora/ausbushes/sunnybush{
+ layer = 3
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rh" = (
+/obj/structure/flora/tree/dead/tall,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rs" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rF" = (
+/obj/structure/catwalk/over,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/chair/sofa/brown/old/corner,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery/saloon)
+"rH" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/distillery)
+"rJ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/item/ammo_casing/spent{
+ pixel_x = 12;
+ pixel_y = 6
+ },
+/obj/item/ammo_casing/spent{
+ pixel_x = 14
+ },
+/obj/machinery/light/small/broken/directional/east,
+/obj/structure/chair/sofa/brown/old/directional/west,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"rT" = (
+/obj/effect/turf_decal/industrial/traffic,
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"rW" = (
+/obj/item/mine/pressure/explosive/live{
+ layer = 2.8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"sb" = (
+/obj/machinery/vending/cola/space_up,
+/obj/effect/decal/cleanable/wrapping,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"si" = (
+/obj/structure/table/wood/poker,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/item/spacecash/bundle/c10,
+/obj/item/spacecash/bundle/c1{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"sm" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4;
+ filter_types = list("co2","bz","water_vapor","miasma","freon","pluox","tritium","n20","no2","nob");
+ widenet = 1
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"sx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-9"
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"sy" = (
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken6"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"sE" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/item/kirbyplants{
+ icon_state = "plant-20";
+ pixel_y = 8
+ },
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken2"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"sQ" = (
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/structure/closet/crate/freezer,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"tc" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"te" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"to" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/glass,
+/obj/item/lighter/greyscale{
+ pixel_x = 7;
+ pixel_y = -1
+ },
+/obj/item/reagent_containers/glass/beaker{
+ pixel_x = -5;
+ list_reagents = list(/datum/reagent/oxygen = 50)
+ },
+/obj/item/reagent_containers/glass/beaker{
+ pixel_y = 12;
+ list_reagents = list(/datum/reagent/carbon = 50)
+ },
+/obj/item/reagent_containers/syringe{
+ pixel_y = 6
+ },
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"tw" = (
+/obj/effect/decal/cleanable/garbage,
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tx" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tA" = (
+/obj/effect/turf_decal/siding/white/end{
+ dir = 8
+ },
+/obj/item/storage/bottles{
+ icon_state = "bottlecrate_0"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"tB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 10
+ },
+/obj/item/newspaper{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"tP" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"tQ" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"uf" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uk" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ut" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"uv" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/door/poddoor/preopen{
+ dir = 4;
+ id = "pod_fore"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ruin/rockplanet/distillery/shuttle)
+"uw" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken5"
+ },
+/area/ruin/rockplanet/distillery)
+"uy" = (
+/obj/machinery/shower{
+ pixel_y = 12
+ },
+/obj/structure/catwalk/over,
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/obj/machinery/door/window/southleft,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/distillery/crew)
+"uE" = (
+/obj/structure/flora/ash/garden/arid,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uG" = (
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uL" = (
+/turf/closed/wall/r_wall,
+/area/ruin/rockplanet/distillery/engineering)
+"uP" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/vomit/old,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"uS" = (
+/obj/machinery/power/smes/engineering,
+/obj/effect/turf_decal/siding/white/end{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"uU" = (
+/obj/effect/turf_decal/ntlogo,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"uX" = (
+/turf/closed/wall/rust,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vf" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/poddoor/shutters{
+ dir = 4;
+ id = "dist_cargo"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"vo" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/door/window/brigdoor/southleft{
+ req_one_access_txt = "10"
+ },
+/obj/structure/closet/wall/red/directional/west{
+ secure = 1;
+ locked = 1
+ },
+/obj/item/storage/toolbox/emergency/shuttle/electric,
+/obj/item/ammo_box/a44roum_speedloader,
+/obj/item/gun/ballistic/revolver/shadow,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"vC" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vD" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/fluff/glowshroom,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"vF" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/glass,
+/obj/item/seeds/corn{
+ pixel_y = 6;
+ pixel_x = -2
+ },
+/obj/item/seeds/corn{
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = -2;
+ pixel_x = 3
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 3;
+ pixel_x = 4
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/distillery)
+"vX" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/structure/filingcabinet/double/grey,
+/obj/machinery/light/dim/directional/north,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/folder/yellow,
+/obj/item/folder/documents,
+/obj/item/folder/red,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"wb" = (
+/obj/structure/railing{
+ layer = 4.1
+ },
+/obj/structure/sign/warning/gasmask{
+ pixel_y = -32
+ },
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wd" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wk" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ws" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wx" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen/fountain,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"wy" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wz" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wB" = (
+/obj/structure/flora/rock/rockplanet{
+ icon_state = "redrock3"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wH" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/poddoor/shutters{
+ id = "engi_window"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer2{
+ dir = 1
+ },
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/distillery/engineering)
+"wT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"wU" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wV" = (
+/obj/structure/catwalk/over,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/rust,
+/area/ruin/rockplanet/distillery/engineering)
+"wX" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"xc" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/paper_bin{
+ pixel_y = 8;
+ pixel_x = -4
+ },
+/obj/item/pen{
+ pixel_y = 8;
+ pixel_x = -4
+ },
+/obj/item/hand_labeler{
+ pixel_y = -4
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"xf" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/table/reinforced,
+/obj/item/wrench,
+/obj/item/wirecutters,
+/obj/machinery/cell_charger,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer2{
+ dir = 9
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"xs" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"xA" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/catwalk/over,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-6"
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"xM" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"xN" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/sign/poster/retro/smile{
+ pixel_y = 32
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/hostile/netherworld/migo{
+ name = "Dog";
+ faction = list("Frontiersmen")
+ },
+/obj/structure/bed/dogbed,
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"xO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/machinery/airalarm/directional/west,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"xT" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/distillery/engineering)
+"yf" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/rack,
+/obj/item/reagent_containers/food/condiment/sugar{
+ pixel_y = 13;
+ pixel_x = -2;
+ layer = 2.8
+ },
+/obj/item/reagent_containers/food/condiment/sugar{
+ pixel_y = 7;
+ pixel_x = -2;
+ layer = 2.8
+ },
+/obj/item/wrench{
+ pixel_y = 4
+ },
+/obj/item/screwdriver,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"yr" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"yw" = (
+/obj/structure/cable{
+ icon_state = "1-10"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"yI" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"yL" = (
+/obj/structure/closet/crate/bin,
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/spawner/lootdrop/maintenance/two,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"yO" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 9
+ },
+/obj/effect/turf_decal/siding/white/corner,
+/obj/structure/sink{
+ pixel_y = 16
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/insectguts,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"yS" = (
+/turf/closed/wall/r_wall/rust,
+/area/ruin/rockplanet/distillery/crew)
+"yW" = (
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/structure/guncloset,
+/obj/item/gun/ballistic/automatic/pistol/commander/no_mag,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/office)
+"ze" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "foam_plating"
+ },
+/area/ruin/rockplanet/distillery)
+"zk" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/structure/grille,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/distillery/crew)
+"zn" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/machinery/light/broken/directional/south,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"zw" = (
+/obj/machinery/autolathe,
+/obj/machinery/atmospherics/pipe/simple/cyan/visible{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer2{
+ dir = 5
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"zx" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"zy" = (
+/obj/structure/catwalk/over,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/rust,
+/area/ruin/rockplanet/distillery/crew)
+"zJ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/structure/reagent_dispensers/fueltank,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"zX" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/machinery/door/poddoor/shutters{
+ dir = 4;
+ id = "dist_cargo"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"zZ" = (
+/obj/structure/girder,
+/obj/item/stack/ore/salvage/scrapmetal,
+/turf/open/floor/plating/rust,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ag" = (
+/obj/effect/turf_decal/siding/white/end,
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Ai" = (
+/obj/structure/grille,
+/obj/structure/cable/yellow,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+"Am" = (
+/obj/machinery/door/airlock/grunge{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"At" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-6"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-5"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Aw" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/rockplanet/distillery)
+"AC" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg1"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"AE" = (
+/obj/machinery/door/airlock/engineering,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"AI" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-10"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"AJ" = (
+/obj/structure/table/wood/reinforced,
+/obj/machinery/chem_dispenser/drinks{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"AV" = (
+/obj/machinery/atmospherics/components/unary/passive_vent/layer2,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"AY" = (
+/obj/item/stack/ore/salvage/scrapgold/five{
+ pixel_x = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/catwalk/over,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/rockplanet/distillery/engineering)
+"Be" = (
+/obj/structure/railing{
+ layer = 4.1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/retro/nanotrasen_logo_80s{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel/stairs{
+ dir = 4
+ },
+/area/ruin/rockplanet/distillery)
+"Bk" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 2
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Bn" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Bq" = (
+/obj/item/chair/stool/bar{
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Bs" = (
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Bx" = (
+/obj/structure/flora/ash/cap_shroom,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"BD" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/wrapping,
+/obj/item/storage/bottles/moonshine,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"BJ" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"BO" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"BT" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/sign/poster/retro/radio{
+ pixel_y = -32
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1;
+ filter_types = list("co2","bz","water_vapor","miasma","freon","pluox","tritium","n20","no2","nob");
+ widenet = 1
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken4"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"Ch" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/table/glass,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 8
+ },
+/obj/item/clipboard{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/obj/item/paper{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/obj/item/pen,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Cn" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "foam_plating"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Cp" = (
+/turf/closed/wall/r_wall/rust,
+/area/overmap_encounter/planetoid/cave/explored)
+"Cr" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/mob/living/simple_animal/hostile/human/frontier/internals,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Cz" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"CA" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/office)
+"CL" = (
+/obj/structure/fluff/glowshroom,
+/obj/machinery/button/door{
+ pixel_y = 26;
+ name = "Cargo Door";
+ id = "dist_cargo"
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"CM" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"CN" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "foam_plating"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"CQ" = (
+/obj/structure/table/wood/poker,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/item/spacecash/bundle/c1{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"CR" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg1"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"CS" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"CW" = (
+/obj/machinery/fax/admin/frontiersmen,
+/obj/structure/table/wood/reinforced,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/office)
+"Dk" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Dw" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"DE" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/closed/wall/rust,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"DW" = (
+/obj/effect/turf_decal/siding/white/end{
+ dir = 4
+ },
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"DX" = (
+/obj/structure/cable{
+ icon_state = "0-1"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-10"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ef" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/item/kirbyplants{
+ icon_state = "plant-21"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Ei" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/structure/fluff/glowshroom,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Ej" = (
+/obj/structure/table/wood/reinforced,
+/obj/structure/railing{
+ dir = 1;
+ layer = 2.7
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 8;
+ pixel_x = 4
+ },
+/obj/item/reagent_containers/food/drinks/mug/coco{
+ pixel_x = -6;
+ pixel_y = 8
+ },
+/obj/item/spacecash/bundle/c1{
+ pixel_x = -4
+ },
+/obj/item/spacecash/bundle/c10{
+ pixel_y = -2
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Ex" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"EF" = (
+/obj/structure/chair/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/mob/living/simple_animal/hostile/human/frontier/internals,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"EI" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "skull";
+ pixel_x = -16;
+ color = "#FF7742"
+ },
+/obj/effect/decal/cleanable/garbage,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Fk" = (
+/obj/machinery/light/floor,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Fm" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/east,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Fn" = (
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Fs" = (
+/obj/structure/flora/rock/rockplanet{
+ icon_state = "redrock2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ft" = (
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/structure/salvageable/machine,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"FA" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/office)
+"FB" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 5
+ },
+/obj/structure/railing/corner{
+ dir = 8;
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"FD" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"FI" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 8
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 14;
+ pixel_x = -4
+ },
+/obj/item/newspaper{
+ pixel_x = -4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Gb" = (
+/obj/structure/chair/stool/bar{
+ dir = 4;
+ pixel_x = 6
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Gc" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Gd" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Gg" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Go" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"GE" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light/small/directional/east,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"GH" = (
+/obj/structure/catwalk/over,
+/obj/structure/closet/crate/hydroponics,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 2
+ },
+/obj/item/seeds/corn,
+/obj/item/seeds/corn,
+/obj/item/seeds/corn,
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/food/condiment/enzyme,
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/snacks/grown/corn{
+ pixel_y = 4
+ },
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Hf" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4;
+ layer = 3.3
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic,
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_y = -6;
+ pixel_x = -22;
+ name = "Aft Door";
+ id = "pod_aft"
+ },
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_x = -32;
+ name = "Window Shutters";
+ id = "pod_window"
+ },
+/obj/machinery/door/window/brigdoor/northleft{
+ req_one_access_txt = "10"
+ },
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_y = 6;
+ pixel_x = -22;
+ name = "Fore Door";
+ id = "pod_fore"
+ },
+/obj/effect/decal/cleanable/oil,
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"Hg" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/poddoor/shutters,
+/obj/structure/grille,
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Hi" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Hu" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/item/mine/pressure/explosive/rusty/live{
+ layer = 2.8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Hv" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"HB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"HM" = (
+/obj/structure/table,
+/obj/item/reagent_scanner{
+ pixel_y = 18
+ },
+/obj/item/reagent_containers/glass/bucket{
+ pixel_x = 3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/glass/bucket{
+ pixel_x = -4;
+ pixel_y = 2
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"HO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"HT" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken4"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"Ig" = (
+/obj/structure/cable{
+ icon_state = "1-6"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ir" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken7"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"Iz" = (
+/obj/structure/closet/crate,
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/effect/spawner/lootdrop/random_computer_circuit_common,
+/obj/effect/spawner/lootdrop/maintenance/four,
+/obj/effect/spawner/lootdrop/random_machine_circuit_common,
+/obj/effect/spawner/lootdrop/random_machine_circuit_common,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"IA" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"IN" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"IS" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"IZ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ja" = (
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/structure/closet/crate/secure/weapon{
+ name = "ammo crate"
+ },
+/obj/item/ammo_box/a357{
+ pixel_x = -3
+ },
+/obj/item/ammo_box/magazine/illestren_a850r,
+/obj/item/ammo_box/c9mm/ap,
+/obj/item/ammo_box/magazine/illestren_a850r,
+/obj/item/ammo_box/magazine/co9mm{
+ start_empty = 1
+ },
+/obj/item/ammo_box/magazine/co9mm{
+ start_empty = 1
+ },
+/obj/item/ammo_box/a357{
+ pixel_x = 3
+ },
+/obj/machinery/button/door{
+ name = "Armory Door Lock";
+ pixel_y = -6;
+ pixel_x = -22;
+ normaldoorcontrol = 1;
+ specialfunctions = 4;
+ id = "frontier_armory";
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/office)
+"Jc" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Je" = (
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/stairs{
+ dir = 8
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"JC" = (
+/obj/item/chair,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"JD" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ pixel_x = -6;
+ pixel_y = 12
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"JI" = (
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JN" = (
+/obj/structure/flora/driftlog{
+ pixel_y = -15;
+ pixel_x = 9;
+ layer = 2.8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JO" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JP" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "5-8"
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JS" = (
+/obj/structure/table,
+/obj/item/kirbyplants{
+ icon_state = "plant-11";
+ pixel_y = 6
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"JZ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ka" = (
+/obj/structure/reagent_dispensers/beerkeg{
+ anchored = 1;
+ reagent_id = /datum/reagent/consumable/ethanol/moonshine;
+ name = "moonshine keg";
+ desc = "A keg full of liver-shredding spirits brewed by amateur bootleggers.";
+ pixel_x = -8;
+ layer = 2.8
+ },
+/obj/structure/reagent_dispensers/beerkeg{
+ anchored = 1;
+ reagent_id = /datum/reagent/consumable/ethanol/moonshine;
+ name = "moonshine keg";
+ desc = "A keg full of liver-shredding spirits brewed by amateur bootleggers.";
+ pixel_x = 8;
+ pixel_y = -2
+ },
+/obj/structure/reagent_dispensers/beerkeg{
+ anchored = 1;
+ reagent_id = /datum/reagent/consumable/ethanol/moonshine;
+ name = "moonshine keg";
+ desc = "A keg full of liver-shredding spirits brewed by amateur bootleggers.";
+ pixel_x = -4;
+ pixel_y = 14;
+ layer = 3
+ },
+/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Kf" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey{
+ pixel_y = 12;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass{
+ pixel_x = -8;
+ pixel_y = 2
+ },
+/obj/item/cigbutt{
+ pixel_y = 3
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Km" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/item/radio/intercom/directional/south,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-9"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-10"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"Kt" = (
+/turf/open/floor/plating/asteroid/rockplanet/wet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Kx" = (
+/obj/structure/salvageable/machine,
+/obj/effect/decal/cleanable/greenglow,
+/turf/open/floor/plating/asteroid/rockplanet/wet,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"KA" = (
+/turf/closed/wall/r_wall,
+/area/ruin/rockplanet/distillery/office)
+"KF" = (
+/obj/structure/flora/ash/cacti,
+/obj/machinery/light/directional/north,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"KV" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 6
+ },
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ld" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Lm" = (
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"LB" = (
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"LD" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/fluff/glowshroom,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light/dim/directional/north,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"LM" = (
+/obj/item/shard{
+ pixel_x = 12
+ },
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 9
+ },
+/obj/structure/holosign/barrier/wetsign/infinite,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"LW" = (
+/obj/structure/flora/ash/garden/arid,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Md" = (
+/obj/machinery/door/airlock/grunge{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Mf" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 9
+ },
+/obj/effect/turf_decal/siding/white/corner,
+/obj/structure/railing/corner{
+ layer = 4.1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Mm" = (
+/obj/structure/flora/ausbushes/sunnybush{
+ layer = 3
+ },
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Mr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/plastic,
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Mx" = (
+/obj/structure/cable{
+ icon_state = "1-10"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"MA" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/poddoor/shutters{
+ dir = 4;
+ id = "mudskipper_engine"
+ },
+/obj/structure/grille,
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery/saloon)
+"MD" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/broken/directional/east,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"MS" = (
+/obj/structure/closet/crate/bin,
+/obj/machinery/firealarm/directional/south{
+ buildstage = 0
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-5"
+ },
+/obj/machinery/light/small/directional/west,
+/obj/effect/spawner/lootdrop/maintenance/four,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken6"
+ },
+/area/ruin/rockplanet/distillery)
+"Nj" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/secure_closet/freezer/wall/directional/east,
+/obj/item/reagent_containers/food/snacks/chips,
+/obj/item/food/butterdog,
+/obj/item/reagent_containers/food/snacks/chips{
+ pixel_x = 2
+ },
+/obj/item/reagent_containers/food/drinks/bottle/rum{
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/food/snacks/canned/beans,
+/obj/item/spacecash/bundle/c500,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey{
+ pixel_x = 8
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Nk" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/structure/grille,
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Nr" = (
+/turf/template_noop,
+/area/template_noop)
+"Ns" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/cigbutt,
+/obj/item/cigbutt{
+ pixel_y = 8;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ pixel_x = -6;
+ pixel_y = 6
+ },
+/turf/open/floor/carpet,
+/area/ruin/rockplanet/distillery/crew)
+"Nx" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/holopad/emergency/bar,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"NC" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/ash{
+ pixel_x = -6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"NE" = (
+/obj/structure/flora/ausbushes/sparsegrass/hell{
+ name = "dead grass";
+ desc = "A sparse patch of grass without color.";
+ light_range = 0;
+ light_power = 1
+ },
+/obj/machinery/light/directional/north,
+/turf/open/floor/plating/asteroid/rockplanet/wet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"NM" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/computer/helm{
+ dir = 8;
+ layer = 3.3;
+ name = "Locked Helm Console";
+ desc = "No way you're getting this thing off the ground."
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic,
+/obj/structure/cable/yellow{
+ icon_state = "1-6"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"NR" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"NU" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-10"
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken2"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"Ob" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Od" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/chair/sofa/brown/old/corner/directional/south,
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals/neutered,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Oe" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-9"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Os" = (
+/obj/machinery/vending/snack/random{
+ tilted = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Ow" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable/yellow{
+ icon_state = "0-1"
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Oz" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"OB" = (
+/obj/structure/catwalk/over,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery/saloon)
+"OK" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"OO" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/structure/chair/sofa/brown/old/left/directional/north,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"OV" = (
+/obj/structure/closet/secure_closet{
+ icon_state = "armory";
+ name = "armor locker"
+ },
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/clothing/head/helmet/swat/nanotrasen,
+/obj/item/clothing/head/helmet/swat/nanotrasen,
+/obj/item/clothing/suit/armor/frontier,
+/obj/item/clothing/head/beret/sec/frontier,
+/obj/item/clothing/gloves/combat,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/office)
+"Pl" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "9-10"
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"PD" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 9
+ },
+/obj/machinery/atmospherics/components/unary/tank/air,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer2{
+ dir = 6
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"PI" = (
+/obj/machinery/power/shuttle/engine/electric{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+"PL" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 10
+ },
+/obj/effect/turf_decal/siding/white/corner{
+ dir = 4
+ },
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = -12;
+ pixel_y = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"PP" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals/neutered,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/shuttle)
+"PV" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"PZ" = (
+/obj/structure/bed,
+/obj/structure/curtain/cloth/grey,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Qm" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Qp" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Qr" = (
+/obj/structure/catwalk/over,
+/obj/item/storage/bottles/moonshine{
+ pixel_y = 6
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"QB" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"QP" = (
+/turf/closed/wall/r_wall/rust,
+/area/ruin/rockplanet/distillery/engineering)
+"Rd" = (
+/obj/structure/cable{
+ icon_state = "5-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "5-10"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Rn" = (
+/obj/structure/table/wood/reinforced,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{
+ pixel_y = 12;
+ pixel_x = 8
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Rp" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/obj/structure/cable/yellow{
+ icon_state = "1-5"
+ },
+/obj/machinery/light/small/directional/west,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Rr" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Ru" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Rw" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{
+ dir = 1
+ },
+/obj/item/trash/popcorn{
+ pixel_y = 12;
+ pixel_x = 7
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"RB" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 8
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "k";
+ pixel_x = -5;
+ color = "#0094FF"
+ },
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "u";
+ pixel_x = -16;
+ color = "#0094FF"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"RD" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "pod_aft"
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ruin/rockplanet/distillery/shuttle)
+"RM" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner,
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 9
+ },
+/obj/structure/railing/corner{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"RO" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"RR" = (
+/turf/closed/wall/r_wall,
+/area/ruin/rockplanet/distillery/crew)
+"Sk" = (
+/obj/effect/turf_decal/industrial/loading{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/paper/crumpled/muddy/fluff/distillery{
+ pixel_y = -12
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Sq" = (
+/obj/structure/closet/crate,
+/obj/effect/turf_decal/industrial/outline/red,
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null;
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null;
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ list_reagents = null;
+ pixel_x = 6
+ },
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Sr" = (
+/obj/effect/turf_decal/siding/wood/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"Ss" = (
+/obj/structure/flora/driftlog{
+ pixel_y = 2;
+ pixel_x = -6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Sx" = (
+/obj/structure/table/wood/reinforced,
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ pixel_y = 6;
+ pixel_x = 4
+ },
+/obj/item/reagent_containers/food/drinks/bottle/moonshine{
+ pixel_y = 2;
+ pixel_x = -6
+ },
+/obj/item/reagent_containers/food/drinks/bottle/hooch{
+ pixel_y = -4;
+ pixel_x = 7
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"SF" = (
+/obj/structure/girder,
+/obj/item/stack/ore/salvage/scrapmetal,
+/obj/item/stack/ore/salvage/scrapmetal,
+/turf/open/floor/plating/rust,
+/area/ruin/rockplanet/distillery/office)
+"SG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg2"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"SV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/photocopier,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/office)
+"Ta" = (
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Td" = (
+/obj/structure/table,
+/obj/item/reagent_containers/glass/chem_jug{
+ pixel_y = 4;
+ pixel_x = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/reagent_containers/glass/filter{
+ pixel_x = -9;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Tl" = (
+/obj/structure/flora/rock/pile/rockplanet,
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Tn" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/fluff/glowshroom,
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg1"
+ },
+/area/ruin/rockplanet/distillery)
+"To" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/directional/east,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Tp" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Tt" = (
+/obj/structure/catwalk/over,
+/turf/open/floor/plating/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"TB" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"TG" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"TK" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"TR" = (
+/obj/effect/turf_decal/industrial/hatch/yellow,
+/obj/item/storage/bottles/moonshine,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/crew)
+"TW" = (
+/obj/structure/chair/wood{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/mob/living/simple_animal/hostile/human/frontier/internals,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Uo" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/door/airlock/external,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"Uw" = (
+/obj/structure/chair/wood{
+ dir = 8;
+ pixel_x = -4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Ux" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Uy" = (
+/obj/structure/rack,
+/obj/item/clothing/suit/armor/frontier,
+/obj/item/clothing/head/fedora/det_hat{
+ pixel_x = -4
+ },
+/obj/item/clothing/head/beret/sec/frontier{
+ pixel_x = 4
+ },
+/obj/item/cigbutt{
+ pixel_x = 4
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"UA" = (
+/obj/structure/flora/rock/rockplanet{
+ icon_state = "redrock2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"UI" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood{
+ icon_state = "wood-broken6"
+ },
+/area/ruin/rockplanet/distillery/office)
+"UJ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"UU" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/siding/wood{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Va" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/machinery/door/airlock/grunge{
+ dir = 4;
+ id_tag = "frontier_armory";
+ locked = 1;
+ security_level = 4
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery/office)
+"Vf" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/obj/structure/fluff/glowshroom,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/bin,
+/obj/effect/spawner/lootdrop/maintenance/three,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/crew)
+"Vg" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 5
+ },
+/obj/structure/closet/crate/bin,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ filter_types = list("co2","bz","water_vapor","miasma","freon","pluox","tritium","n20","no2","nob");
+ widenet = 1
+ },
+/obj/machinery/light/small/broken/directional/east,
+/obj/effect/spawner/lootdrop/maintenance/three,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Vj" = (
+/obj/effect/turf_decal/ntlogo,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_y = 12
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/crew)
+"Vx" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white,
+/obj/structure/railing{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Vz" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"VG" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/machinery/light/directional/east,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"VJ" = (
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/sign/warning/electricshock{
+ pixel_y = 28
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/engineering)
+"VM" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ruin/rockplanet/distillery/engineering)
+"VO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light/dim/directional/north,
+/turf/open/floor/wood{
+ icon_state = "wood-broken"
+ },
+/area/ruin/rockplanet/distillery/crew)
+"VP" = (
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white/corner,
+/obj/structure/railing/corner{
+ layer = 4.1
+ },
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"VW" = (
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Wc" = (
+/turf/closed/wall,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Wg" = (
+/obj/structure/cable{
+ icon_state = "5-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Wj" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/structure/chair/office{
+ dir = 8
+ },
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals/neutered,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Wm" = (
+/obj/structure/table/wood/poker,
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 10
+ },
+/obj/item/spacecash/bundle/c1{
+ pixel_y = 8
+ },
+/obj/item/spacecash/bundle/c100,
+/obj/item/spacecash/bundle/c10{
+ pixel_x = 4
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Wp" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/wood/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Wu" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/distillery/saloon)
+"WB" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/opaque/neutral/filled/line,
+/turf/open/floor/plasteel/patterned/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"WE" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xf" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-6"
+ },
+/turf/open/floor/plating/rockplanet/lit{
+ icon_state = "platingdmg2"
+ },
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xg" = (
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xl" = (
+/obj/structure/table/wood/reinforced,
+/obj/machinery/chem_dispenser/drinks/beer{
+ dir = 8
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"Xn" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"Xq" = (
+/obj/structure/chair/office,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/button/door{
+ name = "Armory Door Lock";
+ pixel_y = 24;
+ pixel_x = 6;
+ normaldoorcontrol = 1;
+ specialfunctions = 4;
+ id = "frontier_armory"
+ },
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals,
+/turf/open/floor/wood,
+/area/ruin/rockplanet/distillery/office)
+"XD" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/machinery/door/airlock/grunge{
+ dir = 4;
+ id_tag = "frontier_door"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"XF" = (
+/obj/item/shard{
+ pixel_y = 8
+ },
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plating/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"XU" = (
+/obj/structure/railing/corner{
+ layer = 4.1
+ },
+/obj/effect/turf_decal/siding/white{
+ dir = 9
+ },
+/obj/effect/turf_decal/siding/white/corner,
+/obj/item/kirbyplants{
+ icon_state = "plant-25";
+ pixel_y = 12;
+ pixel_x = -2
+ },
+/obj/effect/decal/cleanable/glass,
+/obj/effect/decal/cleanable/ash,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"XV" = (
+/obj/effect/turf_decal/ntlogo{
+ dir = 4
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/ash,
+/obj/item/cigbutt{
+ pixel_x = -3;
+ pixel_y = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-10"
+ },
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery)
+"XY" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/rockplanet{
+ icon_state = "wood-broken5"
+ },
+/area/ruin/rockplanet/distillery/saloon)
+"Yh" = (
+/obj/machinery/door/airlock/grunge,
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/pod/rockplanet,
+/area/ruin/rockplanet/distillery)
+"Yo" = (
+/obj/item/mine/pressure/explosive/live,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Yq" = (
+/obj/machinery/door/airlock{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/pod,
+/area/ruin/rockplanet/distillery/crew)
+"YE" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/cracked/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Zh" = (
+/obj/structure/catwalk/over,
+/turf/open/floor/plating/rust/rockplanet/lit,
+/area/ruin/rockplanet/distillery)
+"Zm" = (
+/obj/effect/turf_decal/spline/fancy/opaque/white{
+ dir = 6
+ },
+/obj/item/reagent_containers/food/snacks/deadmouse{
+ pixel_x = 8;
+ pixel_y = 6;
+ layer = 2.9
+ },
+/obj/structure/chair/sofa/brown/old/corner/directional/west,
+/turf/open/floor/plasteel/patterned/brushed/rockplanet,
+/area/ruin/rockplanet/distillery/saloon)
+"ZX" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/power/smes/shuttle/micro/precharged{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ruin/rockplanet/distillery/shuttle)
+
+(1,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(2,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(3,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(4,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+jE
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(5,1,1) = {"
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(6,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+RR
+RR
+RR
+RR
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(7,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+RR
+pL
+PL
+RR
+hY
+hY
+hY
+hY
+hY
+lD
+hY
+hY
+lD
+hY
+hY
+Cp
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(8,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+RR
+lE
+TG
+RR
+RR
+hY
+hY
+hY
+Bk
+bm
+bm
+bm
+bm
+bm
+bm
+bm
+mY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(9,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+RR
+RR
+RR
+uy
+Vz
+cf
+RR
+hY
+hY
+Cp
+WB
+be
+LB
+LB
+ji
+ji
+LB
+Fk
+kT
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(10,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+RR
+yO
+gM
+Xn
+Gg
+zn
+RR
+hY
+hY
+hY
+WB
+LB
+uG
+lU
+RD
+lU
+uG
+hi
+kT
+nR
+oq
+ky
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(11,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+RR
+DW
+lE
+dP
+cA
+Ob
+RR
+hY
+hY
+hY
+WB
+LB
+PI
+lU
+BD
+lU
+oY
+LB
+kT
+nR
+qw
+qj
+ky
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(12,1,1) = {"
+Nr
+qQ
+hY
+hY
+uL
+uL
+xT
+xT
+xT
+lE
+nm
+RR
+RR
+RR
+RR
+WB
+LB
+ZX
+Hf
+mF
+vo
+jm
+ji
+Qm
+nR
+nR
+nR
+tw
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(13,1,1) = {"
+Nr
+LW
+qQ
+aC
+QP
+PD
+nf
+zw
+xT
+kO
+Rw
+zk
+tP
+sm
+RR
+wU
+ji
+qm
+NM
+PP
+bI
+Ai
+XF
+kT
+nR
+nR
+oq
+qQ
+ky
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(14,1,1) = {"
+nR
+Kt
+ky
+AV
+wH
+xf
+bH
+jO
+AE
+NC
+zy
+hH
+GE
+av
+Uo
+WB
+ji
+lU
+lU
+Km
+lU
+lU
+uG
+kT
+nR
+nR
+qQ
+Kx
+lc
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(15,1,1) = {"
+nR
+nR
+qQ
+wb
+uL
+uS
+zJ
+AY
+xT
+Vg
+jF
+RR
+RR
+RR
+RR
+WB
+LB
+ji
+lU
+uv
+lU
+ji
+LB
+kT
+nR
+rH
+ed
+rH
+rH
+ed
+ed
+rH
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(16,1,1) = {"
+nR
+ky
+oq
+hY
+uL
+VJ
+wV
+VM
+xT
+lE
+Yq
+lE
+Gc
+kC
+yS
+WB
+Fk
+LB
+LB
+dE
+ji
+ji
+Fk
+kT
+nR
+rH
+Td
+HM
+fl
+Sk
+Mr
+rH
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
+(17,1,1) = {"
+Nr
+hY
+hY
+hY
+uL
+dK
+cS
+ne
+xT
+nr
+TB
+xA
+jX
+JS
+yS
+nU
+nT
+JZ
+fO
+hS
+RM
+JZ
+nT
+wd
+nR
+rH
+CS
+Tt
+Qp
+Tn
+yI
+rH
+ed
+ed
+rH
+rH
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+"}
+(18,1,1) = {"
+hY
+hY
+hY
+hY
+uL
+uL
+xT
+xT
+xT
+aB
+tB
+eG
+sx
+kd
+RR
+Tl
+Ru
+nR
+wz
+me
+kT
+nR
+nR
+nR
+gg
+ed
+GH
+ze
+vF
+aE
+to
+rH
+Sx
+xc
+tA
+rH
+hY
+hY
+hY
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+"}
+(19,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+KA
+Lm
+ut
+jM
+kU
+Ns
+nA
+qo
+RR
+RR
+RR
+yS
+NR
+KV
+me
+kT
+nR
+Xg
+Xg
+Xg
+ed
+yf
+vD
+fv
+QB
+Ow
+rH
+XU
+Wj
+fM
+Hg
+hY
+hY
+hY
+hY
+hY
+hY
+nR
+Nr
+Nr
+"}
+(20,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+KA
+lK
+te
+jM
+Od
+bX
+zx
+bS
+RR
+TR
+ng
+qX
+Fn
+Fn
+ws
+kT
+nR
+rH
+ed
+rH
+rH
+rH
+rH
+rH
+XD
+rH
+rH
+Be
+Zh
+pD
+Hg
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+nR
+Nr
+"}
+(21,1,1) = {"
+Nr
+Nr
+hY
+hY
+hY
+KA
+jM
+Am
+jM
+jM
+jM
+NU
+PZ
+RR
+bd
+kq
+RR
+IZ
+fO
+ws
+kT
+Xg
+rH
+cP
+fJ
+fW
+rH
+mq
+qu
+uU
+MS
+rH
+wX
+mX
+fs
+ed
+hY
+hY
+hY
+hY
+hY
+Tl
+Xg
+nR
+Nr
+"}
+(22,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+KA
+ih
+qY
+xO
+CW
+jM
+mk
+lE
+RR
+Iz
+rT
+yS
+NE
+wz
+hS
+kT
+Xg
+Nk
+om
+Aw
+Dk
+Yh
+ah
+dJ
+XV
+kZ
+Yh
+Ld
+uw
+Ft
+Hg
+hY
+hY
+hY
+hY
+Wc
+Dw
+Xg
+nR
+nR
+"}
+(23,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+KA
+lL
+mv
+eh
+yL
+jM
+VO
+Vf
+zk
+sQ
+rT
+yS
+qj
+wz
+iT
+kT
+dw
+Nk
+Sq
+Cr
+co
+rH
+sb
+gU
+jI
+bu
+rH
+qe
+UJ
+hP
+Hg
+hY
+hY
+hY
+Wc
+uX
+oh
+nR
+nR
+nR
+"}
+(24,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+KA
+Xq
+gA
+FA
+gv
+CA
+bz
+Vj
+zk
+TR
+kq
+yS
+Kt
+wz
+hS
+kT
+Tl
+ed
+CL
+wT
+VW
+rH
+Nk
+Nk
+Nk
+Nk
+rH
+Ch
+UU
+nY
+rH
+hY
+hY
+Xg
+pM
+Cn
+Fs
+nR
+nR
+nR
+"}
+(25,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+KA
+wx
+pQ
+bY
+aJ
+jM
+RB
+EI
+zk
+en
+nX
+RR
+nR
+WB
+ws
+Qm
+nR
+rH
+zX
+vf
+zX
+rH
+Mm
+Bx
+Kt
+ky
+rH
+rH
+xs
+ed
+rH
+Xg
+mp
+AI
+DE
+jS
+Xg
+qw
+nR
+nR
+"}
+(26,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+KA
+vX
+Oz
+UI
+SV
+jM
+xN
+BT
+RR
+zk
+zk
+yS
+KF
+wz
+ws
+kT
+nR
+Mm
+rs
+hS
+Vx
+nR
+nR
+nR
+uE
+qj
+qQ
+rs
+Bn
+Rp
+nR
+nR
+nR
+dI
+uk
+Xg
+re
+Yo
+nR
+Nr
+"}
+(27,1,1) = {"
+hY
+hY
+hY
+hY
+hY
+KA
+KA
+Va
+KA
+KA
+jM
+LD
+Rr
+zk
+tP
+sm
+RR
+NR
+KV
+aG
+FB
+lS
+uf
+IN
+Wg
+bT
+uf
+uf
+wk
+uf
+uf
+uf
+tx
+Rd
+bT
+uf
+uf
+bm
+JP
+uk
+Xg
+nR
+nR
+Nr
+Nr
+"}
+(28,1,1) = {"
+Nr
+hY
+hY
+hY
+hY
+SF
+Ja
+ql
+OV
+RR
+dZ
+Go
+Gd
+br
+GE
+av
+Uo
+HB
+yw
+RO
+Ex
+Xf
+JO
+fF
+Oe
+WE
+Hv
+Ig
+CR
+HB
+wy
+HB
+Mx
+wy
+HB
+AC
+SG
+DX
+Qm
+nR
+nR
+nR
+nR
+nR
+Nr
+"}
+(29,1,1) = {"
+Nr
+Nr
+hY
+hY
+hY
+KA
+KA
+cp
+yW
+RR
+Os
+eF
+Ef
+RR
+yS
+RR
+yS
+IZ
+nT
+nT
+JZ
+JZ
+Pl
+kn
+Cz
+kn
+kn
+vC
+lQ
+VP
+kn
+kn
+Cz
+kn
+kn
+iy
+kn
+hy
+PV
+nR
+nR
+nR
+nR
+nR
+nR
+"}
+(30,1,1) = {"
+Nr
+Nr
+hY
+hY
+hY
+hY
+KA
+KA
+KA
+RR
+RR
+RR
+yS
+yS
+Xg
+Ru
+nR
+nR
+Dw
+Dw
+nR
+nR
+re
+uE
+nR
+qQ
+ky
+Fm
+CN
+Vx
+ky
+em
+Kt
+nR
+LM
+gk
+Xg
+YE
+At
+uk
+Xg
+dw
+Xg
+Hu
+nR
+"}
+(31,1,1) = {"
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Xg
+nR
+qw
+nR
+Cn
+dU
+nR
+nR
+VG
+Kt
+qj
+Wu
+Wu
+BJ
+Wu
+Wu
+Wu
+MA
+MA
+cw
+Wu
+Wu
+aj
+ir
+pm
+yr
+Dw
+Xg
+qw
+nR
+"}
+(32,1,1) = {"
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Tl
+Xg
+nR
+Cn
+nR
+Dw
+JN
+Xg
+Wu
+Wu
+Wu
+Wu
+Wu
+Wu
+Mf
+oU
+Ag
+Wu
+uP
+JC
+pa
+mE
+OB
+Wu
+hY
+hY
+Wc
+DE
+dn
+Xg
+nR
+nR
+"}
+(33,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Ta
+Dw
+nR
+nR
+Xg
+wB
+Wu
+HO
+TW
+tQ
+Wp
+Wu
+Je
+hA
+Uy
+Wu
+ba
+Rn
+IA
+Ej
+OK
+Wu
+hY
+hY
+hY
+Wc
+Dw
+oO
+Xg
+nR
+"}
+(34,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Bs
+JI
+JI
+Cn
+Xg
+rh
+Ru
+Wu
+IS
+gw
+Wm
+Tp
+Wu
+Jc
+Sr
+BO
+mK
+TK
+Hi
+tc
+XY
+Wp
+Wu
+hY
+hY
+hY
+hY
+Dw
+Cn
+Xg
+nR
+"}
+(35,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+Xg
+Cn
+Xg
+Dw
+Dw
+gg
+zZ
+Wc
+hY
+Wu
+EF
+si
+CQ
+Tp
+CM
+cQ
+oD
+Ir
+mK
+sy
+Gb
+Bq
+To
+Ux
+Wu
+hY
+hY
+hY
+hY
+Tl
+Xg
+Xg
+nR
+"}
+(36,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+Xg
+Ss
+Xg
+UA
+Cn
+nR
+rW
+Fs
+hY
+hY
+Wu
+sE
+MD
+Uw
+Ux
+Wu
+hN
+FI
+OO
+Wu
+hq
+JD
+Kf
+Wu
+Md
+Wu
+Wu
+hY
+hY
+hY
+Cn
+Fs
+nR
+nR
+"}
+(37,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+nR
+nR
+nR
+qw
+gu
+nR
+nR
+Xg
+Xg
+hY
+hY
+Wu
+Wu
+Wu
+Wu
+Wu
+Wu
+rF
+rJ
+Zm
+Wu
+Qr
+Nx
+Ei
+Wu
+xM
+Ka
+Wu
+hY
+hY
+hY
+hY
+Xg
+nR
+nR
+"}
+(38,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+nR
+nR
+nR
+nR
+nR
+Tl
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Wu
+Wu
+Wu
+Wu
+Wu
+HT
+OB
+Nj
+CM
+FD
+gX
+Wu
+hY
+hY
+hY
+hY
+Xg
+nR
+Nr
+"}
+(39,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+nR
+nR
+nR
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Wu
+Xl
+AJ
+Wu
+Wu
+Wu
+Wu
+Wu
+hY
+hY
+hY
+hY
+Xg
+nR
+Nr
+"}
+(40,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Wu
+Wu
+Wu
+Wu
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Xg
+nR
+"}
+(41,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Xg
+Xg
+nR
+"}
+(42,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Xg
+nR
+nR
+Nr
+"}
+(43,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+hY
+hY
+Nr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+Xg
+Xg
+Xg
+Xg
+nR
+Nr
+Nr
+"}
+(44,1,1) = {"
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+hY
+hY
+hY
+Nr
+Nr
+hY
+hY
+hY
+Nr
+hY
+hY
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+"}
diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
index f59cff023b4a..485303fb66c3 100644
--- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
+++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm
@@ -213,7 +213,7 @@
/turf/open/floor/plating,
/area/ruin)
"ii" = (
-/obj/item/ammo_box/aac_300blk_stripper,
+/obj/item/ammo_box/a762_stripper,
/turf/open/floor/wood,
/area/ruin)
"iK" = (
@@ -1066,7 +1066,7 @@
/turf/open/floor/wood,
/area/ruin)
"Ok" = (
-/turf/open/acid/whitesands,
+/turf/open/water/acid/whitesands,
/area/overmap_encounter/planetoid/sand/explored)
"Ov" = (
/obj/item/clothing/head/cowboy{
@@ -1184,8 +1184,8 @@
/area/ruin)
"Tl" = (
/obj/structure/table,
-/obj/item/ammo_box/aac_300blk_stripper,
-/obj/item/ammo_box/aac_300blk_stripper,
+/obj/item/ammo_box/a762_stripper,
+/obj/item/ammo_box/a762_stripper,
/turf/open/floor/concrete,
/area/ruin)
"TH" = (
diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
index 85f087ec38a9..0ee697760b25 100644
--- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm
+++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm
@@ -2034,12 +2034,6 @@
},
/turf/open/space,
/area/space/nearstation)
-"Ra" = (
-/obj/structure/frame/computer{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/ruin/space/has_grav/onehalf)
"Rv" = (
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/airless{
@@ -3328,7 +3322,7 @@ UM
cp
ZX
Gv
-Ra
+Gv
cU
YE
bU
diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
index b76ae63a86e7..3d05cfb13d35 100644
--- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
+++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
@@ -1739,7 +1739,7 @@
/area/ruin/space/has_grav/powerpuzzle/secure)
"sc" = (
/obj/effect/mob_spawn/human/corpse/cargo_tech,
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday,
+/obj/item/food/cakeslice/birthday,
/obj/effect/decal/cleanable/confetti,
/obj/machinery/light/small/broken/directional/east,
/obj/structure/toilet,
diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
index 45591d25dde5..99ccda138d00 100644
--- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
+++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm
@@ -3490,7 +3490,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
dir = 9
},
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/turf/open/floor/carpet/nanoweave/beige,
/area/ruin/space/has_grav/singularitylab/cargo)
"nT" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
index 0f5d01fb7de8..eb48bcae1626 100644
--- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
@@ -3606,7 +3606,7 @@
/area/ruin/space/has_grav/spacemall/shop)
"nS" = (
/obj/effect/turf_decal/corner/transparent/black/diagonal,
-/obj/item/reagent_containers/food/snacks/store/bread/spidermeat,
+/obj/item/food/bread/spidermeat,
/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/spacemall/dorms)
@@ -6776,7 +6776,7 @@
dir = 8
},
/obj/item/trash/plate,
-/obj/item/reagent_containers/food/snacks/breadslice/moldy{
+/obj/item/food/breadslice/moldy{
pixel_y = 6
},
/obj/item/reagent_containers/food/snacks/spiderling{
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm
index 31c53d09a82e..e1a64004decb 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm
@@ -1398,7 +1398,7 @@
dir = 4
},
/obj/machinery/door/airlock/engineering{
- name = "Mech Lab";
+ name = "Exosuit Lab";
dir = 4
},
/obj/machinery/door/firedoor/border_only{
@@ -2577,7 +2577,7 @@
/area/ruin/wasteplanet/abandoned_mechbay/mechlab)
"DY" = (
/obj/machinery/door/airlock/engineering{
- name = "Mech Lab";
+ name = "Exosuit Lab";
dir = 4
},
/obj/effect/decal/cleanable/glass,
@@ -2723,7 +2723,7 @@
},
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/human/syndicate/melee{
- name = "Syndicate Mech Pilot"
+ name = "Syndicate Exosuit Pilot"
},
/turf/open/floor/plasteel/tech/techmaint,
/area/ruin/wasteplanet/abandoned_mechbay/crewquarters)
@@ -2771,7 +2771,7 @@
"Hj" = (
/obj/machinery/light/dim/directional/south,
/mob/living/simple_animal/hostile/human/syndicate/melee{
- name = "Syndicate Mech Pilot"
+ name = "Syndicate Exosuit Pilot"
},
/turf/open/floor/plasteel/tech/techmaint,
/area/ruin/wasteplanet/abandoned_mechbay/bay2)
@@ -3016,7 +3016,7 @@
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/light/directional/south,
/mob/living/simple_animal/hostile/human/syndicate/melee{
- name = "Syndicate Mech Pilot"
+ name = "Syndicate Exosuit Pilot"
},
/turf/open/floor/plasteel/dark,
/area/ruin/wasteplanet/abandoned_mechbay/bay1)
diff --git a/_maps/configs/independent_dwayne.json b/_maps/configs/independent_dwayne.json
index 64f68af68752..26027d6fb524 100644
--- a/_maps/configs/independent_dwayne.json
+++ b/_maps/configs/independent_dwayne.json
@@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Mark.II Dwayne-class Long Range Mining Transport",
- "prefix": "ISV",
+ "prefix": "SV",
"namelists": [
"GENERAL",
"SPACE",
@@ -10,11 +10,12 @@
],
"map_short_name": "Mk.II Dwayne-class ",
"map_path": "_maps/shuttles/independent/independent_dwayne.dmm",
- "description": "The Dwayne is one of the older classes of ships commonly seen on the Frontier, and one of the few such classes that doesn’t also carry a reputation for nightmarish conditions or high accident rates. Originally conceived of as a “mothership” for Nanotrasen mining shuttles that could enable long-duration mining missions at minimal cost, severe budget overruns and issues with the mining shuttle docking system left Nanotrasen with a massive number of mostly-completed hulls upon the project’s cancellation. These hulls were then quickly refurbished and sold on the civilian market, where they proved an immediate success on the Frontier. Contemporary Dwaynes can typically be found carrying a variety of mining equipment and extensive modifications unique to their captains. Recently-available aftermarket modifications have solved the Dwayne’s longstanding shuttle dock issues, allowing modern Dwaynes to finally serve their original design purpose, provided the captain is able to source a shuttle.",
+ "description": "The Dwayne is one of the older classes of ships commonly seen on the Frontier, and one of the few such classes that doesn’t also carry a reputation for nightmarish conditions or high accident rates. Originally conceived of as a “mothership” for Nanotrasen mining shuttles that could enable long-duration mining missions at minimal cost, severe budget overruns and issues with the mining shuttle docking system left Nanotrasen with a massive number of mostly-completed hulls upon the project’s cancellation. These hulls were then quickly refurbished and sold on the civilian market, where they proved an immediate success on the Frontier. Contemporary Dwaynes can typically be found carrying a variety of mining equipment and extensive modifications unique to their captains.",
"tags": [
"Mining",
- "Generalist"
+ "Cargo"
],
+ "starting_funds": 4000,
"limit": 1,
"job_slots": {
"Captain": {
@@ -24,23 +25,20 @@
},
"Foreman": {
"outfit": "/datum/outfit/job/independent/quartermaster/western",
- "slots": 1
- },
- "Ship's Doctor": {
- "outfit": "/datum/outfit/job/independent/doctor",
- "slots": 1
- },
- "Ship's Engineer": {
- "outfit": "/datum/outfit/job/independent/engineer",
+ "officer": true,
"slots": 1
},
"Asteroid Miner": {
"outfit": "/datum/outfit/job/independent/miner/hazard",
"slots": 2
},
+ "Mechanic": {
+ "outfit": "/datum/outfit/job/independent/engineer",
+ "slots": 1
+ },
"Deckhand": {
"outfit": "/datum/outfit/job/independent/assistant",
- "slots": 3
+ "slots": 1
}
},
"enabled": true
diff --git a/_maps/configs/independent_kilo.json b/_maps/configs/independent_kilo.json
index b1304f2e78bb..cab2eb292c51 100644
--- a/_maps/configs/independent_kilo.json
+++ b/_maps/configs/independent_kilo.json
@@ -1,40 +1,36 @@
{
"$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json",
"map_name": "Kilo-class Mining Ship",
- "description": "The Kilo-class is a miniscule mining ship that stretches the definition of an independently-capable spacecraft. Beginning life long ago as a series of purpose-built mining shuttles intended for use on Frontier outposts, progressive cycles of over-engineering for a longer mission duration eventually produced the lumpen, claustrophobic Kilo seen today. Once quite numerous, Kilos are still a common “barn find” on abandoned stations and forgotten storage bays, and their extreme age and poor storage conditions typically leaves them in especially poor condition. Kilo crews are often considered to be quite eccentric even by Frontier standards, and some spacers insist even a well-balanced spacer will quickly come unglued in the Kilo’s “unique” environment.",
+ "description": "The Kilo-class is a very old and miniscule pattern of mining ship, produced in vast numbers over the centuries and commonly found in scrapyards or forgotten in storage. Most examples on the Frontier have been restored by Miskilamo Spacefaring using parts from other nonfunctional Kilos, producing a ship that is as inexpensive as it is cramped and unreliable. The low cost and ease of repair or replacement nevertheless make the Kilo very popular among budget-minded captains.",
"tags": [
- "Generalist"
+ "Mining"
],
- "prefix": "ISV",
+ "prefix": "SV",
"namelists": [
"GENERAL",
"SPACE",
"NATURAL"
],
"map_short_name": "Kilo-class",
- "starting_funds": 1500,
+ "starting_funds": 3500,
"map_path": "_maps/shuttles/independent/independent_kilo.dmm",
"job_slots": {
"Captain": {
- "outfit": "/datum/outfit/job/independent/captain/western",
+ "outfit": "/datum/outfit/job/independent/captain/cheap",
"officer": true,
"slots": 1
},
- "Ship's Doctor": {
- "outfit": "/datum/outfit/job/independent/doctor",
+ "Asteroid Miner": {
+ "outfit": "/datum/outfit/job/independent/miner/hazard",
"slots": 1
},
- "Ship's Engineer": {
+ "Mechanic": {
"outfit": "/datum/outfit/job/independent/engineer",
"slots": 1
},
- "Asteroid Miner": {
- "outfit": "/datum/outfit/job/independent/miner",
- "slots": 1
- },
"Deckhand": {
"outfit": "/datum/outfit/job/independent/assistant",
- "slots": 1
+ "slots": 2
}
},
"enabled": true
diff --git a/_maps/configs/independent_rigger.json b/_maps/configs/independent_rigger.json
index e36b57ca750a..9fce68833fa0 100644
--- a/_maps/configs/independent_rigger.json
+++ b/_maps/configs/independent_rigger.json
@@ -8,7 +8,7 @@
"NATURAL"
],
"map_short_name": "Riggs-class",
- "description": "The Riggs-class is Kasagi-Fischer Partnership’s mainstay in the independent ship market. Spacious, affordable, and versatile, the Riggs offers basic capabilities for everything a Frontier spacer might need in a convenient, easy-to-modify platform, and by default come equipped with a basic medbay, a small security office, atmospherics recycling and equipment to support an APLU utility mech. Thanks to this versatility, the Riggs has become extremely popular among moderately-wealthy independent captains, and can be found doing everything from mining to shipping to surveying Frontier planets.",
+ "description": "The Riggs-class is Kasagi-Fischer Partnership’s mainstay in the independent ship market. Spacious, affordable, and versatile, the Riggs offers basic capabilities for everything a Frontier spacer might need in a convenient, easy-to-modify platform, and by default come equipped with a basic medbay, a small security office, atmospherics recycling and equipment to support an APLU utility exosuit. Thanks to this versatility, the Riggs has become extremely popular among moderately-wealthy independent captains, and can be found doing everything from mining to shipping to surveying Frontier planets.",
"tags": [
"Mining",
"Medical",
diff --git a/_maps/configs/inteq_talos.json b/_maps/configs/inteq_talos.json
index 54f134964470..858255729809 100644
--- a/_maps/configs/inteq_talos.json
+++ b/_maps/configs/inteq_talos.json
@@ -40,9 +40,13 @@
"outfit": "/datum/outfit/job/inteq/security",
"slots": 1
},
+ "Corpsman": {
+ "outfit": "/datum/outfit/job/inteq/paramedic",
+ "slots": 1
+ },
"Recruit": {
"outfit": "/datum/outfit/job/inteq/assistant",
- "slots": 4
+ "slots": 4
}
},
"enabled": true
diff --git a/_maps/configs/nanotrasen_heron.json b/_maps/configs/nanotrasen_heron.json
index 80bf87c0cd15..45264c827156 100644
--- a/_maps/configs/nanotrasen_heron.json
+++ b/_maps/configs/nanotrasen_heron.json
@@ -45,7 +45,7 @@
"outfit": "/datum/outfit/job/nanotrasen/security/ert/engi",
"slots": 1
},
- "Mech Pilot":{
+ "Exosuit Pilot":{
"outfit": "/datum/outfit/job/nanotrasen/security/mech_pilot",
"slots": 1
},
diff --git a/_maps/configs/pgf_crying_sun.json b/_maps/configs/pgf_crying_sun.json
index d4eb67b1fb50..23114c8aa274 100644
--- a/_maps/configs/pgf_crying_sun.json
+++ b/_maps/configs/pgf_crying_sun.json
@@ -21,7 +21,7 @@
"officer": true,
"slots": 1
},
- "Bridge Crew": {
+ "Helmsman": {
"outfit": "/datum/outfit/job/gezena/assistant/bridge",
"slots": 1
},
@@ -37,7 +37,7 @@
"outfit": "/datum/outfit/job/gezena/assistant",
"slots": 2
},
- "Marine Sergeant": {
+ "Marine Lieutenant": {
"outfit": "/datum/outfit/job/gezena/hos",
"slots": 1
},
diff --git a/_maps/map_catalogue.txt b/_maps/map_catalogue.txt
index 5d941ef7fd60..7309dbb6f42b 100644
--- a/_maps/map_catalogue.txt
+++ b/_maps/map_catalogue.txt
@@ -90,10 +90,15 @@ Find the key for using this catalogue in "map_catalogue_key.txt"
Size = (x = 47)(y = 47)(z = 1)
Tags = "Boss Combat Challenge", "Major Loot", "Shelter", "Lava"
- File Name = "_maps\RandomRuins\BeachRuins\lavaland_crashed_starwalker.dmm"
+ File Name = "_maps\RandomRuins\LavaRuins\lavaland_crashed_starwalker.dmm"
Size = (x = 33)(y = 56)(z = 1)
Tags = "Minor Combat Challenge", "Medium Loot", "Lava"
+ File Name = "_maps\RandomRuins\LavaRuins\lavaland_abandonedlisteningpost.dmm"
+ Size = (x = 33)(y = 56)(z = 1)
+ Tags = "Medium Combat Challenge", "Medium Loot", "Shelter"
+
+
ReebeRuins:
File Name = "_maps\RandomRuins\Ruins\reebe_swarmers.dmm"
Size = (x = 20)(y = 20)(z = 1)
@@ -129,6 +134,10 @@ Find the key for using this catalogue in "map_catalogue_key.txt"
Size = (x = 58)(y = 48)(z = 1)
Tags = "Medium Combat Challenge", "Medium Loot", "Hazardous", "Hospitable"
+ File Name = "_maps\RandomRuins\RockRuins\rockplanet_distillery.dmm"
+ Size = (x = 44)(y = 45)(z = 1)
+ Tags = "Medium Combat Challenge", "Major Loot", "Hazardous", "Hospitable"
+
SandRuins:
File Name = "_maps\RandomRuins\Ruins\whitesands_surface_camp_saloon.dmm"
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index ff8c37d19e96..de0cba96be2f 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -1084,11 +1084,11 @@
/area/centcom/control)
"apm" = (
/obj/structure/rack,
-/obj/item/gun/ballistic/automatic/marksman/gal/inteq{
+/obj/item/gun/ballistic/automatic/marksman/f4/inteq{
pixel_x = 1;
pixel_y = 4
},
-/obj/item/gun/ballistic/automatic/marksman/gal/inteq{
+/obj/item/gun/ballistic/automatic/marksman/f4/inteq{
pixel_x = -4;
pixel_y = -2
},
@@ -3043,10 +3043,6 @@
/obj/structure/table/wood,
/turf/open/floor/plasteel,
/area/wizard_station)
-"aEX" = (
-/obj/structure/table/wood,
-/turf/open/floor/plasteel,
-/area/wizard_station)
"aEY" = (
/obj/structure/table/wood,
/obj/item/bikehorn/golden{
@@ -11574,8 +11570,8 @@
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
-/obj/item/reagent_containers/food/snacks/spaghetti,
-/obj/item/reagent_containers/food/snacks/spaghetti,
+/obj/item/food/spaghetti/raw,
+/obj/item/food/spaghetti/raw,
/obj/item/reagent_containers/food/snacks/meat/rawcutlet,
/obj/item/reagent_containers/food/snacks/meat/rawcutlet,
/obj/item/reagent_containers/food/snacks/meat/rawcutlet,
@@ -23766,7 +23762,7 @@ auE
aEc
auE
aAx
-aEX
+aEW
aqZ
aqZ
aGr
diff --git a/_maps/outpost/hangar/nt_asteroid_20x20.dmm b/_maps/outpost/hangar/nt_asteroid_20x20.dmm
index 118f810e93f8..858d984f4603 100644
--- a/_maps/outpost/hangar/nt_asteroid_20x20.dmm
+++ b/_maps/outpost/hangar/nt_asteroid_20x20.dmm
@@ -370,7 +370,7 @@
},
/area/hangar)
"jw" = (
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/obj/structure/railing{
dir = 8;
layer = 4.1
diff --git a/_maps/outpost/hangar/nt_asteroid_40x20.dmm b/_maps/outpost/hangar/nt_asteroid_40x20.dmm
index b57c4972362c..312e0443aeea 100644
--- a/_maps/outpost/hangar/nt_asteroid_40x20.dmm
+++ b/_maps/outpost/hangar/nt_asteroid_40x20.dmm
@@ -839,7 +839,7 @@
},
/area/hangar)
"tH" = (
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/obj/item/toy/plush/knight{
pixel_y = 25;
pixel_x = 9
diff --git a/_maps/outpost/hangar/nt_asteroid_40x40.dmm b/_maps/outpost/hangar/nt_asteroid_40x40.dmm
index 48649aedf4d8..005b657e38ee 100644
--- a/_maps/outpost/hangar/nt_asteroid_40x40.dmm
+++ b/_maps/outpost/hangar/nt_asteroid_40x40.dmm
@@ -60,7 +60,7 @@
/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/machinery/light/directional/east,
diff --git a/_maps/outpost/hangar/nt_asteroid_56x20.dmm b/_maps/outpost/hangar/nt_asteroid_56x20.dmm
index 9dac115ca5e7..11ba5baac070 100644
--- a/_maps/outpost/hangar/nt_asteroid_56x20.dmm
+++ b/_maps/outpost/hangar/nt_asteroid_56x20.dmm
@@ -284,7 +284,7 @@
},
/area/hangar)
"kx" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8;
pixel_x = 7
},
diff --git a/_maps/outpost/hangar/nt_asteroid_56x40.dmm b/_maps/outpost/hangar/nt_asteroid_56x40.dmm
index a3018e28aa32..5d66d8966d0b 100644
--- a/_maps/outpost/hangar/nt_asteroid_56x40.dmm
+++ b/_maps/outpost/hangar/nt_asteroid_56x40.dmm
@@ -723,7 +723,7 @@
},
/area/hangar)
"Ed" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8;
pixel_x = 7
},
diff --git a/_maps/outpost/hangar/nt_ice_20x20.dmm b/_maps/outpost/hangar/nt_ice_20x20.dmm
index 06e76cbe6b5b..03321bfceaa3 100644
--- a/_maps/outpost/hangar/nt_ice_20x20.dmm
+++ b/_maps/outpost/hangar/nt_ice_20x20.dmm
@@ -837,7 +837,7 @@
/obj/effect/turf_decal/siding/white/corner{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pressure_valve,
+/obj/machinery/atmospherics/components/binary/volume_pump,
/turf/open/floor/plasteel/patterned/brushed{
light_color = "#1B1D2E";
light_range = 2;
diff --git a/_maps/outpost/hangar/nt_ice_40x20.dmm b/_maps/outpost/hangar/nt_ice_40x20.dmm
index defafdc3b085..dc4366bfd54b 100644
--- a/_maps/outpost/hangar/nt_ice_40x20.dmm
+++ b/_maps/outpost/hangar/nt_ice_40x20.dmm
@@ -305,7 +305,7 @@
/obj/effect/turf_decal/siding/white/corner{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pressure_valve,
+/obj/machinery/atmospherics/components/binary/volume_pump,
/turf/open/floor/plasteel/patterned/brushed{
light_color = "#1B1D2E";
light_range = 2;
diff --git a/_maps/outpost/hangar/nt_ice_40x40.dmm b/_maps/outpost/hangar/nt_ice_40x40.dmm
index 62c3858641a5..69d81767fd7f 100644
--- a/_maps/outpost/hangar/nt_ice_40x40.dmm
+++ b/_maps/outpost/hangar/nt_ice_40x40.dmm
@@ -1398,7 +1398,7 @@
/obj/effect/turf_decal/siding/white/corner{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pressure_valve,
+/obj/machinery/atmospherics/components/binary/volume_pump,
/turf/open/floor/plasteel/patterned/brushed{
light_color = "#1B1D2E";
light_range = 2;
diff --git a/_maps/outpost/hangar/nt_ice_56x20.dmm b/_maps/outpost/hangar/nt_ice_56x20.dmm
index 08deb1360025..0966a1e60fa2 100644
--- a/_maps/outpost/hangar/nt_ice_56x20.dmm
+++ b/_maps/outpost/hangar/nt_ice_56x20.dmm
@@ -322,20 +322,6 @@
planetary_atmos = 1
},
/area/hangar)
-"hD" = (
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/volume_pump{
- dir = 4
- },
-/obj/effect/turf_decal/industrial/shutoff,
-/obj/structure/railing{
- dir = 1;
- layer = 2.8
- },
-/turf/open/floor/plasteel/tech,
-/area/hangar)
"if" = (
/obj/machinery/door/airlock/outpost,
/obj/machinery/atmospherics/pipe/simple/yellow/hidden,
@@ -934,7 +920,7 @@
/obj/effect/turf_decal/siding/white/corner{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pressure_valve,
+/obj/machinery/atmospherics/components/binary/volume_pump,
/turf/open/floor/plasteel/patterned/brushed{
light_color = "#1B1D2E";
light_range = 2;
@@ -3996,7 +3982,7 @@ Hr
ag
yh
nD
-hD
+TK
AZ
Vu
OZ
diff --git a/_maps/outpost/hangar/nt_ice_56x40.dmm b/_maps/outpost/hangar/nt_ice_56x40.dmm
index d484671d2f94..b89f435a4a8c 100644
--- a/_maps/outpost/hangar/nt_ice_56x40.dmm
+++ b/_maps/outpost/hangar/nt_ice_56x40.dmm
@@ -443,7 +443,7 @@
/obj/effect/turf_decal/siding/white/corner{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pressure_valve,
+/obj/machinery/atmospherics/components/binary/volume_pump,
/turf/open/floor/plasteel/patterned/brushed{
light_color = "#1B1D2E";
light_range = 2;
@@ -1185,20 +1185,6 @@
planetary_atmos = 1
},
/area/hangar)
-"Eo" = (
-/obj/effect/turf_decal/siding/white{
- dir = 1
- },
-/obj/machinery/atmospherics/components/binary/volume_pump{
- dir = 4
- },
-/obj/effect/turf_decal/industrial/shutoff,
-/obj/structure/railing{
- dir = 1;
- layer = 2.8
- },
-/turf/open/floor/plasteel/tech,
-/area/hangar)
"Eu" = (
/obj/structure/catwalk/over/plated_catwalk,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
@@ -5258,7 +5244,7 @@ tj
aH
Zj
qN
-Eo
+AW
pa
Od
aK
diff --git a/_maps/outpost/indie_space.dmm b/_maps/outpost/indie_space.dmm
index 7560d2921d2c..86a2a8d102b1 100644
--- a/_maps/outpost/indie_space.dmm
+++ b/_maps/outpost/indie_space.dmm
@@ -108,10 +108,25 @@
/turf/closed/indestructible/reinforced,
/area/outpost/crew/library)
"aM" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/prison_contraband,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/outpost/vacant_rooms)
+/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/structure/table,
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey{
+ dir = 8
+ },
+/obj/effect/spawner/lootdrop/plushie{
+ pixel_x = 16;
+ pixel_y = 4
+ },
+/obj/machinery/computer/cryopod/directional/north,
+/obj/item/folder{
+ pixel_x = -5;
+ pixel_y = 2
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/outpost/crew/cryo)
"aP" = (
/obj/structure/railing{
dir = 8
@@ -189,8 +204,9 @@
dir = 10
},
/obj/machinery/computer/electrolyzer_console{
- pixel_y = -31;
- density = 0
+ pixel_y = -18;
+ density = 0;
+ dir = 1
},
/turf/open/floor/plasteel/patterned,
/area/outpost/cargo)
@@ -915,6 +931,7 @@
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 1
},
+/obj/machinery/newscaster/directional/north,
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
"gq" = (
@@ -1462,8 +1479,16 @@
/area/outpost/maintenance/fore)
"kh" = (
/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
-/area/outpost/vacant_rooms)
+/area/outpost/crew/cryo)
"km" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/confetti,
@@ -1694,18 +1719,8 @@
/turf/open/floor/plating,
/area/outpost/maintenance/fore)
"lG" = (
-/obj/machinery/door/airlock/public,
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/tech,
-/area/outpost/vacant_rooms)
+/turf/closed/indestructible/reinforced,
+/area/outpost/crew/cryo)
"lH" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -1721,6 +1736,15 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/outpost/crew/library)
+"lJ" = (
+/obj/effect/turf_decal/corner/opaque/grey/full,
+/obj/effect/turf_decal/corner/opaque/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/turf/open/floor/plasteel,
+/area/outpost/hallway/port)
"lM" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/steeldecal/steel_decals9,
@@ -2012,11 +2036,17 @@
/area/outpost/cargo)
"nz" = (
/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
-/obj/structure/chair{
- dir = 1
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey{
+ dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
-/area/outpost/vacant_rooms)
+/area/outpost/crew/cryo)
"nK" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/industrial/warning{
@@ -2472,6 +2502,11 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
"qT" = (
@@ -2551,7 +2586,6 @@
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 1
},
-/obj/structure/extinguisher_cabinet/directional/north,
/obj/effect/turf_decal/floordetail/tiled,
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
@@ -3398,10 +3432,18 @@
/turf/open/floor/plating/asteroid,
/area/outpost/external)
"vd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east{
+ pixel_y = -7
+ },
+/obj/machinery/firealarm/directional/east{
+ pixel_y = 6
+ },
/turf/open/floor/plasteel,
-/area/outpost/vacant_rooms)
+/area/outpost/crew/cryo)
"vp" = (
/obj/effect/turf_decal/corner/opaque/grey/full,
/turf/open/floor/plasteel,
@@ -3586,6 +3628,25 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/patterned,
/area/outpost/cargo)
+"ww" = (
+/obj/machinery/door/airlock/glass{
+ name = "Cryogenics"
+ },
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/tech,
+/area/outpost/crew/cryo)
"wA" = (
/obj/effect/decal/cleanable/food/tomato_smudge,
/turf/open/floor/wood/mahogany,
@@ -3668,6 +3729,16 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel,
/area/outpost/storage)
+"wY" = (
+/obj/machinery/cryopod,
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 5
+ },
+/obj/structure/sign/poster/random{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/outpost/crew/cryo)
"xc" = (
/obj/effect/turf_decal/corner/opaque/red{
dir = 4
@@ -3737,10 +3808,12 @@
/turf/open/floor/plasteel/tech/techmaint,
/area/outpost/maintenance/central)
"xI" = (
-/obj/machinery/camera/autoname,
-/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
-/turf/open/floor/plasteel,
-/area/outpost/vacant_rooms)
+/obj/machinery/cryopod,
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 5
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/outpost/crew/cryo)
"xJ" = (
/obj/effect/turf_decal/corner/opaque/grey/full,
/obj/structure/disposalpipe/segment{
@@ -4778,7 +4851,6 @@
dir = 4
},
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/corner/opaque/black{
dir = 4
},
@@ -5360,15 +5432,20 @@
/turf/open/floor/plating,
/area/outpost/maintenance/fore)
"HB" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/glowstick,
-/obj/effect/spawner/lootdrop/glowstick,
-/obj/effect/spawner/lootdrop/glowstick,
-/obj/effect/spawner/lootdrop/glowstick,
-/obj/effect/spawner/lootdrop/glowstick,
-/obj/machinery/firealarm/directional/east,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/outpost/vacant_rooms)
+/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/structure/table,
+/obj/item/paper_bin{
+ pixel_y = 6;
+ pixel_x = 6
+ },
+/obj/item/pen,
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/steeldecal/steel_decals_central6,
+/turf/open/floor/plasteel,
+/area/outpost/crew/cryo)
"HD" = (
/turf/closed/indestructible/rock,
/area/outpost/external)
@@ -5627,11 +5704,13 @@
/turf/open/floor/plating,
/area/outpost/maintenance/fore)
"IS" = (
-/obj/machinery/light/dim/directional/east,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/machinery/light/dim/directional/east,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
+ },
/turf/open/floor/plasteel,
-/area/outpost/vacant_rooms)
+/area/outpost/crew/cryo)
"IT" = (
/obj/machinery/camera/autoname,
/obj/effect/turf_decal/corner/opaque/red{
@@ -6035,10 +6114,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 8
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
"Lh" = (
@@ -6139,10 +6220,10 @@
/area/outpost/maintenance/fore)
"LS" = (
/obj/effect/turf_decal/corner/opaque/grey/full,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 1
},
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
"LU" = (
@@ -6331,6 +6412,15 @@
},
/turf/open/floor/plasteel,
/area/outpost/hallway/central)
+"MQ" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 10
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/outpost/crew/cryo)
"Nc" = (
/turf/closed/indestructible/rock,
/area/outpost/hallway/central)
@@ -6614,6 +6704,18 @@
},
/turf/open/floor/plasteel,
/area/outpost/hallway/central)
+"Pt" = (
+/obj/machinery/cryopod{
+ dir = 1
+ },
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 10
+ },
+/obj/machinery/camera/autoname{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/outpost/crew/cryo)
"Pw" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance/four,
@@ -6625,6 +6727,10 @@
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/plating,
/area/outpost/maintenance/fore)
+"PA" = (
+/obj/effect/spawner/structure/window/reinforced/indestructable,
+/turf/open/floor/plating,
+/area/outpost/crew/cryo)
"PD" = (
/obj/structure/chair/sofa/brown/right/directional/west,
/turf/open/floor/carpet/royalblack,
@@ -6678,6 +6784,26 @@
},
/turf/open/floor/wood,
/area/outpost/crew/bar)
+"PQ" = (
+/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey/corner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/outpost/crew/cryo)
"PS" = (
/obj/structure/falsewall/reinforced,
/obj/structure/cable/yellow{
@@ -6713,7 +6839,6 @@
/area/outpost/security)
"Qa" = (
/obj/effect/turf_decal/corner/opaque/grey/full,
-/obj/machinery/newscaster/directional/north,
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 1
},
@@ -7300,10 +7425,14 @@
/turf/open/floor/plasteel,
/area/outpost/security)
"Tg" = (
-/obj/structure/rack,
-/obj/effect/spawner/lootdrop/donut,
-/turf/open/floor/plasteel/patterned/cargo_one,
-/area/outpost/vacant_rooms)
+/obj/effect/turf_decal/corner/opaque/neutral/diagonal,
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/lightgrey,
+/obj/machinery/light/dim/directional/west,
+/turf/open/floor/plasteel,
+/area/outpost/crew/cryo)
"Th" = (
/turf/closed/indestructible/reinforced,
/area/outpost/cargo/office)
@@ -7828,6 +7957,11 @@
/obj/effect/turf_decal/corner/opaque/neutral{
dir = 1
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/outpost/hallway/port)
"Wz" = (
@@ -16958,11 +17092,11 @@ LL
Uq
Aw
LL
-wL
-wL
-wL
-wL
-wL
+lG
+lG
+lG
+lG
+lG
BM
Ky
yj
@@ -17081,11 +17215,11 @@ LL
LL
LL
LL
-wL
-aM
+lG
+wY
Tg
-aM
-wL
+Pt
+PA
rm
Kl
hW
@@ -17204,11 +17338,11 @@ HD
HD
HD
HD
-wL
+lG
xI
kh
-ev
-wL
+MQ
+PA
Qa
LY
wu
@@ -17327,14 +17461,14 @@ HD
HD
HD
HD
-wL
+lG
aM
-kh
+PQ
nz
-wL
-Fi
+ww
+Wv
qR
-wu
+lJ
iV
Pw
AW
@@ -17450,7 +17584,7 @@ HD
HD
HD
HD
-wL
+lG
HB
IS
vd
@@ -17824,7 +17958,7 @@ yN
XA
di
wL
-Wv
+Fi
vp
kb
XD
diff --git a/_maps/outpost/nanotrasen_asteroid.dmm b/_maps/outpost/nanotrasen_asteroid.dmm
index d1a184d736fc..08f1322e7c60 100644
--- a/_maps/outpost/nanotrasen_asteroid.dmm
+++ b/_maps/outpost/nanotrasen_asteroid.dmm
@@ -125,7 +125,7 @@
/area/outpost/maintenance/fore)
"aE" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday{
+/obj/item/food/cakeslice/birthday{
pixel_x = -3;
pixel_y = -5
},
@@ -5585,7 +5585,7 @@
/turf/open/floor/concrete/reinforced,
/area/outpost/maintenance/aft)
"tW" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/effect/turf_decal/techfloor{
diff --git a/_maps/outpost/nanotrasen_ice.dmm b/_maps/outpost/nanotrasen_ice.dmm
index d029c3dc86a8..70fb809c4c95 100644
--- a/_maps/outpost/nanotrasen_ice.dmm
+++ b/_maps/outpost/nanotrasen_ice.dmm
@@ -2852,8 +2852,9 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/industrial/hatch/yellow,
/obj/machinery/computer/electrolyzer_console{
- pixel_x = 32;
- density = 0
+ pixel_x = 20;
+ density = 0;
+ dir = 8
},
/turf/open/floor/plasteel/patterned,
/area/outpost/cargo/smeltery)
@@ -6219,7 +6220,8 @@
/obj/machinery/mineral/processing_unit_console{
machinedir = 8;
output_dir = 1;
- pixel_x = 32
+ pixel_x = 20;
+ dir = 8
},
/turf/open/floor/plasteel/patterned,
/area/outpost/cargo/smeltery)
diff --git a/_maps/shuttles/independent/independent_beluga.dmm b/_maps/shuttles/independent/independent_beluga.dmm
index 1eae63fcac48..c8ef49a3b35e 100644
--- a/_maps/shuttles/independent/independent_beluga.dmm
+++ b/_maps/shuttles/independent/independent_beluga.dmm
@@ -4742,7 +4742,7 @@
/area/ship/crew)
"UO" = (
/obj/effect/turf_decal/industrial/traffic/corner,
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/machinery/light/directional/south,
diff --git a/_maps/shuttles/independent/independent_box.dmm b/_maps/shuttles/independent/independent_box.dmm
index 0e1e4e9439b5..577290c6581c 100644
--- a/_maps/shuttles/independent/independent_box.dmm
+++ b/_maps/shuttles/independent/independent_box.dmm
@@ -1802,7 +1802,7 @@
/obj/effect/turf_decal/corner/opaque/blue{
dir = 4
},
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/machinery/firealarm/directional/south,
diff --git a/_maps/shuttles/independent/independent_bubble.dmm b/_maps/shuttles/independent/independent_bubble.dmm
index c34ad8349987..08fd116f2536 100644
--- a/_maps/shuttles/independent/independent_bubble.dmm
+++ b/_maps/shuttles/independent/independent_bubble.dmm
@@ -1164,7 +1164,7 @@
},
/obj/item/circuitboard/computer/selling_pad_control,
/obj/item/circuitboard/machine/selling_pad,
-/obj/item/circuitboard/computer/cargo/express,
+/obj/item/circuitboard/computer/cargo,
/obj/structure/closet/crate/engineering,
/turf/open/floor/plasteel,
/area/ship/cargo)
diff --git a/_maps/shuttles/independent/independent_dwayne.dmm b/_maps/shuttles/independent/independent_dwayne.dmm
index ef1435cb1558..533709f94692 100644
--- a/_maps/shuttles/independent/independent_dwayne.dmm
+++ b/_maps/shuttles/independent/independent_dwayne.dmm
@@ -1,31 +1,51 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"ak" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
},
-/obj/effect/landmark/start/captain,
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
-"ap" = (
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/sleeper{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
+ },
+/obj/structure/cable/cyan{
+ icon_state = "5-8"
+ },
+/obj/item/kirbyplants/fullysynthetic{
+ pixel_x = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable/cyan{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/corner/opaque/black{
+ dir = 6
},
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/plasteel/mono,
-/area/ship/medical)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"ap" = (
+/turf/closed/wall,
+/area/ship/crew/dorm)
"as" = (
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "6-8"
},
-/obj/effect/turf_decal/techfloor{
- dir = 9
+/obj/structure/cable/cyan{
+ icon_state = "1-6"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
+/turf/open/floor/plating,
+/area/ship/storage/eva)
+"ax" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
"aD" = (
/obj/machinery/power/shuttle/engine/electric{
dir = 4
@@ -36,16 +56,31 @@
/turf/open/floor/plating/airless,
/area/ship/engineering)
"aI" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/radio/intercom/directional/north,
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"aR" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/suit_storage_unit/independent/mining/eva,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/effect/turf_decal/corner/opaque/ntblue/half{
+ dir = 4
+ },
+/obj/machinery/firealarm/directional/south{
+ pixel_x = -10
+ },
+/obj/machinery/modular_computer/console/preset/command{
+ dir = 8
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
"aS" = (
/obj/machinery/atmospherics/components/unary/vent_pump/layer2{
dir = 1
@@ -58,2233 +93,3404 @@
},
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
-"aY" = (
+"aV" = (
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/structure/table/wood,
-/obj/effect/spawner/lootdrop/ration,
-/obj/item/storage/cans/sixbeer,
-/turf/open/floor/wood,
-/area/ship/crew)
-"bb" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 4
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"aY" = (
+/obj/structure/sink/kitchen{
+ dir = 4;
+ pixel_y = -6
},
-/obj/structure/window/reinforced{
- dir = 8
+/obj/structure/sign/poster/official/bless_this_spess{
+ pixel_x = -32
},
-/obj/machinery/door/window/northright{
- dir = 4;
- name = "Engine Access"
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"bb" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/item/stack/packageWrap{
+ pixel_y = 9;
+ pixel_x = -7
},
-/turf/open/floor/plating,
-/area/ship/engineering)
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"bf" = (
-/obj/effect/turf_decal/number/zero,
/obj/effect/turf_decal/industrial/warning,
/turf/open/floor/plating,
-/area/ship/construction)
+/area/ship/cargo)
"bj" = (
/turf/closed/wall,
-/area/ship/crew)
+/area/ship/crew/toilet)
"bl" = (
-/obj/docking_port/mobile{
- can_move_docking_ports = 1;
- dir = 2;
- launch_status = 0;
- name = "mining ship";
- port_direction = 8;
- preferred_direction = 4
- },
-/obj/machinery/power/shieldwallgen/atmos/roundstart{
- dir = 8;
- id = "mining_ship_atmosgen";
- locked = 1
- },
-/obj/machinery/door/poddoor{
- id = "mining_ship_port"
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/chair/office{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "0-8"
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"bo" = (
+/obj/structure/cable/cyan{
+ icon_state = "2-9"
},
/turf/open/floor/plating,
/area/ship/cargo)
"bv" = (
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/structure/cable{
+/obj/structure/cable/cyan{
icon_state = "1-8"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/catwalk/over,
+/obj/structure/catwalk/over/plated_catwalk/dark,
/turf/open/floor/plating,
-/area/ship/crew)
+/area/ship/hallway/central)
+"bx" = (
+/obj/structure/chair/sofa/brown/old/left/directional/south,
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/machinery/airalarm/directional/east,
+/obj/machinery/newscaster/directional/north{
+ pixel_x = -13
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"bE" = (
-/obj/machinery/cryopod{
+/obj/machinery/door/airlock/grunge{
+ name = "Bathroom"
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/machinery/computer/cryopod/directional/south,
-/turf/open/floor/wood,
-/area/ship/crew)
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/toilet)
+"bO" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/ship/storage/eva)
"bP" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/power/terminal{
+ dir = 8
},
-/obj/structure/catwalk/over,
-/obj/machinery/atmospherics/components/trinary/mixer{
+/obj/structure/cable/cyan{
+ icon_state = "0-4"
+ },
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/turf/open/floor/plating,
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"bW" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
/obj/structure/cable/yellow{
- icon_state = "2-8"
+ icon_state = "0-8"
},
/turf/open/floor/plating/airless,
-/area/ship/external)
+/area/ship/external/dark)
+"cc" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 4
+ },
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"cf" = (
-/obj/structure/bed,
-/obj/item/bedsheet/brown,
-/obj/structure/curtain/bounty,
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/wood,
-/area/ship/crew)
+/obj/structure/sign/poster/rilena/random{
+ pixel_x = -32
+ },
+/obj/structure/closet/secure_closet{
+ icon_state = "cabinet";
+ name = "Captain's wardobe";
+ req_access_txt = "20";
+ close_sound = 'sound/machines/wooden_closet_close.ogg';
+ open_sound = 'sound/machines/wooden_closet_open.ogg';
+ desc = "It's a card-locked cabinet."
+ },
+/obj/item/storage/backpack/satchel/cap,
+/obj/item/storage/backpack/messenger/com,
+/obj/item/clothing/under/rank/command/captain,
+/obj/item/clothing/under/rank/command/captain/skirt,
+/obj/item/clothing/shoes/cowboy/fancy,
+/obj/item/clothing/suit/jacket/leather/duster/command,
+/obj/item/clothing/suit/armor/vest/capcarapace/duster,
+/obj/item/clothing/gloves/color/white,
+/obj/item/clothing/head/caphat,
+/obj/item/clothing/head/caphat/cowboy,
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_x = 11;
+ pixel_y = -19
+ },
+/turf/open/floor/wood{
+ icon_state = "wood-broken5"
+ },
+/area/ship/crew/dorm)
+"cw" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/bridge)
+"cL" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
+ },
+/obj/structure/closet/crate,
+/obj/machinery/firealarm/directional/north,
+/obj/item/circuitboard/machine/pipedispenser,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"dh" = (
+/obj/structure/sign/number/random,
+/turf/closed/wall/r_wall,
+/area/ship/crew/canteen)
"dx" = (
-/obj/machinery/light/directional/south,
-/obj/structure/ore_box,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 9
},
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/ammo_box/c38_box,
+/obj/item/ammo_box/c38_box,
+/obj/item/ammo_box/c38_box,
+/obj/structure/closet/crate/secure/plasma{
+ name = "ammo crate";
+ desc = "A secure ammo crate."
+ },
+/obj/effect/turf_decal/ntspaceworks_big/two{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"dy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"dK" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
},
-/obj/machinery/door/airlock/medical,
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/mono,
-/turf/open/floor/plasteel/white,
-/area/ship/medical)
-"dK" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"dQ" = (
+/turf/closed/wall/r_wall,
+/area/ship/crew/cryo)
+"ec" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
- },
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"ei" = (
-/turf/closed/wall/r_wall,
-/area/ship/medical)
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/crew/cryo)
+"eu" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"eH" = (
-/obj/effect/landmark/start/shaft_miner,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/effect/turf_decal/industrial/loading,
+/obj/structure/cable/cyan{
+ icon_state = "0-4"
+ },
+/obj/effect/turf_decal/arrows,
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
"eM" = (
/turf/closed/wall,
/area/ship/cargo)
"fl" = (
-/obj/machinery/atmospherics/components/unary/tank/air{
- dir = 8
+/obj/machinery/atmospherics/components/trinary/mixer{
+ dir = 1;
+ name = "fuel mixer";
+ node1_concentration = 0.33;
+ node2_concentration = 0.67;
+ target_pressure = 500
},
-/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"fp" = (
-/obj/docking_port/stationary{
- width = 30;
- height = 15;
- dwidth = 15
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
-/turf/template_noop,
-/area/template_noop)
-"fy" = (
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
- dir = 4
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"fV" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
- dir = 8
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"fy" = (
+/obj/structure/catwalk,
+/obj/item/clothing/head/cone{
+ pixel_x = 3;
+ pixel_y = -2
},
-/turf/open/floor/plating,
-/area/ship/medical)
-"fY" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"fz" = (
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"gf" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/structure/sign/poster/contraband/cardinal_port_starboard{
+ pixel_y = 32
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"fV" = (
+/obj/structure/closet/cabinet{
+ name = "wardrobe"
},
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/cyan{
+ icon_state = "0-6"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 4
+/obj/item/storage/backpack/satchel/explorer,
+/obj/item/storage/backpack/satchel/explorer,
+/obj/item/storage/backpack/satchel/explorer,
+/obj/item/clothing/under/utility,
+/obj/item/clothing/under/utility,
+/obj/item/clothing/under/utility/skirt,
+/obj/item/clothing/under/utility/skirt,
+/obj/item/clothing/shoes/workboots/mining,
+/obj/item/clothing/shoes/workboots/mining,
+/obj/item/clothing/shoes/workboots,
+/obj/item/clothing/shoes/workboots,
+/obj/item/clothing/suit/jacket/leather/duster,
+/obj/item/clothing/suit/jacket/leather/duster,
+/obj/item/clothing/gloves/fingerless,
+/obj/item/clothing/gloves/fingerless,
+/obj/item/clothing/head/cowboy,
+/obj/item/clothing/head/cowboy,
+/obj/item/clothing/glasses/heat,
+/obj/item/clothing/glasses/heat,
+/turf/open/floor/wood,
+/area/ship/crew/dorm)
+"fY" = (
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden{
+ dir = 8
},
-/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/machinery/power/ship_gravity,
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/insectguts,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"gf" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/structure/catwalk/over/plated_catwalk,
/turf/open/floor/plating,
/area/ship/engineering)
"gm" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater,
+/obj/machinery/door/window/northright{
+ dir = 4;
+ name = "Engine Access"
},
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel/tech/grid,
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
+ dir = 4
+ },
+/obj/structure/window/plasma/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
"gs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+ dir = 6
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"gu" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/closet/firecloset/full{
- anchored = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "2-9"
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/cryo)
+"gu" = (
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/cargo)
"gF" = (
-/obj/machinery/power/shuttle/engine/fire{
- dir = 4
- },
+/obj/machinery/power/shuttle/engine/fire,
/turf/open/floor/plating/airless,
/area/ship/engineering)
"gT" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 13
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 5
},
-/obj/structure/closet/wall/directional/north,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"he" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+/obj/structure/cable/cyan{
+ icon_state = "0-1"
+ },
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned,
+/area/ship/crew/toilet)
+"hd" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
},
+/obj/structure/grille,
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/structure/catwalk/over,
+/obj/structure/window/reinforced/fulltile,
/turf/open/floor/plating,
+/area/ship/crew/canteen)
+"he" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"hy" = (
-/obj/structure/cable/yellow,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
},
-/obj/machinery/power/solar,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"hK" = (
-/obj/structure/window/reinforced{
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"hB" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 8
},
-/obj/machinery/door/window/northleft{
- dir = 4;
- name = "Engine Access"
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"hK" = (
+/obj/structure/sign/poster/contraband/gec{
+ pixel_x = 32
},
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{
- dir = 4
+/obj/machinery/atmospherics/components/unary/portables_connector{
+ dir = 8;
+ name = "connector port (Fuel)"
},
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
-"hZ" = (
-/obj/structure/cable{
- icon_state = "2-8"
+"hO" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
},
-/obj/item/radio/intercom/directional/east,
-/obj/machinery/atmospherics/components/unary/portables_connector{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/machinery/portable_atmospherics/canister/hydrogen,
-/turf/open/floor/plating,
+/obj/structure/cable/cyan{
+ icon_state = "5-10"
+ },
+/obj/effect/turf_decal/ntspaceworks_big/three,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"hZ" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"ig" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 1;
+ piping_layer = 2
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"in" = (
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
+ dir = 4;
+ id = "dwayne_mining_field";
+ locked = 1
+ },
/obj/machinery/door/poddoor{
- id = "mining_ship_port"
+ id = "dwayne_mining"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/cyan{
+ icon_state = "0-2"
},
/turf/open/floor/plating,
-/area/ship/cargo)
+/area/ship/storage/eva)
"iq" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/machinery/atmospherics/components/unary/vent_pump/siphon/layer4,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/obj/effect/turf_decal/box,
-/obj/structure/tank_dispenser/oxygen,
+/obj/structure/closet/emcloset/wall/directional/west,
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"ir" = (
-/obj/structure/cable/yellow{
- icon_state = "2-4"
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 8
},
-/obj/effect/turf_decal/techfloor{
- dir = 6
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning,
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"iZ" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/turf_decal/techfloor{
+ dir = 6
},
-/obj/machinery/airalarm/directional/south,
-/obj/effect/turf_decal/corner/opaque/yellow/border{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"jS" = (
-/obj/structure/cable/yellow{
- icon_state = "0-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable/cyan{
+ icon_state = "0-9"
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"ja" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 4
},
+/obj/structure/closet/crate/engineering/electrical,
+/obj/item/radio/intercom/directional/east,
+/obj/item/stack/sheet/mineral/plasma/ten,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"jz" = (
+/obj/structure/cable/yellow,
/obj/machinery/power/solar,
/obj/effect/turf_decal/solarpanel,
/turf/open/floor/plating/airless,
-/area/ship/external)
+/area/ship/external/dark)
+"jS" = (
+/obj/structure/chair/sofa/brown/old/left/directional/north,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
"kb" = (
-/obj/effect/turf_decal/corner/opaque/blue{
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
/obj/structure/closet/emcloset/wall/directional/north,
-/turf/open/floor/plasteel/white{
- dir = 1
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/area/ship/crew)
-"kf" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"kf" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/effect/turf_decal/techfloor{
- dir = 8
+/obj/structure/sign/warning/vacuum/external{
+ pixel_y = 24
},
-/obj/effect/turf_decal/industrial/caution{
+/obj/machinery/door/airlock/external/glass{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"kM" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/effect/turf_decal/corner/opaque/yellow/half,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"kO" = (
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "0-4"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "0-8"
+/obj/structure/cable/cyan{
+ icon_state = "5-10"
},
-/obj/machinery/power/solar,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"kQ" = (
-/obj/machinery/atmospherics/components/unary/portables_connector{
- dir = 8
+/obj/effect/turf_decal/ntspaceworks_big/three{
+ dir = 1
},
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/turf/open/floor/plating,
-/area/ship/engineering)
-"ls" = (
-/obj/structure/cable,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"kO" = (
+/obj/effect/decal/cleanable/food/tomato_smudge,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"kQ" = (
+/obj/structure/table,
+/obj/machinery/computer/helm/viewscreen/directional/north,
/obj/machinery/power/terminal{
- dir = 8
+ dir = 4;
+ layer = 2.30
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-6"
+ },
+/obj/item/paper/guides/jobs/engi/combustion_thruster{
+ pixel_x = -5;
+ pixel_y = 1
+ },
+/obj/item/reagent_containers/food/drinks/mug{
+ pixel_x = 10;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
-"lv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+"ld" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/crew/canteen)
+"ls" = (
+/obj/machinery/power/smes/shuttle/precharged{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/machinery/door/window/northleft{
+ dir = 4;
+ name = "Engine Access"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-8"
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/crew)
-"lD" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/structure/window/plasma/reinforced{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/turf/open/floor/plating,
+/area/ship/engineering)
+"lv" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
},
-/obj/machinery/door/firedoor/border_only{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"lD" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-9"
+ },
/obj/effect/turf_decal/techfloor{
- dir = 8
+ dir = 1
},
-/obj/machinery/door/airlock/engineering{
- dir = 4
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"ma" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/obj/effect/turf_decal/techfloor{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 10
},
-/obj/machinery/light/directional/east,
-/turf/open/floor/plasteel/tech/techmaint,
+/obj/structure/cable/cyan{
+ icon_state = "1-4"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating,
/area/ship/engineering)
+"mf" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/item/c_tube{
+ pixel_y = 3
+ },
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ship/cargo)
"mr" = (
-/obj/effect/turf_decal/ntspaceworks_big/six,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
/turf/open/floor/plating,
-/area/ship/construction)
+/area/ship/storage/eva)
"ms" = (
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast"
+/obj/machinery/computer/helm/viewscreen/directional/north,
+/obj/structure/cable/yellow{
+ icon_state = "6-9"
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"mv" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow,
/turf/open/floor/plating/airless,
-/area/ship/bridge)
+/area/ship/external/dark)
"my" = (
-/obj/effect/turf_decal/corner/opaque/blue{
- dir = 5
- },
-/turf/open/floor/plasteel/white{
- dir = 1
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/area/ship/crew)
+/obj/machinery/light/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"mA" = (
-/obj/structure/table/reinforced,
-/obj/item/gps{
- gpstag = "NTREC1";
- pixel_x = -9;
- pixel_y = 7
+/obj/effect/turf_decal/industrial/warning/corner,
+/obj/machinery/light/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"mC" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
-/obj/item/radio{
- pixel_x = 6;
- pixel_y = 7
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 5
},
-/obj/machinery/airalarm/directional/west,
-/obj/effect/turf_decal/corner/opaque/blue/half,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"mC" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/computer/monitor/retro{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
},
-/turf/open/floor/plasteel/tech/grid,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
"mE" = (
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
+/obj/effect/turf_decal/techfloor{
+ dir = 5
},
-/obj/effect/turf_decal/corner/opaque/yellow/border{
- dir = 8
+/obj/effect/decal/cleanable/oil,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+/obj/machinery/light_switch{
+ dir = 2;
+ pixel_y = 20
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
"mF" = (
/turf/closed/wall,
/area/ship/engineering)
-"nf" = (
-/obj/effect/turf_decal/corner/opaque/yellow/half,
-/turf/open/floor/plasteel,
+"mJ" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/corner/opaque/ntblue/half{
+ dir = 1
+ },
+/obj/item/radio/weather_monitor{
+ pixel_x = 5;
+ pixel_y = 7
+ },
+/obj/item/reagent_containers/food/drinks/mug{
+ pixel_x = -8
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"mR" = (
+/obj/effect/turf_decal/solarpanel,
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/crew/cryo)
+"mX" = (
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/warning/corner,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
+"nf" = (
+/obj/effect/turf_decal/industrial/hatch/yellow,
+/obj/machinery/mineral/processing_unit_console{
+ pixel_y = -18;
+ machinedir = 8;
+ output_dir = 1;
+ dir = 1
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
"nr" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"nJ" = (
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/components/unary/portables_connector/layer2{
+ name = "connector port (Air)"
},
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/catwalk/over,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/turf/open/floor/plating,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
"nL" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/closet/crate/internals,
-/obj/effect/turf_decal/box,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/effect/turf_decal/ntspaceworks_big/seven{
+ dir = 1
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/structure/ore_box,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"nY" = (
-/obj/structure/cable/yellow{
- icon_state = "1-8"
- },
-/turf/open/floor/plating/airless,
-/area/ship/external)
+/turf/closed/wall/r_wall,
+/area/ship/crew/canteen)
"oa" = (
-/obj/machinery/atmospherics/pipe/manifold/general/hidden{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/power/terminal{
dir = 8
},
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable{
- icon_state = "5-9"
+/obj/structure/cable/cyan,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
+"of" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/independent/mining/eva,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"om" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/catwalk/over,
-/obj/effect/landmark/start/station_engineer,
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/closet/wall/orange/directional/west{
+ name = "Mechanic's locker"
+ },
+/obj/effect/decal/cleanable/oil/streak,
+/obj/item/storage/backpack/satchel/eng,
+/obj/item/storage/backpack/messenger/engi,
+/obj/item/clothing/under/rank/engineering/engineer,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/toggle/hazard,
+/obj/item/clothing/head/hardhat/dblue,
+/obj/item/clothing/glasses/welding,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"or" = (
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"oB" = (
-/obj/effect/decal/cleanable/oil,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"oC" = (
-/turf/closed/wall,
-/area/ship/medical)
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/dept/mining,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"ow" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/port_gen/pacman{
+ anchored = 1
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"oy" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/secure_closet/quartermaster{
+ populate = 0;
+ name = "\proper Foreman's locker"
+ },
+/obj/item/storage/backpack/satchel/eng,
+/obj/item/clothing/shoes/workboots,
+/obj/item/clothing/under/rank/security/detective,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/jacket/leather/duster{
+ name = "foreman's duster";
+ desc = "A long, utilitarian leather coat. Ideal for protecting its wearer from rain, sun, dust and paperwork."
+ },
+/obj/item/storage/belt/utility/full,
+/obj/item/clothing/gloves/fingerless,
+/obj/item/clothing/head/cowboy/sec,
+/obj/item/clothing/head/hardhat/orange,
+/obj/item/clothing/head/hardhat/white,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"oB" = (
+/obj/machinery/conveyor_switch/oneway{
+ pixel_y = 15;
+ pixel_x = 11;
+ id = "smelter_dwayne"
+ },
+/obj/structure/railing{
+ dir = 10
+ },
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"oC" = (
+/obj/machinery/light_switch{
+ dir = 2;
+ pixel_x = 11;
+ pixel_y = 20
+ },
+/obj/structure/chair,
+/obj/machinery/newscaster/directional/north,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"oE" = (
-/obj/structure/sink{
- pixel_y = 17
+/obj/effect/turf_decal/industrial/warning,
+/obj/structure/table,
+/obj/structure/sign/poster/official/work_for_a_future{
+ pixel_y = 32
},
-/obj/structure/mirror{
- pixel_y = 28
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/cyan{
+ icon_state = "0-6"
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border{
- dir = 9
+/obj/item/radio{
+ pixel_y = 5
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"oR" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/item/radio{
+ pixel_y = 5
+ },
+/obj/item/radio{
+ pixel_y = 5
+ },
+/obj/item/radio{
+ pixel_y = 5
+ },
+/obj/item/radio{
+ pixel_y = 5
+ },
+/obj/item/radio{
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/crew/cryo)
+"oJ" = (
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/table,
+/obj/item/paper_bin{
+ pixel_x = 6;
+ pixel_y = 6
},
-/obj/structure/catwalk/over,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/item/pen/fourcolor,
+/obj/item/toy/crayon/spraycan{
+ pixel_x = -9;
+ pixel_y = 17
},
-/turf/open/floor/plating,
-/area/ship/crew)
-"pl" = (
-/obj/machinery/power/shieldwallgen/atmos/roundstart{
- dir = 4;
- id = "mining_ship_atmosgen";
- locked = 1
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"oQ" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
},
-/obj/machinery/door/poddoor{
- id = "mining_ship_port"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
},
-/turf/open/floor/plating,
+/obj/structure/cable/cyan{
+ icon_state = "1-6"
+ },
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
-"pn" = (
-/obj/structure/closet/secure_closet/medical2,
-/obj/machinery/power/apc/auto_name/directional/south,
-/obj/structure/cable{
- icon_state = "0-4"
+"oR" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border{
- dir = 10
+/obj/structure/cable/cyan{
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"pl" = (
+/obj/effect/turf_decal/corner/opaque/ntblue/half{
+ dir = 1
+ },
+/obj/machinery/computer/crew,
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"pn" = (
+/turf/closed/wall,
+/area/ship/crew/cryo)
"pq" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 5
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"pt" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/effect/turf_decal/corner/opaque/yellow/border,
-/obj/structure/extinguisher_cabinet/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"pv" = (
-/obj/machinery/light/small/directional/north,
-/obj/machinery/computer/helm/viewscreen/directional/east,
-/obj/effect/landmark/start/assistant,
-/obj/structure/chair/comfy/orange/directional/west,
-/turf/open/floor/wood,
-/area/ship/crew)
+/obj/machinery/light_switch{
+ dir = 2;
+ pixel_x = 12;
+ pixel_y = 20
+ },
+/obj/machinery/vending/coffee,
+/obj/item/trash/candle{
+ pixel_y = 18;
+ pixel_x = 4
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
"pS" = (
-/obj/effect/turf_decal/box,
-/obj/structure/tank_dispenser/oxygen,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"qg" = (
-/obj/machinery/holopad/emergency/command,
-/obj/machinery/light/directional/west,
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
-"qz" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/suit_storage_unit/independent/mining/eva,
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
dir = 4
},
-/turf/open/floor/plasteel,
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
-"qK" = (
-/obj/effect/turf_decal/corner/opaque/blue{
- dir = 5
+"qg" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
+/obj/structure/cable/cyan{
+ icon_state = "1-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"ql" = (
+/obj/structure/cable/yellow,
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white{
- dir = 1
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"qt" = (
+/obj/structure/cable/yellow{
+ icon_state = "6-9"
},
-/area/ship/crew)
-"qO" = (
-/obj/item/reagent_containers/food/snacks/canned/beans{
- pixel_x = -5;
- pixel_y = 3
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/obj/item/reagent_containers/food/snacks/canned/beans{
- pixel_x = 2;
- pixel_y = 3
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
},
-/obj/item/reagent_containers/food/snacks/canned/beans{
- pixel_x = -2
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/door/airlock/glass{
+ name = "Common Room"
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 5
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 1;
- pixel_y = -3
+/obj/machinery/door/firedoor/border_only,
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/canteen)
+"qz" = (
+/turf/closed/wall/r_wall,
+/area/ship/storage/eva)
+"qK" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
- pixel_x = 8;
- pixel_y = -3
+/obj/item/cigbutt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "6-8"
},
-/obj/structure/closet/crate{
- name = "food crate"
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/obj/structure/cable{
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"qO" = (
+/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/item/storage/cans/sixbeer,
-/obj/effect/spawner/lootdrop/ration,
-/obj/effect/spawner/lootdrop/ration,
-/obj/effect/spawner/lootdrop/ration,
-/obj/effect/spawner/lootdrop/ration,
-/obj/effect/spawner/lootdrop/ration,
-/obj/effect/spawner/lootdrop/ration,
-/turf/open/floor/plasteel/tech/grid,
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
/area/ship/engineering)
+"rq" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
+ },
+/obj/machinery/autolathe,
+/obj/machinery/light_switch{
+ dir = 2;
+ pixel_x = -12;
+ pixel_y = 20
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"rE" = (
/turf/closed/wall/r_wall,
/area/ship/bridge)
"sg" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/effect/turf_decal/industrial/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"sp" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+/obj/effect/turf_decal/corner/opaque/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/landmark/start/medical_doctor,
-/obj/effect/turf_decal/corner/opaque/blue/border{
- dir = 8
+/obj/structure/noticeboard{
+ dir = 1;
+ pixel_y = -26
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
+/obj/machinery/airalarm/directional/west,
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/cryo)
"sD" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/effect/turf_decal/industrial/warning,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/dept/cargo{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"sM" = (
-/obj/effect/turf_decal/corner/opaque/blue/half{
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/structure/frame/computer/retro{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"sP" = (
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/machinery/power/solar,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"sZ" = (
-/obj/machinery/vending/wallmed{
- pixel_y = 28
+/obj/machinery/door/airlock/command/glass{
+ dir = 4;
+ name = "Bridge";
+ req_one_access = list(20,41)
},
-/obj/structure/closet/crate/freezer/blood,
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border{
- dir = 1
+/obj/effect/turf_decal/corner/opaque/black{
+ dir = 9
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"tj" = (
+/turf/open/floor/plasteel/stairs{
+ dir = 4;
+ color = "#555555"
+ },
+/area/ship/bridge)
+"sP" = (
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "1-2"
},
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"sZ" = (
+/obj/machinery/cryopod,
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/light/dim/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/crew/cryo)
+"tj" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/machinery/firealarm/directional/south,
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"tq" = (
/turf/closed/wall/r_wall,
/area/ship/engineering)
-"tX" = (
-/obj/structure/ore_box,
+"tJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+ dir = 10
},
+/obj/item/stack/sheet/cardboard,
/turf/open/floor/plating,
/area/ship/cargo)
+"tX" = (
+/obj/effect/turf_decal/ntspaceworks_big/eight{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"uc" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/turf/closed/wall,
+/area/ship/storage/eva)
"uk" = (
-/turf/open/floor/plating,
-/area/ship/construction)
-"uP" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
},
-/obj/structure/window/reinforced{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/machinery/door/window/northleft{
+/obj/structure/cable/cyan{
+ icon_state = "6-9"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"ul" = (
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"uP" = (
+/obj/machinery/door/poddoor{
+ id = "dwayne_cargo"
+ },
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
dir = 4;
- name = "Engine Access"
+ id = "dwayne_cargo_field";
+ locked = 1
},
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/structure/cable/cyan{
+ icon_state = "0-1"
},
/turf/open/floor/plating,
-/area/ship/engineering)
-"uT" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/suit_storage_unit/independent/mining/eva,
-/obj/machinery/light/directional/west,
-/turf/open/floor/plasteel,
/area/ship/cargo)
+"uT" = (
+/obj/effect/turf_decal/corner/opaque/ntblue/half{
+ dir = 4
+ },
+/obj/structure/table/reinforced,
+/obj/item/radio/intercom/wideband/table{
+ dir = 4;
+ pixel_y = 0;
+ pixel_x = 5
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
"vb" = (
-/obj/effect/turf_decal/box,
-/obj/machinery/ore_silo,
-/turf/open/floor/plasteel,
+/obj/machinery/conveyor/inverted{
+ dir = 9;
+ id = "smelter_dwayne"
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
+"ve" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/obj/item/stack/sheet/cardboard{
+ amount = 2
+ },
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"vf" = (
-/obj/effect/turf_decal/ntspaceworks_big/seven,
-/turf/open/floor/plating,
-/area/ship/construction)
+/obj/structure/closet/crate,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
+ },
+/obj/effect/spawner/lootdrop/maintenance/two,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"vj" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+/obj/structure/sign/poster/contraband/winchester{
+ pixel_y = -32
},
-/obj/structure/cable/yellow{
- icon_state = "1-8"
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"vm" = (
+/obj/structure/sign/number/random,
+/turf/closed/wall/r_wall,
+/area/ship/crew/toilet)
+"vn" = (
+/obj/machinery/power/smes/shuttle/precharged{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/effect/turf_decal/corner/opaque/yellow/bordercorner{
- dir = 8
+/obj/machinery/door/window/northright{
+ dir = 4;
+ name = "Engine Access"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"vn" = (
/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "0-8"
},
-/obj/machinery/power/terminal{
- dir = 8
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
+/obj/structure/window/plasma/reinforced{
dir = 8
},
-/turf/open/floor/plasteel/tech/grid,
+/turf/open/floor/plating,
/area/ship/engineering)
"vw" = (
-/obj/structure/table/wood,
-/obj/item/flashlight/lamp/green,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/wood,
-/area/ship/crew)
-"vA" = (
-/obj/structure/closet/crate{
- icon_state = "crateopen"
+/obj/structure/table/reinforced,
+/obj/item/cutting_board{
+ anchored = 1
},
-/obj/effect/turf_decal/box,
+/obj/item/kitchen/knife,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/cyan{
+ icon_state = "0-5"
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"vA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/item/paicard,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/turf/open/floor/plating,
+/area/ship/storage/eva)
"vJ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering)
-"vQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/door/firedoor/border_only{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/obj/machinery/door/airlock/command/glass{
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
dir = 4
},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
-"wh" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"vQ" = (
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "5-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"wh" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/effect/turf_decal/box/corners{
dir = 1
},
-/obj/machinery/door/airlock/public/glass,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_x = -12;
+ pixel_y = -20
+ },
+/obj/machinery/suit_storage_unit/independent/mining/eva,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"wv" = (
/turf/closed/wall,
/area/ship/bridge)
"ww" = (
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/mineral/titanium/twenty,
-/obj/effect/turf_decal/box,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/structure/closet/crate/secure/exo,
+/obj/item/clothing/under/rank/cargo/miner/hazard,
+/obj/item/clothing/under/rank/cargo/miner/hazard,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/head/hardhat/mining,
+/obj/item/clothing/head/hardhat/mining,
+/obj/item/clothing/head/hardhat/mining,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/turf/open/floor/plating,
+/area/ship/storage/eva)
"wW" = (
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"xh" = (
-/obj/structure/cable/yellow{
- icon_state = "1-2"
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/effect/landmark/start/assistant,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/structure/catwalk/over,
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "6-9"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
/turf/open/floor/plating,
-/area/ship/crew)
+/area/ship/hallway/central)
"xr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"xP" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
dir = 8
},
-/turf/open/floor/plating,
-/area/ship/crew)
+/obj/machinery/light/directional/west,
+/obj/structure/closet/crate,
+/obj/effect/spawner/lootdrop/maintenance/two,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"yu" = (
-/obj/machinery/mineral/ore_redemption{
+/obj/effect/turf_decal/techfloor{
dir = 4
},
-/obj/effect/turf_decal/corner/opaque/yellow/border{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/structure/cable/cyan{
+ icon_state = "5-8"
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/light/directional/east,
+/obj/structure/frame/machine{
+ anchored = 1;
+ state = 2;
+ icon_state = "box_1"
},
-/turf/open/floor/plasteel,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
"yx" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/structure/closet/wall/directional/west,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
},
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
+/obj/item/towel{
+ pixel_y = 4;
+ pixel_x = 4
+ },
+/obj/item/towel{
+ pixel_y = 4;
+ pixel_x = -3
+ },
+/obj/item/soap{
+ pixel_x = -1;
+ pixel_y = -2
+ },
+/turf/open/floor/plasteel/patterned,
+/area/ship/crew/toilet)
"yJ" = (
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"yN" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "0-8"
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
},
-/obj/effect/turf_decal/corner/opaque/yellow/border,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
"za" = (
-/obj/machinery/airalarm/directional/west,
-/obj/effect/turf_decal/corner/opaque/yellow/half{
- dir = 8
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/power/solar,
+/turf/open/floor/plating,
+/area/ship/external/dark)
"zc" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
},
-/obj/machinery/door/firedoor/border_only{
- dir = 8
+/obj/effect/decal/cleanable/oil/streak,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"zi" = (
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
},
+/obj/machinery/power/solar,
+/turf/open/floor/plating,
+/area/ship/external/dark)
+"zl" = (
+/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/obj/machinery/door/airlock/command/glass{
- dir = 4
- },
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
-"zq" = (
-/obj/structure/catwalk,
-/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
dir = 1
},
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"zF" = (
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/door/airlock/mining/glass{
+ name = "Mining Hangar"
},
-/mob/living/simple_animal/turtle,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
+/obj/structure/cable/cyan{
icon_state = "1-2"
},
/turf/open/floor/plasteel,
+/area/ship/storage/eva)
+"zq" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"zt" = (
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters,
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/machinery/suit_storage_unit/independent/mining/eva,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"zF" = (
+/obj/structure/ore_box,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/corner/opaque/yellow{
+ dir = 8
+ },
+/obj/structure/cable/cyan{
+ icon_state = "6-9"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"zI" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/item/cigbutt,
+/obj/effect/turf_decal/ntspaceworks_big/two,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"zK" = (
-/obj/machinery/button/shieldwallgen{
- id = "mining_ship_atmosgen";
- pixel_x = 8;
- pixel_y = 21
- },
-/obj/machinery/button/door{
- id = "mining_ship_port";
- name = "Port Hangar Shutters";
- pixel_x = -2;
- pixel_y = 23
+/obj/effect/decal/cleanable/glass,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/effect/turf_decal/industrial/warning{
dir = 1
},
/turf/open/floor/plating,
-/area/ship/cargo)
+/area/ship/storage/eva)
"zQ" = (
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/cable/yellow,
-/obj/machinery/power/terminal{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/structure/closet/firecloset/wall/directional/west,
+/obj/structure/cable/cyan{
+ icon_state = "2-5"
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"zY" = (
+/obj/structure/sign/warning/fire{
+ pixel_y = -20;
+ pixel_x = -10
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector{
+ dir = 8;
+ name = "connector port (Fuel)"
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"AD" = (
-/obj/effect/landmark/start/assistant,
+/obj/structure/cable/cyan{
+ icon_state = "4-9"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+ dir = 6
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/item/kirbyplants/fullysynthetic{
+ pixel_x = -10
+ },
+/obj/machinery/airalarm/directional/west,
+/obj/effect/turf_decal/techfloor{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/crew)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"AE" = (
-/obj/machinery/atmospherics/pipe/simple/general/hidden{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 9
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/effect/decal/cleanable/glass,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/machinery/airalarm/directional/south,
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"AQ" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
},
-/obj/structure/cable{
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"AY" = (
+/obj/structure/sign/poster/rilena/random{
+ pixel_x = 32
+ },
+/obj/structure/cable/cyan{
icon_state = "1-8"
},
-/obj/effect/turf_decal/corner/opaque/ntblue/half{
- dir = 4
+/obj/structure/cable/cyan{
+ icon_state = "0-1"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"Cn" = (
-/obj/structure/catwalk,
-/turf/closed/wall,
-/area/ship/engineering)
-"Cp" = (
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"CD" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 10
+/obj/structure/cable/yellow{
+ icon_state = "9-10"
+ },
+/obj/machinery/computer/monitor{
+ dir = 8;
+ icon_state = "computer-left"
},
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
-"CO" = (
-/obj/structure/window/reinforced{
+"Bq" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/bridge)
+"Bx" = (
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"BX" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/machinery/door/window/northright{
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"Cp" = (
+/obj/machinery/light/directional/west,
+/obj/machinery/mineral/unloading_machine{
+ input_dir = 1;
+ output_dir = 2
+ },
+/obj/effect/turf_decal/industrial/outline/yellow,
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
+"CB" = (
+/obj/structure/sign/warning/docking,
+/turf/closed/wall/yesdiag,
+/area/ship/engineering)
+"CD" = (
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater,
+/obj/machinery/door/window/northleft{
dir = 4;
name = "Engine Access"
},
-/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
dir = 4
},
+/obj/structure/window/plasma/reinforced{
+ dir = 8
+ },
/turf/open/floor/plating,
/area/ship/engineering)
+"CO" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/grille,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/crew/dorm)
"CP" = (
/obj/machinery/door/airlock/external,
/turf/open/floor/plating,
/area/ship/engineering)
-"DG" = (
-/obj/structure/table/reinforced,
-/obj/item/paper_bin,
-/obj/item/folder/yellow,
-/obj/item/folder/yellow,
-/obj/item/pen,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/requests_console{
- announcementConsole = 1;
- department = "Cockpit";
- pixel_x = -30;
- pixel_y = 30
- },
-/obj/machinery/camera/autoname,
-/obj/effect/turf_decal/corner/opaque/blue/half{
+"CS" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
dir = 1
},
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"DJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/large,
+/obj/effect/spawner/lootdrop/maintenance/three,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Ds" = (
/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/effect/turf_decal/corner/opaque/blue{
- dir = 5
- },
-/turf/open/floor/plasteel/white{
- dir = 1
+ icon_state = "4-8"
},
-/area/ship/crew)
-"Ee" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
dir = 4
},
-/obj/machinery/light/directional/north,
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"Ex" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ship/crew/canteen)
+"DG" = (
/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/structure/cable{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/public/glass,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"Fd" = (
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "5-10"
},
-/obj/effect/turf_decal/corner/opaque/yellow/bordercorner,
-/obj/machinery/light/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"Fn" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"Fz" = (
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/machinery/door/airlock{
+ name = "Dormitory"
},
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"FP" = (
-/turf/open/floor/plating,
-/area/ship/cargo)
-"FS" = (
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/dorm)
+"DJ" = (
/obj/structure/cable/yellow{
- icon_state = "0-4"
+ icon_state = "4-8"
},
-/obj/structure/cable/yellow{
- icon_state = "0-8"
+/obj/effect/decal/cleanable/ash,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"DR" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/machinery/power/solar,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"Gr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/turf/open/floor/plating/airless,
-/area/ship/bridge)
-"Gx" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/effect/turf_decal/corner/opaque/yellow/border,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"GU" = (
-/obj/machinery/vending/snack/random,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"GW" = (
-/obj/structure/table/reinforced,
-/obj/item/storage/toolbox/emergency{
- pixel_x = -12
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/item/paperplane{
+ dir = 4;
+ pixel_x = 14;
+ pixel_y = -8
},
-/obj/item/megaphone{
- pixel_x = 3;
- pixel_y = 1
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"Ee" = (
+/obj/structure/sink{
+ pixel_y = 19
},
-/obj/effect/turf_decal/corner/opaque/blue/half,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"He" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
+/obj/structure/mirror{
+ pixel_y = 28;
+ layer = 2.89
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
},
-/obj/structure/catwalk/over,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/plasteel/patterned,
+/area/ship/crew/toilet)
+"Ex" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/structure/grille,
+/obj/machinery/door/firedoor/window,
/turf/open/floor/plating,
-/area/ship/engineering)
-"Hh" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/area/ship/storage/eva)
+"Ez" = (
+/obj/machinery/power/smes/engineering,
+/obj/structure/cable/cyan{
+ icon_state = "0-2"
},
-/obj/machinery/atmospherics/pipe/layer_manifold,
-/obj/machinery/door/airlock/external{
- name = "Hangar Airlock"
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"EE" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
},
-/turf/open/floor/plasteel,
-/area/ship/crew)
-"HI" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
},
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"Fd" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"Fn" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
+ },
+/obj/structure/ore_box,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"Fq" = (
+/obj/effect/turf_decal/solarpanel,
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/crew/dorm)
+"Fz" = (
+/obj/structure/table/wood,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/item/reagent_containers/food/snacks/chips{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/toy/cards/deck/kotahi{
+ pixel_x = -11;
+ pixel_y = 6
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"FH" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+ dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"HP" = (
-/mob/living/simple_animal/butterfly{
- color = "#DBB17F";
- desc = "A moth.";
- name = "moth"
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/effect/landmark/observer_start,
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"Ia" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"FN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"FP" = (
+/obj/structure/closet/crate/large,
+/obj/machinery/portable_atmospherics/canister/hydrogen,
/turf/open/floor/plating,
-/area/ship/crew)
-"Ip" = (
-/obj/machinery/door/poddoor{
- id = "mining_ship_starboard"
+/area/ship/cargo)
+"FR" = (
+/obj/structure/closet/cardboard,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 1
},
-/turf/open/floor/plating,
-/area/ship/construction)
-"Is" = (
-/obj/effect/turf_decal/ntspaceworks_big/five,
-/turf/open/floor/plating,
-/area/ship/construction)
-"IF" = (
-/obj/machinery/power/port_gen/pacman,
+/obj/item/caution,
+/obj/item/caution,
+/obj/item/caution,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/storage/bag/trash,
+/obj/item/mop,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"FS" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
/obj/structure/cable/yellow{
icon_state = "0-4"
},
-/obj/item/stack/sheet/mineral/plasma/five,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering)
-"IJ" = (
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/door/firedoor/border_only{
- dir = 1
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"Gl" = (
+/obj/structure/bed,
+/obj/item/bedsheet/dorms,
+/obj/machinery/airalarm/directional/east,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"Gr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/machinery/door/airlock/medical,
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/mono,
-/turf/open/floor/plasteel/white,
-/area/ship/medical)
-"IK" = (
-/obj/effect/turf_decal/corner/opaque/yellow/half{
- dir = 4
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/plasteel/stairs{
+ dir = 4;
+ color = "#555555"
},
-/obj/structure/extinguisher_cabinet/directional/east,
-/turf/open/floor/plasteel,
+/area/ship/bridge)
+"Gx" = (
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"GH" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/effect/turf_decal/ntspaceworks_big/four,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
-"IT" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/o2{
- pixel_x = 4;
- pixel_y = 3
+"GN" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 4
},
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/medical{
- pixel_x = -5;
- pixel_y = -4
+/obj/machinery/light/directional/east,
+/obj/structure/closet/crate/engineering,
+/obj/item/t_scanner/adv_mining_scanner/lesser{
+ pixel_y = -3
},
-/obj/structure/extinguisher_cabinet/directional/north,
-/turf/open/floor/plasteel/mono,
-/area/ship/medical)
-"IZ" = (
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket";
- pixel_x = -4;
- pixel_y = -4
+/obj/item/pickaxe/drill{
+ pixel_y = -2
},
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket"
+/obj/item/pickaxe/drill{
+ pixel_y = -2
},
-/obj/item/clothing/suit/hazardvest{
- desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
- name = "emergency lifejacket";
- pixel_x = 4;
+/obj/item/pinpointer/mineral{
pixel_y = 4
},
-/obj/item/clothing/head/hardhat/mining{
- pixel_x = -4;
- pixel_y = -4
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"GU" = (
+/obj/docking_port/mobile{
+ can_move_docking_ports = 1;
+ dir = 2;
+ launch_status = 0;
+ name = "mining ship";
+ port_direction = 8;
+ preferred_direction = 4
},
-/obj/item/clothing/head/hardhat/mining,
-/obj/item/clothing/head/hardhat/mining{
- pixel_x = 4;
- pixel_y = 4
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
+ dir = 8;
+ id = "dwayne_mining_field";
+ locked = 1
},
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/gps/mining,
-/obj/item/clothing/glasses/meson/prescription,
-/obj/item/clothing/glasses/meson,
-/obj/item/clothing/glasses/meson,
-/obj/item/t_scanner/adv_mining_scanner/lesser,
-/obj/item/gun/energy/kinetic_accelerator,
-/obj/item/pickaxe/silver,
-/obj/item/pickaxe/silver,
-/obj/item/storage/bag/ore,
-/obj/item/storage/bag/ore,
-/obj/structure/closet/wall/directional/north{
- name = "equipment closet"
+/obj/machinery/door/poddoor{
+ id = "dwayne_mining"
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/structure/cable/cyan{
+ icon_state = "0-2"
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"Jg" = (
-/obj/effect/landmark/start/quartermaster,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"Jn" = (
-/obj/effect/turf_decal/ntspaceworks_big/four,
/turf/open/floor/plating,
-/area/ship/construction)
-"Jq" = (
-/obj/effect/turf_decal/ntspaceworks_big/two,
-/turf/open/floor/plating,
-/area/ship/construction)
-"Jy" = (
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/borderfloor{
+/area/ship/storage/eva)
+"GW" = (
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/bridge)
+"He" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "5-6"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "4-5"
+ },
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/effect/turf_decal/corner/opaque/blue/half{
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"Hh" = (
+/obj/structure/window/reinforced/fulltile,
+/obj/structure/grille,
+/obj/machinery/door/firedoor/window,
+/turf/open/floor/plating,
+/area/ship/cargo)
+"HE" = (
+/obj/effect/turf_decal/solarpanel,
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/crew/canteen)
+"HI" = (
+/obj/machinery/door/airlock/external{
dir = 4
},
-/obj/machinery/computer/operating/retro{
- dir = 4
+/turf/open/floor/plating,
+/area/ship/engineering)
+"HP" = (
+/obj/machinery/light/dim/directional/east,
+/obj/structure/toilet{
+ dir = 8;
+ pixel_y = 7;
+ pixel_x = 6
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"JH" = (
-/obj/structure/table/reinforced,
-/obj/item/clothing/head/hardhat/mining{
- pixel_x = -18;
- pixel_y = 8
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_y = 13;
+ pixel_x = -10
},
-/obj/item/phone{
- pixel_x = 5;
- pixel_y = 8
+/turf/open/floor/plasteel/patterned,
+/area/ship/crew/toilet)
+"Ia" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
},
-/obj/item/areaeditor/shuttle{
- pixel_x = -11
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"Ip" = (
+/obj/machinery/door/poddoor{
+ id = "dwayne_cargo"
},
-/obj/effect/turf_decal/corner/opaque/blue/half{
+/turf/open/floor/plating,
+/area/ship/cargo)
+"Is" = (
+/obj/structure/closet/crate/science,
+/obj/item/paicard,
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/ship/cargo)
+"IF" = (
+/obj/effect/turf_decal/corner/opaque/ntblue/half,
+/obj/machinery/computer/cargo{
dir = 1
},
-/obj/item/radio/intercom/wideband/directional/east,
-/obj/item/clothing/suit/armor/vest/capcarapace/duster,
-/obj/item/clothing/head/caphat/cowboy,
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
-"Ka" = (
-/obj/machinery/status_display/shuttle,
-/turf/closed/wall,
+"IJ" = (
+/obj/machinery/vending/cigarette,
+/obj/item/toy/figure/miner{
+ pixel_y = 17;
+ toysay = "Careful out there! Frontier is deadly this time of the year!... Or any time of the year, actually...";
+ pixel_x = -4
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"IK" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/cigbutt,
+/obj/effect/turf_decal/ntspaceworks_big/five{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"IT" = (
+/obj/structure/grille,
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
/area/ship/bridge)
-"Kc" = (
+"IZ" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_x = 25;
- pixel_y = -25
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"Jg" = (
+/obj/machinery/conveyor{
+ dir = 2;
+ id = "smelter_dwayne"
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"KO" = (
-/obj/effect/turf_decal/ntspaceworks_big/three,
-/turf/open/floor/plating,
-/area/ship/construction)
-"LH" = (
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
+"Jk" = (
/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast"
+ id = "dwayne_windows";
+ dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/turf/open/floor/plating,
-/area/ship/engineering)
-"LJ" = (
-/obj/machinery/vending/cola/random,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"LK" = (
-/obj/machinery/power/solar_control{
+/area/ship/crew/canteen)
+"Jn" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Jq" = (
+/obj/structure/closet/crate/engineering,
+/obj/item/stack/sheet/plastic/five,
+/obj/item/stack/sheet/glass/twenty,
+/obj/item/stack/sheet/metal/twenty,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Jy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/structure/cable/yellow,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/storage/overmap_ship/electric/directional/east,
-/turf/open/floor/plasteel/tech/grid,
-/area/ship/engineering)
-"LN" = (
-/obj/effect/turf_decal/industrial/warning/corner,
-/turf/open/floor/plating,
-/area/ship/construction)
-"LZ" = (
-/turf/closed/wall/r_wall,
-/area/ship/crew)
-"Mb" = (
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast"
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"JE" = (
+/obj/effect/decal/cleanable/ash,
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
},
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/ship/crew)
-"Mg" = (
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"JH" = (
+/obj/structure/bed,
+/obj/item/bedsheet/dorms,
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "4-10"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"JZ" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+/obj/structure/table,
+/obj/machinery/computer/helm/viewscreen/directional/north,
+/obj/item/decal_painter{
+ pixel_x = -2;
+ pixel_y = 3
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/item/hand_labeler{
+ pixel_x = 13;
+ pixel_y = -1
},
-/obj/effect/turf_decal/techfloor{
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Ka" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 1
},
-/turf/open/floor/plasteel/tech/techmaint,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "2-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"Kc" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/rack,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 6
+ },
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/clothing/head/welding{
+ pixel_x = -2;
+ pixel_y = 1
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
-"Mn" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+"Kz" = (
+/obj/effect/turf_decal/corner/opaque/ntblue/half{
+ dir = 4
+ },
+/obj/machinery/button/door{
+ id = "dwayne_windows";
+ name = "Fore Window Control";
+ pixel_x = -10;
+ pixel_y = 20;
+ dir = 2
+ },
+/obj/machinery/computer/helm{
dir = 8
},
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
-"Mo" = (
-/obj/structure/closet/crate/large,
-/obj/effect/spawner/lootdrop/maintenance/four,
-/obj/item/circuitboard/machine/chem_dispenser/drinks,
-/obj/item/circuitboard/computer/arcade/orion_trail,
-/obj/item/kinetic_crusher,
-/obj/effect/turf_decal/box,
-/obj/item/vending_refill/mining_equipment,
-/obj/item/ammo_box/c38_box,
-/obj/item/ammo_box/c38_box,
-/obj/item/ammo_box/c38_box,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+"KO" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
},
-/turf/open/floor/plasteel,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/cable/cyan{
+ icon_state = "6-9"
+ },
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
-"Mz" = (
-/obj/structure/bed,
-/obj/item/bedsheet/brown,
-/obj/structure/curtain/bounty,
-/obj/structure/sign/poster/official/no_erp{
- pixel_y = 32
+"LH" = (
+/obj/machinery/firealarm/directional/south{
+ pixel_x = -5
},
-/turf/open/floor/wood,
-/area/ship/crew)
-"MB" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"MD" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "5-10"
},
-/obj/machinery/light/directional/west,
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/stack/cable_coil/red{
- pixel_x = 2;
- pixel_y = 6
+/obj/structure/cable/yellow{
+ icon_state = "1-10"
},
-/obj/item/stock_parts/cell/high/plus,
-/obj/structure/cable{
- icon_state = "1-6"
+/obj/structure/extinguisher_cabinet/directional/south{
+ pixel_x = 7
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel/tech/grid,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"LJ" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"LK" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/components/binary/pump/on/layer2{
+ dir = 1;
+ name = "Air to Distro"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
-"MG" = (
+"LN" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 4
+ },
/obj/structure/cable/yellow{
- icon_state = "1-2"
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"LZ" = (
+/obj/structure/table/reinforced,
+/obj/structure/closet/secure_closet/freezer/wall/directional/south{
+ name = "kitchen cabinet"
+ },
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/item/storage/cans/sixbeer,
+/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/food/snacks/canned/beans,
+/obj/item/reagent_containers/food/snacks/canned/beans,
+/obj/item/reagent_containers/food/snacks/candy,
+/obj/item/reagent_containers/food/snacks/candy,
+/turf/open/floor/plasteel/grimy,
+/area/ship/crew/canteen)
+"Mb" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "Cargo Hangar"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/ship/cargo)
+"Mg" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 1
},
-/obj/machinery/light_switch{
- pixel_x = 21;
- pixel_y = 25
+/obj/effect/turf_decal/techfloor{
+ dir = 1
},
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"MQ" = (
-/obj/structure/cable/yellow{
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Mk" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"Mn" = (
+/obj/machinery/light/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"Mo" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "5-10"
+ },
+/turf/open/floor/plating,
+/area/ship/storage/eva)
+"Mz" = (
+/obj/machinery/holopad/emergency/command,
+/obj/effect/turf_decal/box/white{
+ color = "#283674"
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"MB" = (
+/obj/machinery/door/airlock/hatch{
+ name = "Cryogenics"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/binary/pump/on/layer2{
- dir = 1;
- name = "Air to Distro";
- target_pressure = 500
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/cryo)
+"MD" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
},
/obj/structure/cable/yellow{
- icon_state = "2-4"
+ icon_state = "0-1"
},
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"MG" = (
+/turf/closed/wall/r_wall,
+/area/ship/crew/dorm)
+"MQ" = (
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/obj/effect/turf_decal/techfloor,
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/button/door{
+ id = "dwayne_engines";
+ name = "Aft Window Control";
+ pixel_x = -20;
+ pixel_y = 0;
+ dir = 4
+ },
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"MT" = (
-/obj/effect/turf_decal/corner/opaque/yellow/half{
- dir = 1
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 4
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/plating,
+/area/ship/storage/eva)
"Nf" = (
-/obj/effect/turf_decal/number/five,
/obj/effect/turf_decal/industrial/warning,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
-/area/ship/construction)
+/area/ship/cargo)
"Nw" = (
-/obj/machinery/status_display/shuttle,
-/turf/closed/wall,
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/cyan{
+ icon_state = "6-8"
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
-"NM" = (
-/obj/structure/cable/yellow,
+"NC" = (
/obj/structure/cable/yellow{
- icon_state = "0-2"
+ icon_state = "0-8"
},
/obj/machinery/power/solar,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/obj/effect/turf_decal/solarpanel,
/turf/open/floor/plating/airless,
-/area/ship/external)
+/area/ship/external/dark)
+"NE" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/light/directional/east,
+/obj/machinery/power/solar_control{
+ dir = 8;
+ icon_state = "computer-right"
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"NM" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 2
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/crew/dorm)
"NN" = (
-/obj/structure/closet/crate/engineering,
-/obj/item/stack/sheet/metal/twenty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/effect/turf_decal/box,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "6-9"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"NT" = (
+/obj/structure/closet/cardboard,
+/obj/effect/spawner/lootdrop/glowstick,
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_y = 2
+ },
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_y = -3;
+ pixel_x = 7
+ },
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_x = -6
+ },
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_y = -3
+ },
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/effect/spawner/lootdrop/glowstick{
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/turf/open/floor/plating,
+/area/ship/storage/eva)
+"NW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/ntspaceworks_big/five,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"Op" = (
-/obj/item/vending_refill/mining_equipment{
- pixel_y = -8
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/tracker,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"Ou" = (
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 2
+ },
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"Ov" = (
+/obj/structure/closet/cardboard,
+/obj/item/chair/plastic,
+/obj/item/chair/plastic{
+ pixel_y = 4
+ },
+/obj/item/chair/plastic{
+ pixel_y = 8
+ },
+/obj/item/chair/plastic{
+ pixel_y = 11
+ },
+/obj/effect/turf_decal/ntspaceworks_big/one,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Oz" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/corner/opaque/ntblue/half,
+/obj/machinery/newscaster/directional/west,
+/obj/item/megaphone/cargo{
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"OJ" = (
+/turf/template_noop,
+/area/template_noop)
+"OL" = (
+/obj/machinery/light/directional/west,
+/obj/structure/filingcabinet/filingcabinet{
+ dir = 4;
+ pixel_x = -10
+ },
+/obj/effect/turf_decal/corner/opaque/ntblue/border{
+ dir = 8
+ },
+/obj/item/flashlight/flare,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/clothing/mask/breath,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey,
+/obj/item/ammo_box/c38,
+/obj/item/ammo_box/c38,
+/obj/item/gun/ballistic/revolver/detective,
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
+"OP" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/structure/cable/yellow{
+ icon_state = "6-9"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"OQ" = (
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters,
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/machinery/button/shieldwallgen{
+ id = "dwayne_cargo_field";
+ pixel_x = 1;
+ pixel_y = -19;
+ dir = 1
+ },
+/obj/machinery/button/door{
+ id = "dwayne_cargo";
+ name = "Blast Doors";
+ pixel_x = -8;
+ pixel_y = -20;
+ dir = 1
+ },
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"OW" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/structure/closet/crate/large,
+/obj/effect/turf_decal/industrial/warning,
+/obj/effect/spawner/lootdrop/plushie,
+/obj/effect/spawner/lootdrop/plushie,
+/obj/effect/spawner/lootdrop/plushie,
+/obj/effect/spawner/lootdrop/plushie,
+/obj/effect/spawner/lootdrop/plushie,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Pd" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/effect/turf_decal/ntspaceworks_big/four{
+ dir = 1
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"Pe" = (
+/obj/structure/catwalk,
+/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"Ph" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ship/storage/eva)
+"Pl" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-6"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-6"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "2-9"
},
-/turf/closed/wall/r_wall,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
/area/ship/engineering)
-"OJ" = (
-/turf/template_noop,
-/area/template_noop)
-"OL" = (
-/obj/effect/turf_decal/corner/opaque/blue/half{
+"Po" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
+ icon_state = "2-9"
+ },
+/mob/living/simple_animal/turtle{
dir = 4
},
-/obj/machinery/computer/helm/retro{
+/turf/open/floor/wood{
+ icon_state = "wood-broken2"
+ },
+/area/ship/crew/dorm)
+"Px" = (
+/obj/effect/turf_decal/corner/opaque/yellow,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"OP" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/machinery/computer/cryopod/directional/east,
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_x = -12;
+ pixel_y = -19
},
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/corner/opaque/ntblue/half{
- dir = 4
+/obj/item/radio/intercom/directional/south{
+ pixel_x = 1
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"OW" = (
-/obj/effect/turf_decal/number/one,
+/turf/open/floor/plasteel/tech,
+/area/ship/crew/cryo)
+"PH" = (
/obj/effect/turf_decal/industrial/warning/corner{
dir = 8
},
-/turf/open/floor/plating,
-/area/ship/construction)
-"Pd" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/corner/opaque/yellow,
-/obj/machinery/light_switch{
- pixel_x = 25;
- pixel_y = -25
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"PU" = (
+/obj/structure/filingcabinet/chestdrawer/wheeled{
dir = 8
},
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"Ph" = (
+/obj/item/folder/yellow,
+/obj/item/folder/yellow,
+/obj/item/folder/blue,
+/obj/item/folder,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/yellow/half{
- dir = 1
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/turf/open/floor/plasteel,
+/obj/item/pen,
+/obj/item/pen,
+/obj/effect/turf_decal/ntspaceworks_big/eight,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
-"Pl" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/electrical{
- pixel_x = 1;
- pixel_y = 6
+"Qe" = (
+/obj/structure/window{
+ dir = 4
},
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
+/obj/structure/curtain,
+/obj/machinery/shower{
+ dir = 1;
+ pixel_y = 0
},
-/obj/item/clothing/head/welding{
+/obj/item/bikehorn/rubberducky/plasticducky{
pixel_x = -2;
- pixel_y = 1
+ pixel_y = 3
},
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/structure/catwalk/over/plated_catwalk/white,
+/obj/machinery/door/window/northleft{
+ name = "Shower Door"
},
-/obj/structure/cable,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/clothing/gloves/color/yellow,
-/obj/item/reagent_containers/glass/beaker{
- list_reagents = list(/datum/reagent/fuel=50)
+/turf/open/floor/plasteel/mono/white,
+/area/ship/crew/toilet)
+"Qg" = (
+/obj/machinery/power/ship_gravity,
+/obj/structure/cable/cyan{
+ icon_state = "0-8"
},
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
-"Po" = (
-/obj/structure/cable/yellow,
-/obj/structure/cable/yellow{
- icon_state = "0-4"
- },
-/obj/structure/cable/yellow{
- icon_state = "0-8"
- },
-/obj/machinery/power/tracker,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"Px" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/structure/cable/yellow{
- icon_state = "2-4"
+"Qj" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/item/stack/sheet/cardboard{
+ amount = 2
},
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"PU" = (
-/obj/effect/turf_decal/ntspaceworks_big/one,
-/turf/open/floor/plating,
-/area/ship/construction)
-"Qe" = (
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
+/obj/effect/turf_decal/industrial/warning,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"Qp" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/door/airlock/external{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/turf/open/floor/plasteel/tech/techmaint,
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating,
/area/ship/engineering)
"QG" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/structure/closet/crate/miningcar{
+ name = "mining cart"
},
-/obj/structure/closet/crate/large,
-/obj/machinery/portable_atmospherics/canister/hydrogen,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"QI" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
},
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/storage/bag/trash{
- pixel_x = 6
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/structure/cable/yellow{
+ icon_state = "2-5"
},
-/obj/item/reagent_containers/glass/bucket,
-/obj/item/mop,
-/turf/open/floor/plasteel/tech/grid,
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
+ },
+/turf/open/floor/plating,
/area/ship/engineering)
"QO" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
+ dir = 1
},
-/obj/effect/turf_decal/corner/opaque/yellow/half,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"RA" = (
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning,
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ship/engineering)
+"RJ" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
/obj/structure/cable/yellow{
icon_state = "4-8"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"RN" = (
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/storage/eva)
+"RS" = (
+/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 1
+ },
+/obj/machinery/button/shieldwallgen{
+ id = "dwayne_mining_field";
+ pixel_x = 1;
+ pixel_y = 19
+ },
+/obj/machinery/button/door{
+ id = "dwayne_mining";
+ name = "Blast Doors";
+ pixel_x = -8;
+ pixel_y = 20
+ },
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"RT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
+ },
+/obj/effect/turf_decal/corner/opaque/black{
+ dir = 6
},
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"RU" = (
+/obj/structure/closet/crate/internals,
+/obj/item/tank/internals/oxygen/yellow,
+/obj/item/tank/internals/oxygen/yellow,
+/obj/item/tank/internals/oxygen/yellow,
+/obj/item/tank/internals/oxygen/yellow,
+/obj/item/tank/internals/oxygen/yellow,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/obj/item/tank/internals/emergency_oxygen/engi,
+/turf/open/floor/plating,
+/area/ship/storage/eva)
+"Se" = (
/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/machinery/door/airlock/engineering{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/effect/turf_decal/techfloor{
- dir = 8
+/obj/machinery/door/airlock/command/glass{
+ dir = 4;
+ name = "Bridge";
+ req_one_access = list(20,41)
},
-/turf/open/floor/plasteel,
-/area/ship/engineering)
-"RN" = (
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/structure/table,
-/obj/item/book/manual/wiki/surgery,
-/obj/item/storage/backpack/duffelbag/med/surgery,
-/obj/item/clothing/mask/surgical,
-/obj/item/clothing/suit/apron/surgical,
-/obj/item/clothing/gloves/color/latex/nitrile,
-/obj/effect/turf_decal/borderfloor{
+/obj/structure/cable/cyan{
+ icon_state = "4-10"
+ },
+/obj/effect/turf_decal/corner/opaque/black{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/obj/effect/turf_decal/corner/opaque/blue/half{
+/turf/open/floor/plasteel/stairs{
+ dir = 4;
+ color = "#555555"
+ },
+/area/ship/bridge)
+"Sg" = (
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"RS" = (
-/obj/structure/bed,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/borderfloor{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/obj/effect/turf_decal/corner/opaque/blue/half{
- dir = 4
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
},
-/obj/machinery/light/directional/west,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"RT" = (
-/obj/structure/chair/comfy/shuttle{
+/obj/structure/cable/cyan{
+ icon_state = "6-10"
+ },
+/obj/machinery/door/airlock/engineering{
+ dir = 4;
+ name = "Engineering"
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"St" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
dir = 4
},
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
-"RU" = (
-/obj/structure/closet/crate/wooden,
-/obj/item/clothing/suit/hooded/explorer,
-/obj/item/clothing/suit/hooded/explorer,
-/obj/item/clothing/suit/hooded/explorer,
-/turf/open/floor/plating,
-/area/ship/cargo)
-"Se" = (
-/obj/effect/turf_decal/corner/opaque/blue/half{
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ship/crew/dorm)
+"SB" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"SI" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/cyan{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/ship/cargo)
+"Tl" = (
+/obj/machinery/washing_machine,
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/plasteel/patterned,
+/area/ship/crew/toilet)
+"Tz" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood,
+/area/ship/crew/dorm)
+"TO" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"TP" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
+"TR" = (
+/obj/structure/chair/sofa/brown/old/right/directional/north,
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"Ub" = (
+/obj/effect/turf_decal/industrial/warning,
+/obj/machinery/cryopod,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/crew/cryo)
+"Uj" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half{
dir = 4
},
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"Um" = (
+/turf/closed/wall,
+/area/ship/crew/canteen)
+"Un" = (
+/obj/effect/decal/cleanable/ash,
+/obj/structure/railing{
dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/bridge)
-"Sg" = (
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"St" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/siphon/layer4,
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/effect/turf_decal/corner/opaque/yellow/half{
+ dir = 8
},
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
-"SB" = (
-/obj/effect/turf_decal/ntspaceworks_big/eight,
-/turf/open/floor/plating,
-/area/ship/construction)
-"Tl" = (
-/obj/structure/chair/comfy/orange/directional/north,
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"TP" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/item/gun/ballistic/shotgun/flamingarrow,
+/obj/item/gun/ballistic/shotgun/flamingarrow,
+/obj/item/gun/ballistic/shotgun/flamingarrow,
+/obj/structure/guncloset/shotgun{
+ name = "rifle locker";
+ desc = "A locker that holds rifles."
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"UD" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/structure/closet/crate/medical,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/storage/firstaid/regular,
+/obj/item/roller,
+/obj/item/reagent_containers/hypospray/medipen/survival,
+/obj/item/reagent_containers/hypospray/medipen/survival{
+ pixel_y = -4
},
-/obj/structure/catwalk/over,
-/turf/open/floor/plating,
-/area/ship/crew)
-"Ub" = (
-/obj/structure/bed/roller,
-/obj/item/bedsheet/medical,
-/obj/machinery/iv_drip,
-/obj/effect/turf_decal/corner/opaque/white/mono,
-/obj/effect/turf_decal/corner/opaque/blue/border{
- dir = 1
+/obj/item/storage/pill_bottle/charcoal/less,
+/obj/structure/cable/cyan{
+ icon_state = "5-10"
},
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/plasteel/mono/white,
-/area/ship/medical)
-"Um" = (
-/obj/structure/table/wood,
-/obj/machinery/microwave,
-/turf/open/floor/plasteel/grimy,
-/area/ship/crew)
-"Un" = (
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel,
+/obj/effect/turf_decal/ntspaceworks_big/six,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"UP" = (
-/obj/machinery/door/airlock/external{
- dir = 4
+/obj/docking_port/stationary{
+ width = 30;
+ height = 15;
+ dwidth = 15;
+ dir = 8
},
-/obj/structure/cable/yellow{
+/turf/template_noop,
+/area/template_noop)
+"UX" = (
+/obj/structure/cable/cyan{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "1-8"
+ },
+/obj/structure/cable/cyan{
icon_state = "4-8"
},
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4,
+/obj/structure/catwalk/over/plated_catwalk/dark,
/turf/open/floor/plating,
-/area/ship/engineering)
+/area/ship/hallway/central)
"UY" = (
-/obj/effect/spawner/lootdrop/maintenance,
-/obj/structure/closet/crate,
-/obj/effect/turf_decal/box,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
"Vb" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/structure/dresser{
+ dir = 4
},
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "mining_ship_blast";
- dir = 8
+/obj/machinery/light/directional/west,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola{
+ pixel_y = 14;
+ pixel_x = 3
},
-/turf/open/floor/plating,
-/area/ship/medical)
+/turf/open/floor/wood,
+/area/ship/crew/dorm)
"Vv" = (
-/obj/machinery/power/smes/engineering,
-/obj/structure/cable{
- icon_state = "0-10"
- },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/turf/open/floor/plating,
/area/ship/engineering)
"VP" = (
-/obj/machinery/atmospherics/components/unary/portables_connector{
- dir = 8
+/obj/machinery/airalarm/directional/south,
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
},
-/obj/structure/closet/emcloset/anchored,
/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
+"VZ" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_windows";
+ dir = 4
+ },
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
+/area/ship/crew/dorm)
"Wi" = (
-/obj/effect/turf_decal/corner/opaque/yellow/half,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/autolathe,
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/machinery/mineral/processing_unit{
+ output_dir = 4;
+ input_dir = 8
+ },
+/obj/effect/turf_decal/industrial/outline/yellow,
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/storage/eva)
"Wm" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/yellow/three_quarters{
- dir = 4
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/structure/cable/cyan{
+ icon_state = "2-5"
},
-/obj/structure/guncloset/shotgun,
-/obj/item/gun/ballistic/shotgun/flamingarrow,
-/obj/item/gun/ballistic/shotgun/flamingarrow,
-/obj/item/gun/ballistic/shotgun/flamingarrow,
-/turf/open/floor/plasteel,
-/area/ship/cargo)
-"WE" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/cyan{
+ icon_state = "2-9"
},
-/obj/machinery/light_switch{
- pixel_x = -25;
- pixel_y = -25;
- dir = 4
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/storage/eva)
+"WE" = (
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/techfloor{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel/tech/techmaint,
-/area/ship/engineering)
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
+"WK" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/cargo)
"WL" = (
-/obj/structure/table,
-/obj/item/storage/belt/utility,
-/obj/item/radio{
- pixel_x = 6;
- pixel_y = 7
+/obj/machinery/door/poddoor/preopen{
+ id = "dwayne_engines";
+ dir = 2
},
-/obj/machinery/light/directional/west,
-/obj/item/storage/box/lights/mixed,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/turf/open/floor/plasteel/tech/grid,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/turf/open/floor/plating,
/area/ship/engineering)
"WZ" = (
-/obj/structure/cable/yellow,
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/item/kirbyplants/random{
+ pixel_y = 18;
+ pixel_x = -8
},
-/obj/structure/cable/yellow{
- icon_state = "0-4"
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/turf/open/floor/wood{
+ icon_state = "wood-broken4"
},
-/obj/machinery/power/solar,
-/obj/effect/turf_decal/solarpanel,
-/turf/open/floor/plating/airless,
-/area/ship/external)
+/area/ship/crew/dorm)
"Xk" = (
+/obj/effect/turf_decal/corner/opaque/yellow/half,
+/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/industrial/warning,
-/turf/open/floor/plating,
-/area/ship/construction)
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"Xl" = (
+/obj/machinery/firealarm/directional/north,
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
+"Xm" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable/cyan{
+ icon_state = "0-8"
},
-/obj/effect/turf_decal/corner/opaque/ntblue/half{
- dir = 4
+/obj/machinery/light_switch{
+ dir = 2;
+ pixel_x = -12;
+ pixel_y = 20
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"Xn" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/turf/open/floor/plasteel/stairs{
+ dir = 4;
+ color = "#555555"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/area/ship/bridge)
+"Xn" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/turf_decal/techfloor{
- dir = 5
- },
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
"Xo" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
},
-/obj/machinery/button/door{
- id = "mining_ship_blast";
- name = "Blast Door Control";
- pixel_y = 28
+/obj/item/radio/intercom/directional/north,
+/obj/effect/turf_decal/corner/opaque/black{
+ dir = 6
},
-/obj/effect/turf_decal/box,
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"Xw" = (
-/obj/structure/table,
-/obj/item/defibrillator/loaded,
-/obj/item/stack/medical/suture,
-/obj/item/reagent_containers/syringe,
-/obj/item/reagent_containers/glass/bottle/epinephrine{
- pixel_x = -4
+/obj/structure/table/wood,
+/obj/item/reagent_containers/food/snacks/salad/oatmeal{
+ pixel_y = 14;
+ pixel_x = 10;
+ desc = "A nice bowl of oatmeal. You aren't quite sure how long it's been sitting here."
},
-/obj/item/reagent_containers/glass/bottle/charcoal{
- pixel_x = 7;
- pixel_y = 4
+/obj/structure/cable/yellow{
+ icon_state = "4-9"
},
/obj/structure/cable/yellow{
- icon_state = "4-8"
+ icon_state = "2-9"
+ },
+/obj/item/reagent_containers/food/drinks/soda_cans/cola{
+ pixel_y = 1;
+ pixel_x = -5
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"XC" = (
+/obj/structure/chair/sofa/brown/old/right/directional/south,
+/obj/item/radio/intercom/directional/north,
+/obj/item/cigbutt/cigarbutt{
+ pixel_x = 8;
+ pixel_y = -1
+ },
+/turf/open/floor/wood,
+/area/ship/crew/canteen)
+"YA" = (
+/obj/machinery/power/solar,
+/obj/effect/turf_decal/solarpanel,
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
},
-/obj/item/storage/belt/medical,
-/turf/open/floor/plasteel/mono,
-/area/ship/medical)
+/turf/open/floor/plating/airless,
+/area/ship/external/dark)
"YE" = (
-/obj/structure/catwalk/over,
-/obj/machinery/computer/helm/viewscreen/directional/north,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 6
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
},
-/turf/open/floor/plating,
+/obj/item/radio/intercom/directional/north,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/engineering)
"YJ" = (
/turf/closed/wall/r_wall,
/area/ship/cargo)
-"YN" = (
-/turf/closed/wall/r_wall,
-/area/ship/construction)
+"YN" = (
+/obj/machinery/door/poddoor{
+ id = "dwayne_cargo"
+ },
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
+ dir = 8;
+ id = "dwayne_cargo_field";
+ locked = 1
+ },
+/obj/structure/cable/cyan{
+ icon_state = "0-1"
+ },
+/turf/open/floor/plating,
+/area/ship/cargo)
+"YY" = (
+/obj/structure/closet/crate/trashcart,
+/obj/item/trash/candy,
+/obj/item/trash/sosjerky,
+/obj/item/trash/can/food/beans,
+/obj/effect/spawner/lootdrop/maintenance,
+/obj/structure/cable/cyan{
+ icon_state = "2-5"
+ },
+/obj/structure/cable/cyan{
+ icon_state = "5-8"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"Zj" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/machinery/button/door{
- dir = 1;
- id = "mining_ship_starboard";
- name = "Starboard Hangar Shutters";
- pixel_y = -21
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
-"Zv" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/machinery/door/airlock/engineering{
+ dir = 4;
+ name = "Engineering"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 8
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/machinery/light_switch{
- dir = 4;
- pixel_x = -20;
- pixel_y = 22
+/obj/effect/turf_decal/industrial/warning,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"Zv" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/structure/cable/cyan{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/mono/dark,
-/area/ship/bridge)
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
"ZA" = (
-/obj/effect/turf_decal/corner/opaque/yellow/half{
- dir = 1
- },
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/plasteel,
-/area/ship/cargo)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/storage/eva)
"ZK" = (
/obj/machinery/door/poddoor{
- id = "mining_ship_port"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
+ id = "dwayne_mining"
},
/turf/open/floor/plating,
-/area/ship/cargo)
+/area/ship/storage/eva)
"ZL" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 6
},
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/industrial/caution{
dir = 4
},
/turf/open/floor/plasteel/tech/techmaint,
/area/ship/engineering)
+"ZQ" = (
+/obj/structure/bed,
+/obj/item/bedsheet/dorms,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
"ZR" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
-/obj/machinery/light/directional/south,
-/turf/open/floor/plasteel/dark,
-/area/ship/crew)
+/obj/structure/sign/poster/official/safety_internals{
+ pixel_y = -32
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 8
+ },
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/hallway/central)
(1,1,1) = {"
OJ
@@ -2294,11 +3500,10 @@ OJ
OJ
OJ
OJ
-mF
-mF
+OJ
UP
-mF
-mF
+OJ
+OJ
OJ
OJ
OJ
@@ -2313,12 +3518,11 @@ OJ
OJ
OJ
OJ
-OJ
-CP
-St
+CB
+mF
HI
-aS
-CP
+mF
+CB
OJ
OJ
OJ
@@ -2329,58 +3533,55 @@ OJ
(3,1,1) = {"
OJ
OJ
-mF
-gF
-aD
-Cn
OJ
-LH
+OJ
+OJ
+OJ
+CP
iq
ZL
-gu
-ig
-zq
-Cn
-aD
-gF
-mF
+aS
+CP
+OJ
+OJ
+OJ
+OJ
+OJ
OJ
"}
(4,1,1) = {"
OJ
-OJ
-tq
-hK
-bb
-tq
+mF
+gF
+aD
+mF
fy
-tq
-tq
+WL
+Ou
Qp
-tq
-tq
-fy
-tq
-uP
-CO
-tq
+PH
+WL
+Pe
+mF
+aD
+gF
+mF
OJ
"}
(5,1,1) = {"
OJ
-OJ
tq
CD
vn
-WL
-IF
-IF
-as
+tq
+Mk
+tq
+tq
kf
-WE
-vJ
+tq
+tq
vJ
-MD
+tq
ls
gm
tq
@@ -2388,8 +3589,7 @@ OJ
"}
(6,1,1) = {"
OJ
-OJ
-Op
+tq
YE
bP
om
@@ -2408,7 +3608,6 @@ OJ
"}
(7,1,1) = {"
OJ
-OJ
tq
kQ
hZ
@@ -2428,106 +3627,100 @@ OJ
"}
(8,1,1) = {"
OJ
-YJ
-YJ
-YJ
-YJ
-YJ
-YJ
-YJ
+tq
+Ez
+AY
+NE
+Qg
+ow
lD
Nw
RA
+nJ
+Kc
+ig
+hK
+zY
tq
-tq
-tq
-tq
-tq
-tq
-tq
+OJ
"}
(9,1,1) = {"
-OJ
-YJ
+RN
qz
-aR
-uT
-za
-pS
-eM
+uc
+uc
+uc
+uc
+uc
mE
yu
iZ
-bj
-uk
-uk
-uk
-uk
-LN
-YN
+eM
+eM
+eM
+eM
+eM
+YJ
+gu
"}
(10,1,1) = {"
-OJ
-pl
+qz
MT
eH
Cp
Jg
vb
-eM
+uc
Sg
-AD
+mF
Zj
-bj
-uk
-uk
-uk
-uk
-Xk
-Ip
+eM
+pS
+ve
+xP
+SI
+mX
+YJ
"}
(11,1,1) = {"
-OJ
in
-MT
-FP
+mr
+as
Un
oB
Wi
-eM
+uc
aI
-TP
+AD
ZR
-bj
-uk
-uk
-uk
-uk
-Xk
-Ip
+eM
+CS
+Ov
+NW
+YY
+mf
+uP
"}
(12,1,1) = {"
-OJ
-in
+ZK
Fn
vA
NN
pq
nf
uc
-or
+LN
lv
-sD
-Mb
-uk
-uk
-uk
-uk
-Xk
+mA
+eM
+cL
+zI
+UD
+FR
+Nf
Ip
"}
(13,1,1) = {"
-fp
ZK
ZA
QG
@@ -2536,160 +3729,152 @@ zF
QO
Ex
wW
-nJ
+lv
sg
Hh
-uk
-uk
-uk
-uk
-Xk
+bb
+hO
+WK
+ul
+Qj
Ip
"}
(14,1,1) = {"
-OJ
-in
-Fn
-FP
+ZK
+eu
+NT
tX
Pd
Wm
-uc
+zl
or
-lv
+UX
sD
Mb
-uk
-uk
+oQ
+GH
PU
Is
Xk
Ip
"}
(15,1,1) = {"
-OJ
-in
+ZK
Ph
-FP
+bO
nL
kM
-YJ
-YJ
+TO
+Ex
IZ
-lv
+WE
dK
-bj
-uk
+Hh
+zc
uk
Jq
-mr
+FP
Nf
Ip
"}
(16,1,1) = {"
-OJ
-bl
-Fn
+ZK
+eu
ww
Mo
dx
-YJ
-LJ
-Sg
+wh
+uc
+EE
lv
tj
-bj
-uk
-uk
+eM
+rq
+tJ
KO
vf
bf
Ip
"}
(17,1,1) = {"
-OJ
-YJ
+GU
zK
-FP
+JE
IK
RU
-YJ
-GU
-Sg
+of
+uc
+fz
lv
Fd
-bj
-uk
-uk
+eM
+JZ
+bl
Jn
-SB
+bo
OW
YN
"}
(18,1,1) = {"
-OJ
-YJ
-YJ
-ei
-ei
-ei
-ei
-oC
+qz
+RS
+Uj
+GN
+zq
+zt
+uc
kb
-lv
+FH
pt
-bj
-LZ
-LZ
-LZ
-LZ
-LZ
-LZ
+eM
+oJ
+ja
+oy
+cc
+OQ
+YJ
"}
(19,1,1) = {"
-OJ
-OJ
-sP
-ei
-Jy
-RS
RN
-oC
+qz
+uc
+uc
+uc
+uc
+uc
my
-lv
+DR
Gx
-bj
-Mz
-cf
-bE
-LZ
-sP
-OJ
+eM
+eM
+eM
+eM
+eM
+YJ
+gu
"}
(20,1,1) = {"
OJ
-OJ
-FS
-ei
+mR
+dQ
oE
sp
pn
oC
-my
+ec
oR
-Gx
-bj
+dy
+bE
gT
yx
Qe
-Mb
-FS
+bj
+vm
OJ
"}
(21,1,1) = {"
OJ
-OJ
-FS
+zi
ei
Ub
gs
@@ -2702,143 +3887,212 @@ bj
Ee
HP
Tl
-Mb
-FS
+bj
+vm
OJ
"}
(22,1,1) = {"
OJ
-OJ
-FS
+za
ei
sZ
Px
-Kc
+pn
IJ
DJ
xh
vj
-wh
-MG
-Fz
Um
-Mb
-FS
+Um
+Um
+Um
+Um
+dh
OJ
"}
(23,1,1) = {"
OJ
-OJ
FS
-ei
-IT
-Xw
+MG
+ap
+ap
+ap
ap
-oC
Xl
AQ
OP
-bj
+Um
pv
aY
vw
-LZ
-FS
+LJ
+nY
OJ
"}
(24,1,1) = {"
OJ
-OJ
FS
-ei
+MG
fV
Vb
-rE
-wv
+cf
+ap
vQ
Ka
-zc
-wv
-rE
+Zv
+qt
+fp
Ia
xr
LZ
-FS
+nY
OJ
"}
(25,1,1) = {"
OJ
-OJ
-bW
+FS
NM
WZ
Po
-ms
+Tz
DG
Zv
qg
Mn
-mA
+Um
ms
kO
hy
-NM
nY
+HE
OJ
"}
(26,1,1) = {"
OJ
-OJ
-OJ
-OJ
-jS
-jS
-ms
-JH
+YA
+CO
+aV
+sP
+LH
+ap
Xo
ak
RT
-GW
-ms
-jS
+Um
+XC
+Xw
jS
-OJ
-OJ
+hd
+MD
OJ
"}
(27,1,1) = {"
OJ
+RJ
+NM
+ZQ
+JH
+Gl
+ap
+Se
+wv
+sM
+Um
+bx
+Fz
+TR
+ld
+RJ
OJ
+"}
+(28,1,1) = {"
OJ
-OJ
-OJ
-OJ
-rE
+bW
+Fq
+St
+VZ
rE
-Se
+wv
+Xm
OL
-sM
-rE
+Gr
+wv
rE
+Ds
+Jk
+HE
+bW
OJ
+"}
+(29,1,1) = {"
OJ
OJ
+TP
+ax
+Op
+Bq
+mJ
+FN
+Mz
+Jy
+Oz
+IT
+NC
+ql
+jz
OJ
OJ
"}
-(28,1,1) = {"
+(30,1,1) = {"
+OJ
+OJ
+OJ
+TP
+yN
+Bq
+pl
+hB
+Bx
+BX
+IF
+IT
+SB
+mv
+OJ
OJ
OJ
+"}
+(31,1,1) = {"
OJ
OJ
OJ
OJ
OJ
+GW
rE
-Gr
-Gr
-Gr
+Kz
+uT
+aR
rE
+GW
+OJ
+OJ
+OJ
+OJ
+OJ
+"}
+(32,1,1) = {"
+OJ
+OJ
+OJ
+OJ
+OJ
+OJ
+GW
+cw
+cw
+cw
+GW
OJ
OJ
OJ
diff --git a/_maps/shuttles/independent/independent_junker.dmm b/_maps/shuttles/independent/independent_junker.dmm
index a5b4354e7456..136e6e6e17fb 100644
--- a/_maps/shuttles/independent/independent_junker.dmm
+++ b/_maps/shuttles/independent/independent_junker.dmm
@@ -2277,7 +2277,7 @@
},
/obj/effect/decal/cleanable/glass,
/obj/structure/safe/floor,
-/obj/item/circuitboard/computer/cargo/express,
+/obj/item/circuitboard/computer/cargo,
/turf/open/floor/pod/dark,
/area/ship/crew/office)
"Rj" = (
diff --git a/_maps/shuttles/independent/independent_kilo.dmm b/_maps/shuttles/independent/independent_kilo.dmm
index a4c390afde8d..8e307abc2825 100644
--- a/_maps/shuttles/independent/independent_kilo.dmm
+++ b/_maps/shuttles/independent/independent_kilo.dmm
@@ -3,213 +3,186 @@
/turf/template_noop,
/area/template_noop)
"ac" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
+/turf/closed/wall/r_wall,
/area/ship/cargo)
"ak" = (
-/obj/machinery/power/shuttle/engine/fueled/plasma{
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/machinery/power/shuttle/engine/fueled/plasma,
+/turf/open/floor/plating/airless,
+/area/ship/engineering)
"am" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/conveyor{
- id = "NTMSLoad2";
- name = "on ramp"
- },
-/obj/structure/window/reinforced{
+/obj/machinery/autolathe,
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/structure/plasticflaps,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"ar" = (
-/obj/machinery/atmospherics/components/unary/shuttle/heater{
- dir = 4
- },
-/obj/machinery/door/window/westright{
- dir = 4
+/obj/machinery/atmospherics/components/unary/shuttle/heater,
+/obj/structure/window/reinforced/tinted{
+ dir = 8
},
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/door/poddoor/shutters{
- id = "kiloengine";
- name = "Engine Shutters";
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/open/floor/plating/airless,
+/area/ship/engineering)
"av" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 10
},
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/portable_atmospherics/scrubber/huge,
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/structure/sign/poster/random{
+ pixel_y = 32
},
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/table_frame,
+/obj/item/shard,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"ay" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/turf/open/floor/mineral/titanium/yellow,
+/obj/effect/decal/cleanable/glass,
+/mob/living/simple_animal/hostile/cockroach,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"aC" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/structure/reagent_dispensers/fueltank,
+/obj/structure/sign/poster/random{
+ pixel_y = 32
+ },
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
+ },
+/obj/effect/turf_decal/box/corners{
dir = 1
},
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable/pink{
+ icon_state = "0-2"
+ },
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/port)
+"aJ" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/obj/structure/chair/bench/olive/directional/east,
+/obj/structure/railing{
dir = 8
},
-/obj/effect/turf_decal/industrial/stand_clear,
-/turf/open/floor/plating,
-/area/ship/cargo)
-"aJ" = (
-/obj/structure/sign/warning/enginesafety,
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/engineering/engine)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ship/hallway/port)
"aS" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/atmospherics/components/unary/tank/air{
- piping_layer = 2
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
},
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/turf_decal/industrial/warning{
+/obj/effect/turf_decal/box/corners{
dir = 1
},
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/closet/secure_closet/engineering_personal{
+ populate = 0;
+ anchored = 1
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/item/storage/backpack/industrial,
+/obj/item/clothing/under/rank/engineering/engineer,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/shoes/workboots,
+/obj/item/clothing/head/hardhat/dblue,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
"aU" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 8
+/obj/structure/cable/cyan{
+ icon_state = "0-8"
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/structure/sign/warning/fire{
- pixel_x = 32;
- pixel_y = -32
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 5
},
+/obj/effect/decal/cleanable/glass,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"aZ" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/reagentgrinder{
- desc = "Used to grind things up into raw materials and liquids.";
- pixel_y = 5
- },
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
+/obj/machinery/airalarm/directional/south,
+/obj/effect/turf_decal/siding/wood{
+ dir = 4;
+ color = "#E3994E"
},
-/obj/machinery/light/directional/south,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/yew,
+/area/ship/crew)
"bg" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/structure/catwalk/over/plated_catwalk,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
+/obj/structure/cable/pink{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/machinery/light/small/directional/south{
+ pixel_x = -5
+ },
+/obj/machinery/light_switch{
+ pixel_x = 5;
+ dir = 1;
+ pixel_y = -19
},
/turf/open/floor/plating,
-/area/ship/cargo)
+/area/ship/hallway/port)
"bm" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/structure/closet/emcloset/anchored,
-/obj/machinery/button/door{
- id = "ntms_exterior";
- name = "NTMS-037 External Lock";
- normaldoorcontrol = 1;
- pixel_x = -25;
- pixel_y = -8;
- specialfunctions = 4
- },
-/obj/machinery/firealarm/directional/east,
-/obj/effect/decal/cleanable/cobweb,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/advanced_airlock_controller{
- pixel_x = -28;
- pixel_y = 3
- },
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
+/obj/effect/spawner/lootdrop/maintenance,
+/turf/open/floor/plating,
+/area/ship/maintenance/fore)
"bn" = (
-/obj/machinery/power/shuttle/engine/electric{
- dir = 4
- },
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/machinery/power/shuttle/engine/electric,
+/turf/open/floor/plating/airless,
+/area/ship/engineering)
"by" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/turf/open/floor/mineral/titanium/yellow,
+/obj/effect/decal/cleanable/wrapping,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"bA" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/crew/canteen/kitchen)
-"bF" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/bridge)
-"bG" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Gear Room"
+/obj/structure/chair/plastic,
+/obj/structure/cable/pink{
+ icon_state = "4-6"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/door/firedoor/border_only{
- dir = 4
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 5;
+ pixel_x = -14;
+ list_reagents = null
},
-/obj/machinery/door/firedoor/border_only{
- dir = 8
+/turf/open/floor/plasteel,
+/area/ship/hallway/central)
+"bF" = (
+/turf/closed/wall,
+/area/ship/bridge)
+"bG" = (
+/obj/structure/cable/pink{
+ icon_state = "5-8"
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/pink{
+ icon_state = "2-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
@@ -217,2186 +190,1909 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/turf/open/floor/mineral/plastitanium,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"bH" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 8
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
},
+/obj/machinery/firealarm/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+ dir = 5
},
-/obj/effect/turf_decal/industrial/warning/corner,
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"bL" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/structure/cable/pink{
+ icon_state = "1-8"
},
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -5
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/structure/extinguisher_cabinet/directional/east{
+ pixel_y = 7
},
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ship/hallway/central)
"bM" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/closet/crate,
-/obj/item/shovel,
-/obj/item/pickaxe,
-/obj/item/storage/box/lights/mixed,
-/obj/item/mining_scanner,
-/obj/effect/turf_decal/box/corners,
-/obj/effect/turf_decal/box/corners{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/item/gun/energy/kinetic_accelerator,
-/turf/open/floor/plating,
-/area/ship/cargo)
-"bP" = (
-/obj/effect/spawner/structure/window/shuttle,
-/obj/machinery/door/poddoor{
- id = "whiteship_bridge";
- name = "Garage DoorCockpit Emergency Blast Door";
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "4-9"
},
-/obj/machinery/door/firedoor/border_only{
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
+/obj/item/radio/intercom/directional/south,
+/obj/structure/cable/pink{
+ icon_state = "1-9"
+ },
/turf/open/floor/plating,
+/area/ship/hallway/port)
+"bP" = (
+/turf/closed/wall/r_wall,
/area/ship/bridge)
"bQ" = (
-/obj/effect/decal/cleanable/blood/old,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/light/small/directional/west,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/terminal{
+/turf/open/floor/plating,
+/area/ship/engineering)
+"bT" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+/obj/structure/cable/pink{
+ icon_state = "4-9"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"bU" = (
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
},
-/obj/effect/turf_decal/ntspaceworks_small/left,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"bT" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "4-8"
+/area/ship/hallway/port)
+"bV" = (
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/pink{
+ icon_state = "4-10"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/turf/open/floor/mineral/titanium/yellow,
-/area/ship/cargo)
-"bU" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
+/obj/structure/extinguisher_cabinet/directional/south{
+ pixel_x = 7
+ },
+/obj/machinery/firealarm/directional/south{
+ pixel_x = -5
+ },
+/turf/open/floor/plating,
+/area/ship/hallway/port)
+"bX" = (
+/obj/machinery/door/airlock/mining{
+ dir = 8;
+ name = "Cargo Bay"
+ },
+/obj/structure/cable/pink{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/components/binary/valve/layer2{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+ dir = 8
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"bV" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Engineering"
+/obj/effect/turf_decal/borderfloor{
+ dir = 8
},
/obj/machinery/door/firedoor/border_only{
- dir = 4
+ dir = 8
},
/obj/machinery/door/firedoor/border_only{
- dir = 8
+ dir = 4
},
-/obj/structure/cable{
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"bY" = (
+/obj/structure/cable/pink{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/engineering/engine)
-"bX" = (
-/obj/structure/ore_box,
-/obj/effect/turf_decal/box/corners{
- dir = 1
+ dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/turf/open/floor/plating,
-/area/ship/cargo)
-"bY" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"bZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
+/obj/structure/closet/crate/secure/exo,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/item/pickaxe/drill,
+/obj/item/pinpointer/mineral,
+/obj/structure/cable/pink{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/turf/open/floor/plating,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"ca" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/oil,
-/obj/structure/cable{
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/cable/pink{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -19;
+ pixel_x = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/south{
+ pixel_x = -6
+ },
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"cb" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/power/smes/engineering{
- charge = 1e+006
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/turf_decal/box/corners{
+ dir = 4
},
-/obj/structure/sign/warning/electricshock{
- pixel_y = 32
+/obj/effect/turf_decal/box/corners{
+ dir = 1
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/portable_atmospherics/canister/toxins,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/engineering)
+"cf" = (
+/obj/machinery/door/poddoor{
+ id = "kilocargo"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
+ id = "kilofield";
+ dir = 8
},
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"cf" = (
-/obj/structure/sign/warning/vacuum/external,
-/turf/closed/wall/mineral/titanium/nodiagonal,
+/obj/structure/cable/pink{
+ icon_state = "0-10"
+ },
+/turf/open/floor/plasteel/patterned/ridged,
/area/ship/cargo)
"ci" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/suit_storage_unit/independent/mining/eva,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/mineral/plastitanium,
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/obj/structure/ore_box,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"cj" = (
-/obj/structure/tank_dispenser/oxygen,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/mineral/plastitanium,
+/obj/structure/closet/crate/internals,
+/obj/effect/turf_decal/borderfloor{
+ dir = 9
+ },
+/obj/machinery/airalarm/directional/south,
+/obj/effect/turf_decal/box/corners,
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/emergency_oxygen,
+/obj/item/tank/internals/emergency_oxygen,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"ck" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/table,
-/obj/item/storage/toolbox/mechanical{
- pixel_y = 4
- },
-/obj/item/flashlight{
- pixel_x = 3;
- pixel_y = 3
+/obj/machinery/door/airlock{
+ name = "Dormitory"
},
-/obj/item/clothing/head/welding{
- pixel_x = -2;
- pixel_y = 1
+/obj/structure/cable/pink{
+ icon_state = "5-9"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+/obj/structure/cable/pink{
+ icon_state = "2-9"
},
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/light_switch{
- pixel_y = -20;
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/machinery/door/firedoor/border_only,
+/turf/open/floor/plasteel,
+/area/ship/crew/dorm)
"cq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/industrial/warning,
-/obj/machinery/light/small/built/directional/south,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
- },
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/closed/wall,
+/area/ship/crew/dorm)
"cr" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/power/port_gen/pacman{
- anchored = 1
+/obj/machinery/power/smes/engineering,
+/obj/structure/cable/pink{
+ icon_state = "0-10"
},
-/obj/item/wrench,
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable/yellow,
-/obj/machinery/light/directional/south,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/open/floor/plasteel,
+/area/ship/engineering)
"cw" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/command{
- name = "Ship Control"
+/obj/structure/table/wood,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/machinery/door/firedoor/border_only,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 7;
+ pixel_x = -6;
+ list_reagents = list(/datum/reagent/consumable/ethanol/beer = 10)
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/bridge)
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#E3994E"
+ },
+/turf/open/floor/wood/yew,
+/area/ship/crew)
"cB" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/structure/closet/secure_closet/miner{
+ populate = 0;
+ anchored = 1
+ },
+/obj/effect/turf_decal/borderfloor{
dir = 1
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = 10
},
-/turf/open/floor/plating,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/item/storage/backpack/explorer,
+/obj/item/clothing/shoes/workboots/mining,
+/obj/item/clothing/under/rank/cargo/miner/hazard,
+/obj/item/clothing/suit/hazardvest,
+/obj/item/clothing/suit/armor/vest/old,
+/obj/item/clothing/gloves/explorer,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/head/hardhat/mining,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"cC" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/door/airlock/engineering{
+ dir = 8;
+ name = "Engine Bay"
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/structure/cable/pink{
+ icon_state = "6-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/turf/open/floor/plasteel/mono,
+/area/ship/hallway/port)
"cJ" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/structure/closet/emcloset/anchored,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
+/obj/structure/chair/handrail{
+ dir = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/south,
-/obj/structure/sign/warning/xeno_mining{
- pixel_x = 32
+/obj/machinery/advanced_airlock_controller{
+ pixel_y = -21
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
-"cK" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/effect/decal/cleanable/crayon{
+ icon_state = "space";
+ pixel_y = 2;
+ pixel_x = 6;
+ paint_colour = "#FF0000"
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"cM" = (
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/pink{
+ icon_state = "0-9"
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -19;
+ pixel_y = 13
+ },
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/fore)
+"cK" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
+/obj/machinery/atmospherics/components/unary/passive_vent{
dir = 4
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/structure/cable{
- icon_state = "1-8"
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/external/dark)
+"cM" = (
+/obj/structure/cable/pink{
+ icon_state = "5-8"
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 4
},
-/obj/machinery/meter/atmos,
-/obj/machinery/light/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/pink{
+ icon_state = "6-8"
+ },
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"cP" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
+ id = "kilowindows"
},
-/obj/machinery/door/firedoor/border_only,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/machinery/atmospherics/pipe/layer_manifold,
+/turf/open/floor/plating/airless,
+/area/ship/hallway/port)
"cV" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Ship Saloon"
- },
-/obj/machinery/door/firedoor/border_only{
+/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/machinery/door/firedoor/border_only,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/pink{
+ icon_state = "2-9"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen/kitchen)
-"cW" = (
-/obj/machinery/power/smes/shuttle{
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "2-5"
},
-/obj/machinery/door/window/westright{
- dir = 4
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"cW" = (
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/structure/sink/kitchen{
+ dir = 8
},
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/effect/decal/cleanable/blood/old,
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 20;
+ pixel_y = -12
},
-/obj/structure/window/reinforced/spawner/north,
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+/turf/open/floor/plasteel/white,
+/area/ship/crew)
+"cY" = (
+/obj/structure/cable/pink{
+ icon_state = "0-4"
},
-/obj/machinery/door/poddoor/shutters{
- id = "kiloengine";
- name = "Engine Shutters";
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/power/terminal{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"cY" = (
-/obj/effect/decal/cleanable/greenglow,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
- },
+/turf/open/floor/plating,
+/area/ship/engineering)
+"cZ" = (
+/obj/machinery/power/ship_gravity,
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/machinery/button/door{
- name = "Shutter Control";
- dir = 4;
- pixel_y = -7;
- pixel_x = -23;
- id = "kiloengine"
- },
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/structure/cable/pink{
+ icon_state = "0-8"
},
-/obj/machinery/power/ship_gravity,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"cZ" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/item/gun/energy/laser/retro,
-/obj/structure/plaque/static_plaque/golden/captain{
- pixel_x = -32
- },
-/obj/item/paicard,
-/obj/item/clothing/shoes/cowboy/white,
-/obj/item/clothing/head/caphat/cowboy,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/spacecash/bundle/c1000,
-/obj/item/clothing/suit/armor/vest/capcarapace/duster,
-/turf/open/floor/carpet,
-/area/ship/crew)
+/area/ship/engineering)
"da" = (
-/obj/structure/chair/comfy/orange/directional/north{
- buildstackamount = 0;
- color = "#c45c57"
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"dc" = (
+/obj/item/kirbyplants/fullysynthetic{
+ pixel_x = -11
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/machinery/status_display{
- pixel_y = 32;
- pixel_x = -32
- },
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/carpet,
-/area/ship/crew)
-"dc" = (
-/obj/structure/table,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
- dir = 1
+/obj/structure/cable/pink{
+ icon_state = "0-1"
},
-/obj/machinery/microwave{
- pixel_y = 5
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/item/stack/tile/plasteel{
+ pixel_x = 7;
+ pixel_y = -8
},
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/east,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen/kitchen)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
"de" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/door/airlock/grunge{
+ name = "Cryogenics"
+ },
+/obj/structure/cable/pink{
+ icon_state = "2-9"
},
/obj/machinery/door/firedoor/border_only,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
+/turf/open/floor/plasteel,
+/area/ship/hallway/central)
"dt" = (
-/obj/machinery/vending/boozeomat/all_access,
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/crew/canteen/kitchen)
+/obj/machinery/vending/cigarette,
+/obj/effect/turf_decal/industrial/warning{
+ dir = 9
+ },
+/obj/machinery/airalarm/directional/west,
+/turf/open/floor/plasteel,
+/area/ship/hallway/central)
"dF" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4,
-/obj/structure/catwalk,
-/turf/open/floor/plating/airless,
-/area/ship/external)
-"eo" = (
-/obj/structure/reagent_dispensers/fueltank,
-/obj/item/weldingtool/largetank,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
+/obj/effect/turf_decal/miskilamo_small/right{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/general/hidden{
dir = 10
},
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/external/dark)
+"eo" = (
+/obj/machinery/power/port_gen/pacman{
+ anchored = 1
+ },
+/obj/structure/cable/cyan{
+ icon_state = "0-2"
+ },
/obj/effect/turf_decal/industrial/warning{
- dir = 5
+ dir = 4
},
-/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"eN" = (
/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/button/door{
- id = "kilocargo";
- name = "Cargo Bay Control";
- pixel_x = 25;
- pixel_y = 7;
dir = 8
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 10
- },
-/obj/effect/turf_decal/industrial/stand_clear,
-/obj/machinery/button/shieldwallgen{
- dir = 8;
- pixel_y = -6;
- pixel_x = 24;
- id = "kiloshield"
- },
-/turf/open/floor/plating,
+/obj/machinery/light/directional/west,
+/obj/structure/crate_shelf,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"fs" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+ dir = 4
},
-/turf/open/floor/mineral/titanium/blue,
-/area/ship/bridge)
+/obj/effect/decal/cleanable/insectguts,
+/turf/open/floor/plating,
+/area/ship/engineering)
"fu" = (
-/obj/machinery/power/smes/shuttle{
- dir = 4
+/obj/effect/turf_decal/corner/opaque/black/mono,
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/cargo)
+"fv" = (
+/obj/structure/cable/cyan{
+ icon_state = "1-10"
},
-/obj/machinery/door/window/westright{
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/window/reinforced/spawner,
/obj/effect/turf_decal/industrial/warning{
dir = 4
},
-/obj/machinery/door/poddoor/shutters{
- id = "kiloengine";
- name = "Engine Shutters";
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"fv" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
- },
-/obj/effect/turf_decal/ntspaceworks_small,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"gp" = (
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
- },
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/closet/wall/blue/directional/north{
+ name = "Captain's locker"
+ },
+/obj/item/clothing/under/rank/command/captain/suit,
+/obj/item/clothing/under/rank/command/captain/skirt,
+/obj/item/storage/backpack/captain,
+/obj/item/clothing/gloves/color/white,
+/obj/item/clothing/shoes/sneakers/brown,
+/obj/item/clothing/suit/jacket/leather/duster/command,
+/obj/item/clothing/glasses/cheapsuns,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+/obj/item/ammo_box/a12g/rubbershot,
+/obj/item/gun/ballistic/shotgun/doublebarrel/presawn{
+ spawnwithmagazine = 0
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/structure/cable/pink{
+ icon_state = "4-10"
},
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plasteel,
/area/ship/bridge)
"gs" = (
-/obj/effect/turf_decal/industrial/warning{
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/pink{
+ icon_state = "4-10"
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
dir = 1
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/pink{
+ icon_state = "0-10"
},
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+ dir = 6
},
-/obj/machinery/airalarm/directional/north,
-/obj/effect/turf_decal/ntspaceworks_small/right,
+/obj/item/cigbutt,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"gC" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/power/terminal{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/storage/toolbox/electrical{
+ pixel_x = -3;
+ pixel_y = 8
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/item/storage/toolbox/mechanical{
+ pixel_y = 4
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/effect/turf_decal/industrial/warning{
- dir = 8
+/obj/structure/table,
+/obj/machinery/light/small/directional/west,
+/obj/item/clothing/glasses/welding{
+ pixel_y = -9;
+ pixel_x = 5
},
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"hh" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "engine fuel pump"
- },
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
+/obj/structure/chair,
+/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"hN" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/machinery/shower{
- pixel_y = 18
+/obj/machinery/mineral/processing_unit{
+ input_dir = 8
},
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/turf_decal/industrial/warning{
+/obj/structure/railing/corner{
dir = 8
},
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/machinery/light_switch{
- dir = 8;
- pixel_x = 20;
- pixel_y = -12
- },
-/turf/open/floor/mineral/titanium/yellow,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"hR" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/table,
-/obj/item/stack/sheet/glass/fifty{
- pixel_x = -2;
- pixel_y = 2
- },
-/obj/item/stack/rods/fifty,
-/obj/item/storage/toolbox/electrical{
- pixel_x = -3;
- pixel_y = 8
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
},
-/obj/item/stock_parts/cell/high{
- charge = 100;
- maxcharge = 15000;
- pixel_x = 3;
- pixel_y = -1
+/obj/effect/turf_decal/arrows{
+ dir = 4
},
-/obj/item/stack/sheet/metal/fifty,
-/turf/open/floor/mineral/plastitanium,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"hS" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Bunk A"
+/obj/structure/chair/sofa/brown/old/left/directional/east,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 8
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 5
},
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#E3994E"
+ },
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/wood/yew,
/area/ship/crew)
"ig" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Bathroom"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/item/radio/intercom/directional/east,
+/obj/item/mop{
+ pixel_x = 17
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
+/obj/item/reagent_containers/glass/bucket{
+ pixel_x = 8;
+ pixel_y = 7;
+ list_reagents = list(/datum/reagent/water = 20)
},
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew)
-"im" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/structure/rack,
-/obj/item/storage/box/lights/mixed,
/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/maintenance/two,
-/obj/structure/sign/poster/contraband/random{
- pixel_x = 32
- },
-/obj/machinery/firealarm/directional/south,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"im" = (
+/obj/structure/grille,
+/obj/structure/window/fulltile,
+/turf/open/floor/plating/airless,
+/area/ship/hallway/central)
"io" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/table_frame,
-/obj/item/stack/sheet/metal,
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/bridge)
-"iM" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/machinery/door/airlock/command{
+ dir = 4;
+ name = "Bridge";
+ req_access_txt = "19"
+ },
+/obj/structure/cable/pink{
+ icon_state = "4-8"
},
-/obj/effect/decal/cleanable/blood/old,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+ dir = 4
},
-/obj/machinery/conveyor_switch/oneway{
- id = "NTMSLoad";
- name = "Off Ramp";
- pixel_y = 9;
- pixel_x = -8
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/obj/machinery/conveyor_switch/oneway{
- id = "NTMSLoad2";
- name = "On Ramp";
- pixel_x = 4
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/machinery/newscaster/directional/north,
-/turf/open/floor/plating,
-/area/ship/cargo)
-"iT" = (
-/obj/structure/cable{
- icon_state = "1-2"
+/turf/open/floor/plasteel/mono,
+/area/ship/bridge)
+"iM" = (
+/obj/structure/cable/pink{
+ icon_state = "2-6"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
-"jl" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 5
+ },
+/obj/structure/chair/bench/beige/directional/east{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 4
+ },
/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "1-2"
+/turf/open/floor/plasteel,
+/area/ship/hallway/port)
+"iT" = (
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
+ dir = 8
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/effect/decal/cleanable/food/flour,
+/mob/living/simple_animal/hostile/cockroach,
+/turf/open/floor/plasteel/white,
+/area/ship/crew)
+"jl" = (
+/obj/machinery/mineral/processing_unit_console{
+ pixel_y = 0;
+ output_dir = 4;
+ pixel_x = 20;
+ dir = 8;
+ machinedir = 1
},
-/turf/open/floor/mineral/titanium/yellow,
+/obj/effect/turf_decal/industrial/warning/corner,
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 5
+ },
+/obj/effect/turf_decal/industrial/loading,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"jx" = (
-/obj/machinery/autolathe,
-/obj/machinery/status_display{
+/obj/machinery/conveyor{
+ id = "kiloconveyor";
+ dir = 4
+ },
+/obj/structure/sign/poster/random{
pixel_y = 32
},
-/turf/open/floor/mineral/plastitanium,
+/obj/structure/railing,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"jK" = (
-/obj/item/stack/rods,
-/obj/machinery/holopad/emergency/command,
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/turf/open/floor/mineral/titanium/blue,
-/area/ship/bridge)
-"jU" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/item/stack/cable_coil,
-/obj/item/stock_parts/cell/high,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/industrial/warning{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/machinery/light/directional/north,
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -19;
+ pixel_x = -10
+ },
+/obj/structure/cable/pink{
+ icon_state = "4-8"
+ },
+/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"kb" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+/area/ship/bridge)
+"jU" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/borderfloor,
+/obj/effect/turf_decal/box/corners{
dir = 4
},
+/obj/effect/turf_decal/box/corners{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/machinery/airalarm/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/port)
+"kb" = (
+/obj/structure/chair/handrail,
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{
dir = 4
},
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/fore)
"kA" = (
-/turf/closed/wall/mineral/plastitanium/nodiagonal,
-/area/ship/engineering/engine)
+/turf/closed/wall/r_wall,
+/area/ship/engineering)
"mr" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/suit_storage_unit/inherit,
+/obj/item/clothing/suit/space/eva,
+/obj/item/clothing/head/helmet/space/eva,
+/obj/item/clothing/mask/breath,
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
},
-/obj/effect/turf_decal/industrial/warning{
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 4
+ },
+/obj/machinery/firealarm/directional/east,
+/obj/effect/turf_decal/box/corners{
dir = 8
},
-/obj/machinery/light/directional/east,
-/turf/open/floor/mineral/titanium/yellow,
+/obj/effect/turf_decal/box/corners,
+/obj/structure/cable/pink{
+ icon_state = "1-5"
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"mz" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/crew)
-"nd" = (
+/obj/structure/bed,
+/obj/item/bedsheet/dorms,
+/obj/machinery/light_switch{
+ pixel_x = 7;
+ pixel_y = 20
+ },
+/obj/effect/decal/cleanable/cobweb,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/structure/cable{
- icon_state = "2-4"
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"nd" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
},
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 9
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/pink{
+ icon_state = "8-9"
},
-/turf/open/floor/mineral/titanium/blue,
+/obj/structure/cable/pink{
+ icon_state = "1-5"
+ },
+/turf/open/floor/plating,
/area/ship/bridge)
"ng" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/power/terminal{
- dir = 8
- },
-/obj/structure/cable{
+/obj/structure/cable/pink{
icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 6
- },
-/obj/effect/turf_decal/industrial/warning{
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/power/terminal{
dir = 8
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"nJ" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/effect/decal/cleanable/glass,
+/obj/structure/cable/pink{
+ icon_state = "4-5"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/item/cigbutt,
/turf/open/floor/plating,
-/area/ship/cargo)
-"nO" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/conveyor{
- dir = 1;
- id = "NTMSLoad";
- name = "off ramp"
+/area/ship/engineering)
+"nJ" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/obj/structure/window/reinforced{
+/obj/machinery/button/door{
+ id = "kilocargo";
+ name = "blast door control";
+ pixel_x = -20;
+ pixel_y = 7;
dir = 4
},
-/obj/structure/plasticflaps,
-/turf/open/floor/plating,
-/area/ship/cargo)
-"oj" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible{
- dir = 9
+/obj/machinery/button/shieldwallgen{
+ dir = 4;
+ pixel_y = -2;
+ pixel_x = -19;
+ id = "kilofield"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 10
+/obj/item/clothing/head/cone{
+ pixel_y = 4;
+ pixel_x = -8
},
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"nO" = (
+/turf/closed/wall/r_wall,
+/area/ship/hallway/central)
+"oj" = (
+/obj/structure/table,
+/obj/machinery/atmospherics/pipe/manifold/orange/hidden,
+/obj/machinery/cell_charger,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"oP" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/tank/toxins{
- dir = 1
+/obj/structure/table,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+/obj/item/stack/sheet/mineral/plasma/ten,
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 11;
+ pixel_x = -13;
+ list_reagents = null
},
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"pV" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/effect/decal/cleanable/blood/old,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/mob/living/simple_animal/hostile/netherworld/migo{
- environment_smash = 0;
- faction = list("neutral");
- melee_damage_lower = 5;
- melee_damage_upper = 10;
- name = "maurice"
+/obj/machinery/conveyor_switch/oneway{
+ id = "kiloconveyor";
+ pixel_x = 11;
+ pixel_y = 14;
+ layer = 3.09
},
-/turf/open/floor/mineral/titanium/yellow,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"qv" = (
-/obj/machinery/door/poddoor{
- id = "kilocargo";
- name = "NTMS-037 Bay Blast Door"
- },
-/obj/machinery/conveyor{
- dir = 1;
- id = "NTMSLoad";
- name = "off ramp"
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/power/shieldwallgen/atmos/roundstart{
- id = "kiloshield";
+/obj/machinery/door/airlock/external{
dir = 4
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"qw" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
/obj/effect/mapping_helpers/airlock/locked,
-/obj/machinery/atmospherics/pipe/layer_manifold{
+/turf/open/floor/plating/airless,
+/area/ship/maintenance/fore)
+"qw" = (
+/obj/machinery/door/airlock/external{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "Mining Airlock";
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
+/obj/effect/mapping_helpers/airlock/locked,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/fore)
"rc" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "1-8"
},
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
/turf/open/floor/plating,
-/area/ship/cargo)
+/area/ship/hallway/port)
"rq" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/structure/cable/pink{
+ icon_state = "4-9"
},
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/machinery/door/poddoor{
- id = "kilocargo";
- name = "NTMS-037 Bay Blast Door"
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/pink{
+ icon_state = "4-8"
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
+/turf/open/floor/plating,
+/area/ship/hallway/central)
"rO" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/machinery/door/airlock/glass{
+ dir = 8;
+ name = "Crew Quarters"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+/obj/machinery/door/firedoor/border_only{
dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
-"rW" = (
-/obj/machinery/porta_turret/ship/weak{
+/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/turf/closed/wall/mineral/titanium,
-/area/ship/bridge)
+/turf/open/floor/plasteel,
+/area/ship/crew)
+"rW" = (
+/turf/closed/wall/yesdiag,
+/area/ship/maintenance/fore)
"sD" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 8
- },
-/obj/effect/turf_decal/siding/wood{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/structure/chair/sofa/brown/right/directional/south,
-/turf/open/floor/wood{
- icon_state = "wood-broken3"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
},
-/area/ship/crew/canteen/kitchen)
+/obj/machinery/computer/helm/viewscreen/directional/south,
+/obj/structure/catwalk/over/plated_catwalk,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
"sG" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/structure/cable/pink{
+ icon_state = "1-10"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -5
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/structure/extinguisher_cabinet/directional/east{
+ pixel_y = 7
},
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/machinery/light_switch{
- pixel_x = 13;
- pixel_y = 21
+/obj/structure/cable/pink{
+ icon_state = "6-10"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/ship/crew)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
"sW" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/machinery/computer/cargo/express{
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
+ },
+/obj/machinery/computer/cargo/retro{
dir = 8
},
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"vv" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_bridge";
- name = "Garage DoorCockpit Emergency Blast Door"
+ id = "kilowindows"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ship/bridge)
+/turf/open/floor/plating/airless,
+/area/ship/hallway/central)
"vU" = (
-/obj/docking_port/stationary{
- width = 30;
- height = 15;
- dwidth = 15
+/obj/structure/cable/pink{
+ icon_state = "1-2"
},
-/turf/template_noop,
-/area/template_noop)
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
"wc" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Ship Lockers"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
-/obj/machinery/door/firedoor/border_only{
+/obj/structure/table/wood,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/toy/cards/deck{
+ pixel_y = 22
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/item/reagent_containers/food/snacks/sandwich{
+ pixel_y = 9;
+ pixel_x = -1
},
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/wood/yew,
/area/ship/crew)
"wh" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 4
+/turf/closed/wall/r_wall,
+/area/ship/crew/dorm)
+"xe" = (
+/obj/machinery/door/airlock/external/glass{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
-"xe" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/external{
- name = "Mining Airlock";
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "6-10"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/maintenance/fore)
"xk" = (
-/obj/structure/table/wood,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/storage/bag/tray,
-/obj/item/reagent_containers/food/snacks/burger/bearger,
-/obj/effect/turf_decal/siding/wood{
- dir = 10
- },
-/turf/open/floor/wood{
- icon_state = "wood-broken3"
- },
-/area/ship/crew/canteen/kitchen)
+/turf/closed/wall,
+/area/ship/hallway/central)
"xF" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "8-9"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/ship/crew)
-"yd" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/power/terminal{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/kirbyplants/fullysynthetic{
+ pixel_x = 11
},
-/obj/structure/cable/yellow{
- icon_state = "0-2"
+/obj/machinery/airalarm/directional/east,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#E3994E"
},
+/turf/open/floor/wood/yew,
+/area/ship/crew/dorm)
+"yd" = (
+/obj/structure/catwalk/over/plated_catwalk,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
+/obj/structure/cable/pink{
+ icon_state = "4-8"
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
- },
-/obj/machinery/meter/atmos/layer2,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"yn" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/closet/crate,
-/obj/item/stack/sheet/metal/twenty,
-/obj/item/stack/sheet/glass{
- amount = 10
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/structure/closet/secure_closet/freezer/fridge{
+ populate = 0
},
-/obj/item/storage/box/lights/bulbs,
-/obj/item/stack/sheet/mineral/plasma{
- amount = 10
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -20;
+ pixel_y = -8
},
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 1
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable/pink{
+ icon_state = "0-10"
},
-/obj/machinery/light/directional/west,
-/obj/structure/extinguisher_cabinet/directional/south,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/effect/decal/cleanable/cobweb,
+/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/effect/spawner/lootdrop/ration,
+/obj/item/reagent_containers/food/snacks/icecreamsandwich,
+/obj/item/reagent_containers/food/snacks/icecreamsandwich,
+/turf/open/floor/plasteel/white,
+/area/ship/crew)
"yF" = (
-/obj/effect/spawner/structure/window/shuttle,
-/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ship/crew/canteen/kitchen)
+/turf/closed/wall/r_wall,
+/area/ship/crew)
"zc" = (
-/obj/structure/table,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 8
+ },
+/obj/structure/curtain,
+/obj/machinery/shower{
dir = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/lootdrop/ration{
- pixel_x = -6;
+/obj/item/soap{
pixel_y = 4
},
-/obj/effect/spawner/lootdrop/ration{
- pixel_x = -6;
- pixel_y = 8
- },
-/obj/item/reagent_containers/food/condiment/enzyme{
- layer = 5;
- pixel_x = 12;
- pixel_y = 6
+/obj/item/bikehorn/rubberducky/plasticducky{
+ pixel_x = -9;
+ pixel_y = -7
},
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen/kitchen)
+/turf/open/floor/plasteel/freezer,
+/area/ship/crew)
"zH" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
-/obj/effect/turf_decal/siding/wood{
- dir = 2
- },
-/obj/structure/chair/sofa/brown/left/directional/west,
-/turf/open/floor/wood{
- icon_state = "wood-broken6"
- },
-/area/ship/crew/canteen/kitchen)
-"AB" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/external{
- name = "Mining Airlock";
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+ dir = 4
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
-"AE" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/shuttle{
- name = "Captain's Quarters"
+/obj/structure/cable/pink{
+ icon_state = "5-9"
},
-/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/door/firedoor/border_only{
- dir = 4
+ dir = 8
},
/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/machinery/door/airlock{
+ name = "Dormitory";
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/effect/turf_decal/siding/wood{
+ dir = 8;
+ color = "#E3994E"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/effect/turf_decal/siding/wood{
+ dir = 4;
+ color = "#E3994E"
},
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/wood/yew,
/area/ship/crew)
-"AP" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/machinery/turretid{
- icon_state = "control_kill";
- lethal = 1;
- locked = 0;
- name = "Mining Turret control panel";
- pixel_x = -28;
- pixel_y = 6;
- req_access = null
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
+"AB" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"AE" = (
+/obj/structure/closet/cabinet,
+/obj/item/clothing/shoes/sneakers/black,
+/obj/item/clothing/shoes/sneakers/black,
+/obj/item/clothing/under/utility,
+/obj/item/clothing/under/utility,
+/obj/item/clothing/under/utility/skirt,
+/obj/item/clothing/under/utility/skirt,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable/pink{
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 6
+/obj/effect/turf_decal/siding/wood{
+ dir = 1;
+ color = "#E3994E"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/turf/open/floor/wood/yew,
+/area/ship/crew/dorm)
+"AP" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "engine fuel pump";
+ target_pressure = 500
},
-/turf/open/floor/mineral/titanium/blue,
-/area/ship/bridge)
+/obj/machinery/airalarm/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/engineering)
"AQ" = (
-/turf/closed/wall/mineral/plastitanium,
-/area/ship/engineering/engine)
+/turf/closed/wall,
+/area/ship/engineering)
"AV" = (
-/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/cyan{
+ icon_state = "4-5"
+ },
+/obj/structure/cable/pink{
+ icon_state = "0-6"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
/obj/machinery/power/terminal{
dir = 8
},
-/obj/structure/cable{
- icon_state = "0-4"
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ship/engineering)
+"Bm" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
},
/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"Bm" = (
-/obj/structure/bed,
-/obj/item/bedsheet/captain,
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/wood,
-/area/ship/crew)
+/area/ship/engineering)
"Bu" = (
-/obj/effect/spawner/structure/window/shuttle,
-/obj/machinery/door/poddoor{
- id = "whiteship_bridge";
- name = "Garage DoorCockpit Emergency Blast Door"
- },
-/turf/open/floor/plating,
+/turf/closed/wall/r_wall/yesdiag,
/area/ship/bridge)
"BP" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+/obj/effect/turf_decal/borderfloor/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
},
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"BS" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_bridge";
- name = "Garage DoorCockpit Emergency Blast Door";
+ id = "kilobridge";
dir = 4
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 8
- },
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/ship/bridge)
"Co" = (
-/obj/effect/decal/cleanable/oil,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/obj/machinery/door/poddoor{
+ id = "kilocargo"
},
-/turf/open/floor/plating,
+/obj/docking_port/mobile{
+ dir = 2;
+ launch_status = 0;
+ name = "Mining Shuttle";
+ port_direction = 8;
+ preferred_direction = 4
+ },
+/turf/open/floor/plasteel/patterned/ridged,
/area/ship/cargo)
"Cv" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/cable/pink{
+ icon_state = "2-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/turf/open/floor/mineral/titanium/yellow,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/medical,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/storage/firstaid/regular,
+/obj/item/roller,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"Da" = (
-/obj/structure/chair/comfy/shuttle,
-/obj/effect/turf_decal/industrial/warning,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/mineral/titanium/blue,
-/area/ship/bridge)
-"Ds" = (
-/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
-/obj/item/folder/yellow{
- pixel_x = -4;
- pixel_y = 6
- },
-/obj/item/paper/crumpled/bloody{
- default_raw_text = "We struck gold, literally. We found some good rocks out near Centurai-II rich with the stuff. Kae said he and Milos found something out while prospecting, some sort of glowing cube. It's jammed in there good, so we're anchoring until we sort this out...";
- pixel_x = 4;
- pixel_y = 4
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/cargo)
+"Ds" = (
+/obj/structure/filingcabinet/chestdrawer{
+ dir = 8
},
-/obj/item/gps{
- gpstag = "NTMS-037";
- pixel_x = -9;
- pixel_y = 4
+/obj/item/folder/blue,
+/obj/item/folder/yellow,
+/obj/item/folder,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/item/computer_hardware/card_slot,
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable/pink{
+ icon_state = "0-8"
},
-/obj/machinery/firealarm/directional/north,
-/obj/item/areaeditor/shuttle,
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/plasteel,
/area/ship/bridge)
"Ew" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sign/poster/contraband/random{
- pixel_x = 32
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/chair/sofa/brown/corner/directional/south,
-/obj/machinery/firealarm/directional/north,
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/wood{
- icon_state = "wood-broken"
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/light/small/directional/south,
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -19;
+ pixel_x = -8
},
-/area/ship/crew/canteen/kitchen)
+/obj/structure/catwalk/over/plated_catwalk,
+/obj/structure/cable/pink{
+ icon_state = "4-6"
+ },
+/obj/item/cigbutt,
+/turf/open/floor/plating,
+/area/ship/hallway/central)
"EG" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/machinery/cryopod,
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/light/small/directional/north,
-/obj/machinery/computer/cryopod/directional/west,
-/turf/open/floor/wood,
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/confetti,
+/turf/open/floor/plasteel/white,
/area/ship/crew)
"EU" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/door/airlock/command{
- name = "Ship Control";
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "1-2"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 4
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_x = -5
},
-/obj/machinery/door/firedoor/border_only{
+/obj/item/cigbutt,
+/obj/machinery/computer/cryopod/retro/directional/west,
+/turf/open/floor/plasteel,
+/area/ship/hallway/central)
+"GK" = (
+/obj/structure/table,
+/obj/effect/turf_decal/industrial/warning{
dir = 8
},
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/light_switch{
+ pixel_x = -10;
+ pixel_y = 20
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/item/radio{
+ pixel_y = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/item/radio{
+ pixel_y = 5
},
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen/kitchen)
-"GK" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/radio{
+ pixel_y = 5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 9
+/obj/item/radio{
+ pixel_y = 5
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 9
+/obj/item/radio{
+ pixel_y = 5
},
-/turf/open/floor/mineral/titanium/blue,
-/area/ship/bridge)
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/central)
"GM" = (
-/obj/structure/table,
-/obj/machinery/recharger,
-/obj/item/radio/intercom/wideband/directional/north,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/computer/crew/retro{
+ dir = 4
+ },
+/obj/structure/cable/pink{
+ icon_state = "4-6"
+ },
+/obj/structure/sign/poster/random{
+ pixel_y = 32
+ },
+/turf/open/floor/plasteel,
/area/ship/bridge)
"HP" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/item/kirbyplants/fullysynthetic{
+ pixel_x = 11
},
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
+/obj/structure/extinguisher_cabinet/directional/east{
+ pixel_y = 7
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -5
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/effect/turf_decal/siding/wood{
+ dir = 4;
+ color = "#E3994E"
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
+/obj/effect/decal/cleanable/confetti,
+/obj/item/cigbutt,
+/turf/open/floor/wood/yew,
+/area/ship/crew)
"Ih" = (
-/obj/structure/table,
-/obj/item/wrench,
-/obj/item/tank/internals/emergency_oxygen,
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/light/directional/west,
-/turf/open/floor/mineral/plastitanium,
+/obj/structure/cable/pink{
+ icon_state = "1-6"
+ },
+/obj/structure/ore_box,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"Jf" = (
-/turf/closed/wall/mineral/titanium/nodiagonal,
-/area/ship/engineering/engine)
+/turf/closed/wall/r_wall,
+/area/ship/hallway/port)
+"Jt" = (
+/obj/structure/sign/warning/docking,
+/turf/closed/wall/yesdiag,
+/area/ship/maintenance/fore)
"Kz" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
+/obj/effect/turf_decal/borderfloor{
+ dir = 5
+ },
/obj/structure/rack,
-/obj/item/storage/toolbox/emergency,
-/obj/item/circuitboard/machine/ore_redemption,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 4
+/obj/item/stack/sheet/plastic/five,
+/obj/item/stack/sheet/glass/twenty,
+/obj/item/stack/sheet/metal/twenty,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
},
-/obj/machinery/light/directional/east,
-/turf/open/floor/plating,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"KB" = (
+/turf/closed/wall,
+/area/ship/maintenance/fore)
+"KM" = (
+/obj/machinery/atmospherics/components/binary/valve/layer4,
/obj/effect/turf_decal/industrial/warning{
dir = 1
},
-/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/oil/streak,
+/obj/item/cigbutt,
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/turf/open/floor/plasteel,
+/area/ship/hallway/port)
+"KR" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "Cargo Bay"
},
-/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{
- dir = 4
+/obj/structure/cable/pink{
+ icon_state = "1-2"
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"KM" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/structure/ore_box,
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/effect/turf_decal/borderfloor,
+/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
- },
-/obj/effect/decal/cleanable/cobweb,
-/obj/machinery/atmospherics/components/binary/pump/layer4{
- dir = 1;
- name = "Scrubbers to Outside"
+/turf/open/floor/plasteel/patterned/grid,
+/area/ship/hallway/central)
+"La" = (
+/obj/effect/turf_decal/industrial/warning{
+ dir = 1
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"KR" = (
-/obj/structure/table/wood,
-/obj/item/storage/fancy/cigarettes/cigars/havana{
- pixel_y = 5
+/obj/item/clothing/head/cone{
+ pixel_y = 4;
+ pixel_x = 11
},
-/obj/item/crowbar/red,
-/obj/item/lighter{
- pixel_x = -8;
- pixel_y = 8
+/obj/structure/extinguisher_cabinet/directional/east{
+ pixel_y = 7
},
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/carpet,
-/area/ship/crew)
-"La" = (
-/obj/effect/spawner/structure/window/shuttle,
-/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -5
},
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/plating,
+/obj/item/cigbutt,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"LC" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/manifold/orange/visible{
- dir = 8
+/obj/structure/cable/cyan{
+ icon_state = "4-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/structure/cable/pink{
+ icon_state = "2-5"
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/effect/turf_decal/industrial/warning/corner{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"Mj" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/suit_storage_unit/independent/mining/eva,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/mineral/unloading_machine,
+/obj/structure/railing,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"MI" = (
-/obj/machinery/power/smes/shuttle{
- dir = 4
- },
-/obj/machinery/door/window/westright{
- dir = 4
- },
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/structure/window/reinforced/spawner,
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+/obj/machinery/power/smes/shuttle,
+/obj/structure/window/reinforced/tinted{
+ dir = 8
},
-/obj/machinery/door/poddoor/shutters{
- id = "kiloengine";
- name = "Engine Shutters";
+/obj/effect/turf_decal/industrial/warning{
dir = 4
},
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"MY" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
- dir = 1
- },
-/obj/item/gun/energy/e_gun/mini,
-/obj/item/stock_parts/cell/gun/mini,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/shoes/workboots,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/shoes/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/structure/chair/sofa/brown/old/corner/directional/north,
+/obj/structure/sign/poster/random{
+ pixel_y = 0;
+ pixel_x = -32
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/effect/decal/cleanable/vomit/old{
+ pixel_x = -5
},
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/wood/yew,
/area/ship/crew)
"Ng" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
-/obj/effect/turf_decal/industrial/warning/corner,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
- dir = 1
- },
-/obj/structure/cable{
+/obj/structure/cable/pink{
icon_state = "1-8"
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
-"Nq" = (
-/obj/machinery/conveyor{
- id = "NTMSLoad2";
- name = "on ramp"
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/machinery/door/poddoor{
- id = "kilocargo";
- name = "NTMS-037 Bay Blast Door"
+/obj/structure/cable/pink{
+ icon_state = "4-9"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/pink{
+ icon_state = "8-10"
},
-/obj/machinery/power/shieldwallgen/atmos/roundstart{
- dir = 8;
- id = "kiloshield"
+/mob/living/simple_animal/hostile/netherworld/migo{
+ environment_smash = 0;
+ faction = list("neutral");
+ melee_damage_lower = 5;
+ melee_damage_upper = 10;
+ name = "maurice"
},
/turf/open/floor/plating,
+/area/ship/engineering)
+"Nq" = (
+/turf/closed/wall/r_wall/yesdiag,
/area/ship/cargo)
"NB" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
+/obj/machinery/door/airlock/grunge{
+ dir = 8;
+ name = "Bathroom"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
},
-/obj/machinery/status_display{
- pixel_x = -32;
- pixel_y = -32
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/crew)
"NI" = (
-/obj/effect/decal/cleanable/blood/old,
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = 14
},
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
+/obj/structure/mirror{
+ pixel_x = 24;
+ pixel_y = 0
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+/obj/structure/toilet{
+ pixel_y = 18
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+/obj/machinery/light/small/directional/north{
+ pixel_x = 11
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
-"NT" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/machinery/light_switch{
+ pixel_x = -12;
+ pixel_y = 20
},
/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/item/storage/pill_bottle/happy{
+ pixel_x = 12;
+ pixel_y = 12
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
+/mob/living/simple_animal/hostile/cockroach,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/crew)
+"NT" = (
+/obj/effect/turf_decal/borderfloor{
+ dir = 9
},
-/turf/open/floor/mineral/titanium/blue,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/ash,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"NU" = (
-/obj/machinery/conveyor{
- id = "NTMSLoad2";
- name = "on ramp"
- },
-/obj/structure/window/reinforced{
- dir = 8
+/obj/structure/table/wood,
+/obj/structure/cable/pink{
+ icon_state = "2-5"
},
-/turf/open/floor/plating,
-/area/ship/cargo)
-"OH" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
+/obj/item/flashlight/lamp/green{
+ pixel_y = 3
+ },
+/obj/structure/sign/poster/random{
+ pixel_y = 0;
+ pixel_x = -32
+ },
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
+"Of" = (
+/turf/closed/wall/r_wall,
+/area/ship/maintenance/fore)
+"OH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 8
},
-/obj/effect/turf_decal/industrial/warning/corner{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/effect/turf_decal/industrial/warning{
+ dir = 4
},
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable/pink{
+ icon_state = "2-10"
},
-/turf/open/floor/mineral/titanium/yellow,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"Pg" = (
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/computer/helm{
+/obj/machinery/computer/helm/retro{
dir = 8
},
-/obj/machinery/light/directional/east,
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"PS" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light_switch{
- pixel_y = -23;
- dir = 1
- },
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/closet/crate/internals,
-/obj/item/tank/internals/oxygen,
-/obj/item/tank/internals/oxygen{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/breath,
-/obj/item/clothing/mask/breath{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/effect/turf_decal/industrial/warning/corner,
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/structure/table/reinforced,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel/white,
+/area/ship/crew)
"PW" = (
-/obj/machinery/porta_turret/ship/weak{
- dir = 10
- },
-/turf/closed/wall/mineral/titanium,
-/area/ship/bridge)
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/crew/dorm)
"Qw" = (
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/effect/mapping_helpers/airlock/locked,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/layer_manifold{
- dir = 4
+/obj/structure/sign/warning/docking,
+/turf/closed/wall,
+/area/ship/maintenance/fore)
+"Rq" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
+/obj/machinery/door/poddoor{
+ id = "kilowindows"
},
-/obj/machinery/door/airlock/external{
- name = "Mining Airlock";
+/turf/open/floor/plating/airless,
+/area/ship/crew/dorm)
+"RJ" = (
+/obj/structure/chair/stool{
dir = 8
},
-/obj/docking_port/mobile{
- dir = 4;
- launch_status = 0;
- name = "Mining Shuttle";
- preferred_direction = 4;
- port_direction = 2
- },
-/turf/open/floor/mineral/plastitanium,
-/area/ship/cargo)
-"Rq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
+ dir = 6
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
-"RJ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "0-2"
+/obj/machinery/button/door{
+ pixel_y = 20;
+ pixel_x = -6;
+ id = "kilowindows";
+ name = "Window Lockdown"
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 9
+/obj/machinery/button/door{
+ pixel_y = 20;
+ pixel_x = 6;
+ id = "kilobridge";
+ name = "Bridge Lockdown"
},
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/machinery/light_switch{
- pixel_x = -13;
- pixel_y = 23
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable/pink{
+ icon_state = "2-8"
},
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plasteel,
/area/ship/bridge)
"Sx" = (
-/obj/structure/closet/secure_closet/freezer{
- locked = 0;
- name = "fridge"
- },
-/obj/item/reagent_containers/food/snacks/sausage,
-/obj/item/reagent_containers/food/snacks/sandwich,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
- dir = 1
+/obj/effect/turf_decal/corner/opaque/red/diagonal,
+/obj/structure/table/reinforced,
+/obj/item/cutting_board{
+ anchored = 1
},
-/obj/item/storage/cans/sixbeer,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew/canteen/kitchen)
+/obj/item/kitchen/knife,
+/turf/open/floor/plasteel/white,
+/area/ship/crew)
"Ti" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
+ id = "kilowindows"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
+/turf/open/floor/plating/airless,
/area/ship/crew)
"Tn" = (
-/obj/machinery/power/smes/shuttle{
- dir = 4
- },
-/obj/machinery/door/window/westright{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/structure/window/reinforced/spawner/north,
-/obj/effect/turf_decal/industrial/warning{
- dir = 4
- },
-/obj/machinery/door/poddoor/shutters{
- id = "kiloengine";
- name = "Engine Shutters";
- dir = 8
+/obj/structure/bed,
+/obj/structure/cable/pink{
+ icon_state = "1-6"
},
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/obj/item/bedsheet/dorms,
+/obj/machinery/light/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
"To" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/reagent_containers/glass/bucket,
-/obj/item/mop,
-/obj/item/storage/bag/trash{
- pixel_x = 6
+/obj/machinery/door/poddoor{
+ id = "kilocargo"
},
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/structure/cable,
-/obj/effect/turf_decal/industrial/warning{
- dir = 2
+/obj/structure/cable/pink{
+ icon_state = "0-6"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
+/obj/machinery/power/shieldwallgen/atmos/roundstart{
+ id = "kilofield";
+ dir = 4
},
-/obj/machinery/power/apc/auto_name/directional/south,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/open/floor/plasteel/patterned/ridged,
+/area/ship/cargo)
"TD" = (
-/obj/structure/table,
-/obj/machinery/button/door{
- id = "whiteship_bridge";
- name = "Bridge Blast Door Control";
- pixel_x = -6;
- pixel_y = -2;
- dir = 1
+/obj/machinery/light/directional/south,
+/obj/structure/table/reinforced,
+/obj/item/megaphone/cargo{
+ pixel_y = 5;
+ pixel_x = 4
},
-/obj/machinery/button/door{
- id = "whiteship_windows";
- name = "Windows Blast Door Control";
- pixel_x = -6;
- pixel_y = 8;
- dir = 1
+/obj/item/cigbutt{
+ pixel_y = 5;
+ pixel_x = -17
},
-/obj/item/radio{
- pixel_x = 6;
- pixel_y = 4
- },
-/turf/open/floor/mineral/plastitanium,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"TG" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2,
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
- },
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/closed/wall,
+/area/ship/hallway/port)
"Ua" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
+ id = "kilowindows"
},
-/obj/machinery/door/firedoor/border_only,
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/open/floor/plating/airless,
+/area/ship/engineering)
"Ud" = (
-/obj/effect/turf_decal/box/corners,
-/obj/effect/turf_decal/box/corners{
- dir = 8
- },
-/obj/item/wrench,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 6
- },
-/turf/open/floor/plating,
+/turf/closed/wall,
/area/ship/cargo)
"Un" = (
-/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/obj/structure/window/reinforced/fulltile,
/obj/machinery/door/poddoor{
- id = "whiteship_windows";
- name = "Exterior Window Blast Door"
+ id = "kilowindows"
},
-/obj/machinery/door/firedoor/border_only{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/turf/open/floor/plating/airless,
+/area/ship/hallway/port)
"Uv" = (
-/obj/structure/frame/computer{
- anchored = 1;
- dir = 1
- },
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/shard,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/bridge)
-"UY" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/docking_port/stationary{
+ width = 30;
+ height = 15;
+ dwidth = 15;
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 5
- },
-/turf/open/floor/wood,
+/turf/template_noop,
+/area/template_noop)
+"UY" = (
+/obj/structure/chair/sofa/brown/old/right/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/yew,
/area/ship/crew)
"Va" = (
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/structure/closet/crate/secure/weapon,
+/obj/structure/cable/pink{
+ icon_state = "6-10"
},
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/mineral/titanium/yellow,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 2
+ },
+/obj/structure/cable/pink{
+ icon_state = "9-10"
+ },
+/obj/effect/decal/cleanable/oil,
+/obj/item/ammo_box/a12g,
+/obj/item/gun/ballistic/shotgun/doublebarrel/no_mag,
+/turf/open/floor/plasteel/patterned/grid,
/area/ship/cargo)
"Vd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/obj/machinery/suit_storage_unit/independent/engineering,
+/obj/structure/cable/pink{
+ icon_state = "8-10"
+ },
+/obj/structure/cable/pink{
+ icon_state = "5-10"
+ },
+/obj/machinery/atmospherics/components/binary/pump/layer2{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/effect/turf_decal/industrial/warning{
- dir = 6
+ dir = 4
+ },
+/obj/machinery/light/small/directional/east{
+ pixel_y = 8
+ },
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -2
},
+/obj/effect/decal/cleanable/oil,
/turf/open/floor/plating,
-/area/ship/engineering/engine)
+/area/ship/engineering)
"Vh" = (
-/obj/structure/frame/computer{
- anchored = 1;
- dir = 1
+/obj/effect/turf_decal/industrial/warning{
+ dir = 8
},
-/obj/machinery/light/directional/south,
-/obj/machinery/computer/security/telescreen{
- dir = 1;
- name = "NTMS-037 Monitor";
- network = list("ntms");
- pixel_y = -30
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 8;
+ piping_layer = 2
},
-/obj/effect/turf_decal/industrial/outline/yellow,
-/obj/item/stack/cable_coil/cut,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/bridge)
+/turf/open/floor/plating,
+/area/ship/engineering)
"Vq" = (
-/obj/machinery/porta_turret/ship/weak{
- dir = 10
+/turf/closed/wall/r_wall/yesdiag,
+/area/ship/crew)
+"Vt" = (
+/obj/effect/turf_decal/miskilamo_small{
+ dir = 1
},
-/turf/closed/wall/mineral/titanium,
-/area/ship/crew/canteen/kitchen)
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/external/dark)
"Vx" = (
-/obj/effect/turf_decal/industrial/warning,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/toilet{
- dir = 4;
- pixel_x = -7
- },
-/obj/structure/sink{
- dir = 8;
- pixel_x = 14
- },
-/obj/machinery/shower{
- pixel_x = -11;
- pixel_y = 18
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
+ dir = 8
},
-/obj/machinery/firealarm/directional/west,
-/obj/machinery/newscaster/directional/north,
-/obj/machinery/light/small/broken/directional/east,
-/turf/open/floor/carpet/blue,
-/area/ship/crew)
+/obj/effect/decal/cleanable/dirt,
+/obj/item/cigbutt,
+/turf/open/floor/carpet,
+/area/ship/crew/dorm)
"VQ" = (
-/obj/machinery/conveyor{
- dir = 1;
- id = "NTMSLoad";
- name = "off ramp"
- },
-/obj/structure/window/reinforced{
- dir = 4
+/obj/effect/turf_decal/miskilamo_small/left{
+ dir = 1
},
-/turf/open/floor/plating,
-/area/ship/cargo)
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/external/dark)
"We" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/obj/structure/rack,
-/obj/item/storage/belt/utility,
-/obj/item/radio{
- pixel_x = -3;
- pixel_y = 3
+/obj/machinery/suit_storage_unit/inherit,
+/obj/effect/turf_decal/borderfloor{
+ dir = 1
},
-/obj/item/radio,
-/obj/effect/turf_decal/industrial/hatch/yellow,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable/pink,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/turf_decal/box/corners,
+/obj/item/reagent_containers/food/drinks/bottle/absinthe,
+/obj/item/clothing/suit/space/hardsuit/mining/independent,
+/obj/item/clothing/mask/breath,
+/obj/structure/cable/pink{
+ icon_state = "1-5"
+ },
+/turf/open/floor/plasteel/tech/grid,
/area/ship/cargo)
"Xd" = (
-/obj/structure/chair/comfy/shuttle,
-/obj/effect/decal/cleanable/blood/old,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "1-4"
+/obj/structure/table/reinforced,
+/obj/item/paper_bin{
+ pixel_y = 4;
+ pixel_x = -7
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 6
+/obj/item/pen/fourcolor,
+/obj/machinery/airalarm/directional/south,
+/obj/item/radio/intercom/wideband/directional/west,
+/obj/item/reagent_containers/food/drinks/coffee{
+ pixel_y = 7;
+ pixel_x = 10
},
-/turf/open/floor/mineral/titanium/blue,
+/turf/open/floor/plasteel/tech/grid,
/area/ship/bridge)
"XQ" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/storage/toolbox/mechanical{
- pixel_y = 6
- },
-/obj/item/spacecash/bundle/c200,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/bridge)
-"XR" = (
-/obj/structure/closet/secure_closet/personal,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
- dir = 1
+/obj/machinery/cryopod{
+ dir = 8
},
-/obj/effect/decal/cleanable/greenglow,
-/obj/item/stock_parts/cell/gun/mini,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/under/utility/skirt,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/toggle/hazard,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
-/obj/item/clothing/suit/hazardvest,
/obj/effect/turf_decal/industrial/warning{
- dir = 1
+ dir = 8
},
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/mineral/plastitanium,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plasteel/tech/grid,
+/area/ship/hallway/central)
+"XR" = (
+/turf/closed/wall,
/area/ship/crew)
"Yu" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/greenglow,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 5
- },
-/turf/open/floor/plating,
-/area/ship/cargo)
+/obj/structure/grille,
+/obj/structure/window/fulltile,
+/obj/structure/curtain/cloth/grey,
+/turf/open/floor/plating/airless,
+/area/ship/crew)
"YJ" = (
-/obj/machinery/washing_machine,
-/obj/effect/turf_decal/trimline/opaque/white/filled/line{
- dir = 1
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+/obj/structure/dresser{
dir = 1
},
-/obj/effect/turf_decal/industrial/warning{
- dir = 1
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_y = 12;
+ pixel_x = -9
},
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/mineral/plastitanium,
-/area/ship/crew)
+/turf/open/floor/wood/yew,
+/area/ship/crew/dorm)
"YL" = (
-/obj/effect/decal/cleanable/greenglow,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{
- dir = 1
- },
+/obj/structure/chair/sofa/brown/old/directional/east,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
+ dir = 5
},
-/turf/open/floor/plasteel/showroomfloor,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/wood/yew,
/area/ship/crew)
"ZC" = (
-/obj/structure/closet/crate/bin,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/trash/syndi_cakes,
-/obj/item/organ/stomach,
-/obj/machinery/light_switch{
- dir = 1;
- pixel_y = 23
- },
-/obj/effect/turf_decal/corner/opaque/red,
-/obj/effect/turf_decal/corner/opaque/red{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
},
-/obj/effect/turf_decal/industrial/warning/corner{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
-/turf/open/floor/plasteel/white,
-/area/ship/crew/canteen/kitchen)
+/obj/effect/turf_decal/siding/wood{
+ dir = 5;
+ color = "#E3994E"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/wood/yew,
+/area/ship/crew)
"ZG" = (
-/obj/structure/falsewall/titanium,
+/obj/structure/cable/pink{
+ icon_state = "4-9"
+ },
+/obj/effect/decal/cleanable/dirt,
+/mob/living/simple_animal/hostile/cockroach,
/turf/open/floor/plating,
-/area/ship/crew)
+/area/ship/engineering)
(1,1,1) = {"
aa
aa
-aa
AQ
ak
+AQ
bn
bn
-kA
-bn
bn
+AQ
ak
AQ
aa
@@ -2405,14 +2101,13 @@ aa
(2,1,1) = {"
aa
aa
-aa
kA
ar
-cW
+kA
+MI
+MI
MI
kA
-Tn
-fu
ar
kA
aa
@@ -2421,8 +2116,7 @@ aa
(3,1,1) = {"
aa
aa
-aa
-Jf
+kA
av
bQ
AV
@@ -2430,15 +2124,14 @@ cY
ng
gC
oj
-Un
+Ua
aa
aa
"}
(4,1,1) = {"
aa
aa
-aa
-Jf
+kA
eo
fv
LC
@@ -2446,115 +2139,108 @@ Ng
cM
hh
oP
-Un
+Ua
aa
aa
"}
(5,1,1) = {"
aa
aa
-aa
-Jf
-Jf
+kA
+AQ
gs
aU
Vd
-mz
+fs
ZG
-mz
-mz
+AP
+kA
aa
aa
"}
(6,1,1) = {"
aa
aa
-aa
-Jf
+Ua
cb
yd
cr
-mz
-mz
+AQ
+Vh
cZ
Bm
-Ti
+kA
aa
aa
"}
(7,1,1) = {"
aa
aa
-aa
Ua
aS
ca
cq
-mz
-KR
-da
-UY
-Ti
+cq
+cq
+cq
+cq
+wh
aa
aa
"}
(8,1,1) = {"
aa
aa
-aa
-Ua
+Jf
TG
cC
-To
-mz
-mz
+cq
mz
+NU
+Tn
AE
-mz
+wh
PW
aa
"}
(9,1,1) = {"
aa
aa
-aa
Jf
jU
bU
ck
-mz
+sG
Vx
ig
xF
YJ
-Ti
+Rq
aa
"}
(10,1,1) = {"
aa
-aa
-aa
-Jf
+cK
+Un
aJ
bV
-Jf
-mz
-mz
-mz
-sG
XR
-mz
+XR
+zH
+XR
+XR
+XR
+yF
aa
"}
(11,1,1) = {"
aa
-aa
dF
cP
KM
bg
+XR
yn
-mz
EG
hS
YL
@@ -2564,103 +2250,96 @@ aa
"}
(12,1,1) = {"
aa
-ac
-ac
-ac
+Vt
+Un
iM
rc
Yu
-mz
-mz
-mz
+Sx
+iT
+cw
wc
-mz
-mz
+UY
+Ti
aa
"}
(13,1,1) = {"
aa
-qv
VQ
-nO
+Jf
aC
bM
-cK
+XR
PS
-bA
+cW
ZC
HP
aZ
-bA
+yF
Vq
"}
(14,1,1) = {"
-vU
-rq
-iT
-de
-bL
+aa
+fu
+ac
+Ud
bX
Ud
-nJ
-cV
+XR
+XR
rO
-wh
+XR
NB
-Sx
+XR
yF
"}
(15,1,1) = {"
-aa
Nq
-NU
+ac
am
eN
bY
cB
-Co
+im
dt
sD
xk
NI
zc
-bA
+yF
"}
(16,1,1) = {"
-aa
-ac
-ac
-ac
-ac
+To
+nJ
+da
+AB
bZ
Kz
im
bA
Ew
-zH
-Rq
-dc
-yF
+xk
+xk
+xk
+nO
"}
(17,1,1) = {"
-aa
-aa
-ac
+Co
+cV
Ih
-ac
+Da
bG
-ac
-ac
-bA
-bA
-bA
+vU
+KR
+bL
+rq
+de
EU
-bA
-bA
+dc
+vv
"}
(18,1,1) = {"
-aa
-aa
+cf
La
hR
Va
@@ -2669,15 +2348,14 @@ cj
bF
bF
io
-AP
+bF
GK
XQ
vv
"}
(19,1,1) = {"
-aa
-aa
-La
+Nq
+ac
Mj
ay
bT
@@ -2685,14 +2363,13 @@ ci
bF
GM
jK
-fs
-Da
-Vh
bF
+bF
+bF
+bP
"}
(20,1,1) = {"
aa
-aa
ac
jx
pV
@@ -2703,66 +2380,77 @@ RJ
nd
bH
Xd
-Uv
bF
+bP
"}
(21,1,1) = {"
aa
-aa
ac
hN
jl
OH
mr
-cw
+bF
gp
NT
BP
TD
-BS
+bP
Bu
"}
(22,1,1) = {"
aa
-aa
-ac
-ac
-AB
+Of
+Of
+Of
xe
-cf
-bF
+Of
+bP
Ds
sW
Pg
BS
-Bu
+BS
aa
"}
(23,1,1) = {"
aa
-aa
-ac
+KB
bm
KB
kb
cJ
-bF
bP
-bF
-bF
-Bu
+bP
+BS
+BS
+BS
aa
aa
"}
(24,1,1) = {"
aa
-aa
rW
-ac
+KB
Qw
qw
-ac
-rW
+qv
+Jt
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(25,1,1) = {"
+aa
+aa
+aa
+aa
+Uv
+aa
+aa
aa
aa
aa
diff --git a/_maps/shuttles/independent/independent_lagoon.dmm b/_maps/shuttles/independent/independent_lagoon.dmm
index 14823f92db63..248ee9240efd 100644
--- a/_maps/shuttles/independent/independent_lagoon.dmm
+++ b/_maps/shuttles/independent/independent_lagoon.dmm
@@ -256,7 +256,7 @@
/turf/open/floor/plasteel,
/area/ship/external)
"bt" = (
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/computer/cargo/retro{
dir = 4
},
/turf/open/floor/plasteel/patterned/cargo_one,
@@ -2069,7 +2069,7 @@
pixel_y = 1
},
/obj/item/toy/cards/deck,
-/obj/item/reagent_containers/food/snacks/butterbiscuit{
+/obj/item/food/butterbiscuit{
pixel_x = 6;
pixel_y = 6
},
diff --git a/_maps/shuttles/independent/independent_mudskipper.dmm b/_maps/shuttles/independent/independent_mudskipper.dmm
index f82cdc7ba748..d7a3341b8927 100644
--- a/_maps/shuttles/independent/independent_mudskipper.dmm
+++ b/_maps/shuttles/independent/independent_mudskipper.dmm
@@ -913,7 +913,7 @@
/obj/structure/sign/warning/incident{
pixel_x = -32
},
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/computer/cargo/retro{
dir = 4
},
/turf/open/floor/plasteel/tech/grid,
diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm
index daf3cf9ecdb3..632337fab263 100644
--- a/_maps/shuttles/independent/independent_rigger.dmm
+++ b/_maps/shuttles/independent/independent_rigger.dmm
@@ -845,7 +845,7 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
/obj/machinery/door/airlock/mining/glass{
- name = "Mech Bay"
+ name = "Exosuit Bay"
},
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
@@ -869,7 +869,7 @@
"kG" = (
/obj/machinery/door/poddoor{
id = "riggs_cargo";
- name = "Mech Bay Blast Door"
+ name = "Exosuit Bay Blast Door"
},
/turf/open/floor/engine/hull/interior,
/area/ship/cargo)
@@ -1488,7 +1488,7 @@
"sT" = (
/obj/machinery/door/poddoor{
id = "riggs_cargo";
- name = "Mech Bay Blast Door"
+ name = "Exosuit Bay Blast Door"
},
/obj/structure/cable{
icon_state = "0-2"
@@ -2231,7 +2231,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 4
},
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/obj/item/radio/intercom/directional/north,
/turf/open/floor/carpet/blue,
/area/ship/bridge)
@@ -3309,7 +3309,7 @@
"Oy" = (
/obj/machinery/door/poddoor{
id = "riggs_cargo";
- name = "Mech Bay Blast Door"
+ name = "Exosuit Bay Blast Door"
},
/obj/structure/cable{
icon_state = "0-2"
diff --git a/_maps/shuttles/independent/independent_schmiedeberg.dmm b/_maps/shuttles/independent/independent_schmiedeberg.dmm
index 454e7503cb52..ce7b407a4731 100644
--- a/_maps/shuttles/independent/independent_schmiedeberg.dmm
+++ b/_maps/shuttles/independent/independent_schmiedeberg.dmm
@@ -756,7 +756,7 @@
/turf/open/floor/wood/walnut,
/area/ship/crew/canteen)
"ka" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/item/radio/intercom/directional/south,
diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm
index e269c70cfefa..459bfebcd48f 100644
--- a/_maps/shuttles/independent/independent_shetland.dmm
+++ b/_maps/shuttles/independent/independent_shetland.dmm
@@ -377,6 +377,9 @@
},
/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer5,
/obj/item/radio/intercom/directional/east,
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"dl" = (
@@ -930,9 +933,6 @@
/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer5{
dir = 5
},
-/obj/structure/cable/yellow{
- icon_state = "4-10"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
@@ -945,6 +945,12 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible{
dir = 10
},
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"ib" = (
@@ -1336,6 +1342,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 9
},
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/open/floor/plating,
/area/ship/engineering/engine)
"lu" = (
@@ -2144,6 +2153,9 @@
/obj/structure/cable{
icon_state = "1-6"
},
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"sb" = (
@@ -2686,9 +2698,6 @@
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"wW" = (
-/obj/structure/cable/yellow{
- icon_state = "1-6"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 6
},
@@ -2698,6 +2707,12 @@
/obj/machinery/atmospherics/pipe/simple/dark/visible{
dir = 4
},
+/obj/structure/cable/yellow{
+ icon_state = "1-5"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
/turf/open/floor/plating,
/area/ship/engineering/engine)
"xd" = (
@@ -3115,12 +3130,6 @@
/obj/effect/turf_decal/number/zero{
dir = 8
},
-/obj/structure/cable/yellow{
- icon_state = "5-9"
- },
-/obj/structure/cable/yellow{
- icon_state = "5-10"
- },
/obj/machinery/atmospherics/pipe/layer_manifold/visible{
dir = 4
},
@@ -5464,7 +5473,7 @@
/obj/effect/turf_decal/corner/opaque/neutral/three_quarters{
dir = 1
},
-/obj/machinery/computer/cargo/express/retro,
+/obj/machinery/computer/cargo/retro,
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"VD" = (
@@ -5524,12 +5533,12 @@
/turf/open/floor/plasteel,
/area/ship/hallway/fore)
"VV" = (
-/obj/structure/cable/yellow{
- icon_state = "2-5"
- },
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
},
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"VZ" = (
@@ -5766,6 +5775,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/structure/cable/yellow{
+ icon_state = "4-10"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/engineering/engine)
"XY" = (
diff --git a/_maps/shuttles/independent/independent_sunskipper.dmm b/_maps/shuttles/independent/independent_sunskipper.dmm
index 113230223069..de92179a11f7 100644
--- a/_maps/shuttles/independent/independent_sunskipper.dmm
+++ b/_maps/shuttles/independent/independent_sunskipper.dmm
@@ -2050,7 +2050,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
"AP" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
icon_state = "computer-right";
dir = 8
},
diff --git a/_maps/shuttles/independent/independent_tranquility.dmm b/_maps/shuttles/independent/independent_tranquility.dmm
index 08738bbe821f..641a74a202ef 100644
--- a/_maps/shuttles/independent/independent_tranquility.dmm
+++ b/_maps/shuttles/independent/independent_tranquility.dmm
@@ -2735,7 +2735,7 @@
/area/ship/crew/crewtwo)
"wA" = (
/obj/structure/table,
-/obj/item/reagent_containers/food/snacks/cakeslice/lime,
+/obj/item/food/cakeslice/lime,
/obj/item/kitchen/fork/plastic{
pixel_x = -11
},
@@ -3515,7 +3515,7 @@
/area/ship/crew/hydroponics)
"CH" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/snacks/garlicbread,
+/obj/item/food/garlicbread,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange{
pixel_x = -8;
pixel_y = 7
@@ -6032,11 +6032,11 @@
pixel_x = -11;
pixel_y = 11
},
-/obj/item/reagent_containers/food/snacks/store/bread/banana{
+/obj/item/food/bread/banana{
pixel_x = 14;
pixel_y = 1
},
-/obj/item/reagent_containers/food/snacks/breadslice/banana,
+/obj/item/food/breadslice/banana,
/turf/open/floor/plasteel,
/area/ship/crew/cryo)
"Vg" = (
diff --git a/_maps/shuttles/inteq/inteq_colossus.dmm b/_maps/shuttles/inteq/inteq_colossus.dmm
index 870a12949973..920d16cfc1c7 100644
--- a/_maps/shuttles/inteq/inteq_colossus.dmm
+++ b/_maps/shuttles/inteq/inteq_colossus.dmm
@@ -852,7 +852,7 @@
/area/ship/hallway/fore)
"iX" = (
/obj/item/radio/intercom/wideband/directional/south,
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/effect/turf_decal/borderfloor,
@@ -3423,13 +3423,13 @@
/obj/effect/turf_decal/trimline/opaque/yellow/line{
dir = 8
},
-/obj/item/ammo_box/magazine/gal{
+/obj/item/ammo_box/magazine/f4_308{
pixel_x = -5
},
-/obj/item/ammo_box/magazine/gal{
+/obj/item/ammo_box/magazine/f4_308{
pixel_x = 5
},
-/obj/item/gun/ballistic/automatic/marksman/gal/inteq{
+/obj/item/gun/ballistic/automatic/marksman/f4/inteq{
pixel_x = -8;
pixel_y = 3
},
diff --git a/_maps/shuttles/inteq/inteq_hound.dmm b/_maps/shuttles/inteq/inteq_hound.dmm
index 5616d1d2d4b0..da82ccbf26b7 100644
--- a/_maps/shuttles/inteq/inteq_hound.dmm
+++ b/_maps/shuttles/inteq/inteq_hound.dmm
@@ -1580,7 +1580,7 @@
dir = 1
},
/obj/effect/turf_decal/steeldecal/steel_decals_central4,
-/obj/machinery/computer/cargo/express,
+/obj/machinery/computer/cargo,
/obj/item/radio/intercom/wideband/directional/north{
pixel_y = 25;
pixel_x = 6
diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm
index 7a4a3bec6618..ddad109a06fb 100644
--- a/_maps/shuttles/inteq/inteq_talos.dmm
+++ b/_maps/shuttles/inteq/inteq_talos.dmm
@@ -874,7 +874,6 @@
icon_state = "0-2"
},
/obj/effect/decal/cleanable/dirt,
-/obj/structure/extinguisher_cabinet/directional/north,
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
@@ -2329,7 +2328,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/security/armory)
"os" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/effect/turf_decal/corner/opaque/brown{
@@ -4630,11 +4629,13 @@
},
/obj/structure/crate_shelf,
/obj/structure/closet/crate/medical,
-/obj/item/storage/firstaid/regular{
- pixel_x = 5
+/obj/item/storage/firstaid/brute{
+ pixel_x = -8;
+ pixel_y = 0
},
-/obj/item/storage/firstaid/medical{
- pixel_x = -5
+/obj/item/storage/firstaid/fire{
+ pixel_x = 9;
+ pixel_y = 0
},
/obj/item/storage/box/bodybags,
/turf/open/floor/plasteel/patterned/cargo_one,
diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm
index 1d0c4910e49e..0b41578dd31b 100644
--- a/_maps/shuttles/inteq/inteq_valor.dmm
+++ b/_maps/shuttles/inteq/inteq_valor.dmm
@@ -3855,7 +3855,7 @@
/turf/open/floor/plasteel/patterned,
/area/ship/cargo)
"Ko" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/effect/turf_decal/corner/opaque/brown{
diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm
index 23a80717b42f..9e8f7d6c81f5 100644
--- a/_maps/shuttles/inteq/inteq_vaquero.dmm
+++ b/_maps/shuttles/inteq/inteq_vaquero.dmm
@@ -2897,7 +2897,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/cargo)
"TK" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/effect/turf_decal/corner/opaque/yellow,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm
index b723b020aa36..e5890b401cfa 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm
@@ -2530,7 +2530,7 @@
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"Lv" = (
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/computer/cargo/retro{
dir = 8
},
/obj/effect/turf_decal/corner/opaque/nsorange,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
index b05fd520c158..351f188e3369 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_gecko.dmm
@@ -4283,7 +4283,7 @@
/turf/open/floor/plasteel/grimy,
/area/ship/crew)
"RK" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 4
},
/obj/item/radio/intercom/directional/west,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
index b92747f3a3e2..e72766239a4f 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm
@@ -2003,7 +2003,7 @@
dir = 1
},
/obj/machinery/door/airlock/research{
- name = "Mech Bay"
+ name = "Exosuit Bay"
},
/turf/open/floor/plasteel/patterned/grid,
/area/ship/science/robotics)
@@ -3481,7 +3481,7 @@
dir = 1
},
/obj/machinery/door/airlock/research{
- name = "Mech Bay"
+ name = "Exosuit Bay"
},
/turf/open/floor/plasteel/patterned/grid,
/area/ship/science/robotics)
@@ -4557,7 +4557,7 @@
},
/obj/machinery/door/poddoor{
id = "heron_mechbayshut";
- name = "Mechbay Shutters"
+ name = "Exosuit Bay Shutters"
},
/turf/open/floor/plasteel/patterned/ridged,
/area/ship/science/robotics)
@@ -7282,7 +7282,7 @@
"AC" = (
/obj/machinery/door/poddoor{
id = "heron_mechbayshut";
- name = "Mechbay Shutters"
+ name = "Exosuit Bay Shutters"
},
/turf/open/floor/plasteel/patterned/ridged,
/area/ship/science/robotics)
@@ -10099,7 +10099,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
"LS" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/structure/railing{
@@ -11850,7 +11850,7 @@
},
/obj/machinery/door/poddoor{
id = "heron_mechbayshut";
- name = "Mechbay Shutters"
+ name = "Exosuit Bay Shutters"
},
/turf/open/floor/plasteel/patterned/ridged,
/area/ship/science/robotics)
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm
index 9abfe4c6c6cb..663a567b8bbc 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_meta.dmm
@@ -1107,7 +1107,7 @@
/turf/open/floor/plasteel/dark,
/area/ship/cargo)
"dg" = (
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/computer/cargo/retro{
dir = 8
},
/obj/effect/turf_decal/corner/opaque/blue/three_quarters{
@@ -2647,7 +2647,7 @@
/area/ship/cargo)
"Du" = (
/obj/effect/turf_decal/corner/transparent/neutral/full,
-/obj/machinery/computer/cargo/express/retro{
+/obj/machinery/computer/cargo/retro{
dir = 8
},
/obj/effect/decal/cleanable/dirt/dust,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
index f5ffea852281..928fc6bd90ee 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm
@@ -4024,7 +4024,7 @@
/turf/open/floor/plasteel,
/area/ship/security/prison)
"xT" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/turf/open/floor/plasteel/telecomms_floor,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
index 774f1d57cc40..0c860abb9e20 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_osprey.dmm
@@ -95,7 +95,7 @@
/obj/structure/disposalpipe/segment{
dir = 8
},
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/effect/turf_decal/corner/opaque/brown{
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
index a106a307bb18..342ffb8fa928 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm
@@ -464,7 +464,7 @@
/turf/open/floor/plasteel/white,
/area/ship/hallway/port)
"eE" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/turf/open/floor/plasteel/tech,
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
index f910af5043c8..802756c19d04 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_skipper.dmm
@@ -440,6 +440,7 @@
/area/ship/hallway/central)
"dO" = (
/obj/machinery/atmospherics/components/trinary/mixer/flipped/layer4,
+/obj/item/paper/guides/jobs/engi/combustion_thruster,
/turf/open/floor/plasteel/tech,
/area/ship/engineering/atmospherics)
"dS" = (
@@ -3365,9 +3366,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/item/paper/crumpled{
- default_raw_text = "66% Oxy (Node 1) to 34% Plasma (Node 2) works great at 500 kPa."
- },
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
name = "engine fuel pump"
@@ -4235,7 +4233,7 @@
"JA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4,
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/turf/open/floor/plasteel/dark,
diff --git a/_maps/shuttles/pgf/pgf_crying_sun.dmm b/_maps/shuttles/pgf/pgf_crying_sun.dmm
index 919770509bec..c0584df1e945 100644
--- a/_maps/shuttles/pgf/pgf_crying_sun.dmm
+++ b/_maps/shuttles/pgf/pgf_crying_sun.dmm
@@ -1,4 +1,18 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ae" = (
+/obj/structure/cable/blue{
+ icon_state = "0-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "lib_engine_blast"
+ },
+/obj/machinery/power/shuttle/engine/fire{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ship/engineering/engines/port)
"ai" = (
/obj/structure/railing,
/obj/structure/cable/yellow{
@@ -129,6 +143,13 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/plasteel/white,
/area/ship/hallway/port)
+"bi" = (
+/obj/machinery/computer/crew{
+ dir = 8
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/bridge)
"bl" = (
/obj/effect/turf_decal/industrial/traffic,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -215,10 +236,6 @@
/obj/item/storage/box/flashes{
pixel_y = -1
},
-/obj/item/screwdriver{
- pixel_x = -8;
- pixel_y = -5
- },
/obj/item/screwdriver{
pixel_x = -5;
pixel_y = -5
@@ -235,10 +252,6 @@
pixel_x = 4;
pixel_y = -5
},
-/obj/item/screwdriver{
- pixel_x = 7;
- pixel_y = -5
- },
/obj/structure/closet/secure_closet/wall/directional/west{
icon_state = "sec_wall";
name = "equipment locker"
@@ -406,9 +419,6 @@
dir = 6
},
/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -416,13 +426,28 @@
/area/ship/engineering/engines/starboard)
"du" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 6
+ dir = 6;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-8"
},
/turf/open/floor/engine/hull,
/area/ship/external/dark)
+"dv" = (
+/obj/structure/cable/blue{
+ icon_state = "0-4"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "lib_engine_blast"
+ },
+/obj/machinery/power/shuttle/engine/fire{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ship/engineering/engines/starboard)
"dz" = (
/obj/effect/turf_decal/corner_steel_grid{
dir = 10
@@ -464,10 +489,10 @@
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/hallway/port)
"dK" = (
-/obj/machinery/computer/cargo/express{
- dir = 8
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
},
-/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/effect/turf_decal/floordetail/tiled,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -523,9 +548,6 @@
dir = 8;
name = "engine fuel pump"
},
-/obj/structure/cable{
- icon_state = "2-4"
- },
/obj/machinery/camera/autoname{
dir = 2;
network = list("GEC")
@@ -1010,12 +1032,27 @@
/obj/machinery/light/directional/north,
/turf/open/floor/plating,
/area/ship/engineering)
+"hX" = (
+/obj/structure/window/reinforced/fulltile/shuttle,
+/obj/structure/grille,
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/obj/machinery/door/poddoor/shutters{
+ id = "lib_bridge_shut"
+ },
+/turf/open/floor/plating,
+/area/ship/bridge)
"if" = (
/obj/structure/cable{
icon_state = "0-8"
},
/obj/machinery/porta_turret/ship/weak{
- dir = 4
+ dir = 4;
+ mode = 1
},
/obj/structure/catwalk/over/plated_catwalk/dark,
/turf/open/floor/plating/airless,
@@ -1166,12 +1203,12 @@
/area/ship/hangar/starboard)
"jm" = (
/obj/machinery/holopad/emergency,
-/obj/effect/turf_decal/spline/fancy/opaque/lime{
- dir = 1
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/turf_decal/spline/fancy/opaque/lime{
+ dir = 1
+ },
/turf/open/floor/plasteel/dark,
/area/ship/bridge)
"jt" = (
@@ -1253,7 +1290,7 @@
},
/obj/machinery/button/door{
id = "lib_armory_1";
- name = "Sergeant Access";
+ name = "Lieutenant Access";
dir = 4;
pixel_x = -20;
pixel_y = -5;
@@ -1421,7 +1458,7 @@
/obj/structure/table/reinforced,
/obj/effect/turf_decal/corner/opaque/lime/mono,
/obj/machinery/camera/autoname{
- dir = 1
+ dir = 10
},
/obj/machinery/light/directional/south,
/turf/open/floor/plasteel/mono/dark,
@@ -1457,14 +1494,13 @@
pixel_x = 4;
pixel_y = 4
},
+/obj/machinery/light/directional/north,
/obj/item/reagent_containers/food/drinks/bottle/whiskey{
pixel_x = -10;
pixel_y = 3;
- name = "'Anastheasia'";
+ name = "'Anesthesia'";
desc = "A bottle of Git's with the word 'Anastheasia' written over it in marker."
},
-/obj/machinery/light/directional/north,
-/obj/item/clothing/neck/stethoscope,
/turf/open/floor/mineral/titanium,
/area/ship/medical)
"mL" = (
@@ -1473,7 +1509,7 @@
},
/obj/structure/closet/crate{
icon_state = "wooden";
- name = "myning geer";
+ name = "mining gear";
desc = "A rectangular steel crate with 'myning geer' spelled out in crayon on top."
},
/obj/item/storage/bag/ore{
@@ -1608,9 +1644,12 @@
/turf/open/floor/plasteel/white,
/area/ship/hallway/port)
"no" = (
-/obj/structure/bed,
-/obj/item/bedsheet/cosmos,
/obj/structure/curtain/cloth/grey,
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
/turf/open/floor/plasteel/dark,
/area/ship/crew/dorm)
"nv" = (
@@ -1665,6 +1704,26 @@
},
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/crew/cryo)
+"om" = (
+/obj/effect/turf_decal/corner/opaque/lime/mono,
+/obj/structure/table/reinforced,
+/obj/item/clipboard{
+ pixel_x = -9;
+ pixel_y = -1
+ },
+/obj/item/pen{
+ pixel_x = -10;
+ pixel_y = 1
+ },
+/obj/item/gps{
+ pixel_x = 8;
+ pixel_y = -2
+ },
+/obj/item/binoculars{
+ pixel_y = 9
+ },
+/turf/open/floor/plasteel/mono/dark,
+/area/ship/bridge)
"ou" = (
/obj/structure/railing{
dir = 8
@@ -1784,22 +1843,22 @@
/obj/structure/railing{
dir = 4
},
-/obj/structure/table,
/obj/item/toy/plush/knight{
- pixel_y = 10;
+ pixel_y = 11;
pixel_x = -10
},
/obj/item/toy/plush/hornet{
- pixel_y = 8;
- pixel_x = -3
+ pixel_y = 10;
+ pixel_x = -2
},
/obj/item/toy/plush/mora{
- pixel_y = 4;
- pixel_x = 5
+ pixel_y = 6;
+ pixel_x = 6
},
/obj/effect/turf_decal/corner_steel_grid{
dir = 10
},
+/obj/structure/dresser,
/turf/open/floor/plasteel/dark,
/area/ship/crew/dorm)
"oX" = (
@@ -1848,6 +1907,22 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
/turf/open/floor/plasteel/mono/dark,
/area/ship/hallway/central)
+"pK" = (
+/obj/structure/cable/blue{
+ icon_state = "0-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/structure/window/plasma/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ship/engineering/engines/starboard)
"pW" = (
/obj/machinery/computer/helm/viewscreen/directional/west,
/obj/effect/turf_decal/siding/wood{
@@ -1883,15 +1958,8 @@
/turf/open/floor/plasteel/sepia,
/area/ship/crew/dorm/dormthree)
"qj" = (
-/obj/structure/table/reinforced,
-/obj/item/desk_flag/gezena{
- pixel_x = 9;
- pixel_y = 1
- },
-/obj/machinery/recharger{
- pixel_y = 1;
- pixel_x = -6
- },
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/floordetail/tiled,
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"qm" = (
@@ -1904,7 +1972,6 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
"qp" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable{
icon_state = "1-10"
},
@@ -1915,6 +1982,9 @@
dir = 1
},
/obj/item/paper/guides/jobs/engi/combustion_thruster,
+/obj/machinery/atmospherics/pipe/manifold/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/tech,
/area/ship/engineering/engines/starboard)
"qy" = (
@@ -2104,11 +2174,6 @@
/turf/closed/wall/mineral/plastitanium,
/area/ship/engineering/engines/starboard)
"sF" = (
-/obj/machinery/door/airlock/security/glass{
- req_one_access_txt = "1";
- req_access = list(1);
- name = "Checkpoint"
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -2117,6 +2182,10 @@
dir = 1
},
/obj/machinery/door/firedoor/border_only,
+/obj/machinery/door/airlock/security/glass{
+ req_one_access_txt = "1";
+ name = "Checkpoint"
+ },
/turf/open/floor/plasteel/dark,
/area/ship/hallway/port)
"sJ" = (
@@ -2241,7 +2310,6 @@
pixel_y = 3
},
/obj/effect/turf_decal/corner/opaque/lime/mono,
-/obj/machinery/light/directional/south,
/obj/machinery/light_switch{
dir = 4;
pixel_x = -19;
@@ -2260,26 +2328,31 @@
/turf/closed/wall/mineral/titanium/exterior,
/area/ship/crew/cryo)
"tQ" = (
-/obj/structure/chair/comfy/shuttle,
/obj/effect/turf_decal/corner_steel_grid{
dir = 9
},
+/obj/structure/chair/comfy/shuttle,
+/obj/effect/turf_decal/floordetail/tiled,
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"tU" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 5
+ dir = 5;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-2"
},
/turf/open/floor/engine/hull,
/area/ship/external/dark)
-"uh" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+"tY" = (
+/obj/machinery/modular_computer/console/preset/command{
+ dir = 1
},
-/obj/effect/turf_decal/floordetail/tiled,
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/bridge)
+"uh" = (
/obj/structure/cable{
icon_state = "4-8"
},
@@ -2585,12 +2658,12 @@
/turf/open/floor/plasteel/dark,
/area/ship/crew/canteen)
"wz" = (
-/obj/effect/turf_decal/corner_steel_grid{
- dir = 9
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/turf_decal/corner_steel_grid{
+ dir = 9
+ },
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"wK" = (
@@ -2812,6 +2885,19 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/plasteel/tech,
/area/ship/engineering/engines/port)
+"yy" = (
+/obj/structure/table/reinforced,
+/obj/item/desk_flag/gezena{
+ pixel_x = 9;
+ pixel_y = 1
+ },
+/obj/machinery/recharger{
+ pixel_y = 1;
+ pixel_x = -6
+ },
+/obj/effect/turf_decal/floordetail/tiled,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/bridge)
"yF" = (
/obj/effect/turf_decal/industrial/traffic{
dir = 1
@@ -2932,9 +3018,6 @@
icon_state = "1-4"
},
/obj/structure/catwalk/over/plated_catwalk,
-/obj/structure/table/reinforced{
- color = "#c1b6a5"
- },
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/high,
/obj/structure/cable,
@@ -2945,6 +3028,7 @@
dir = 5
},
/obj/machinery/airalarm/directional/west,
+/obj/structure/table/reinforced,
/turf/open/floor/plating,
/area/ship/engineering)
"zL" = (
@@ -2970,7 +3054,7 @@
},
/obj/machinery/door/airlock/security{
req_access = list(3);
- name = "Sergeant's Quarters"
+ name = "Lieutenant's Quarters"
},
/turf/open/floor/plasteel/tech,
/area/ship/security)
@@ -3092,6 +3176,22 @@
/obj/machinery/vending/toyliberationstation,
/turf/open/floor/plasteel/tech,
/area/ship/security)
+"AM" = (
+/obj/structure/cable/blue{
+ icon_state = "0-8"
+ },
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/obj/structure/window/plasma/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ship/engineering/engines/port)
"AN" = (
/obj/structure/window/reinforced{
dir = 1
@@ -3353,7 +3453,8 @@
/area/ship/crew/canteen)
"CF" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 10
+ dir = 10;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-4"
@@ -3583,10 +3684,7 @@
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ship/external/dark)
"El" = (
-/obj/structure/railing{
- dir = 8
- },
-/obj/machinery/modular_computer/console/preset/command{
+/obj/machinery/computer/security{
dir = 1
},
/obj/structure/catwalk/over/plated_catwalk/dark,
@@ -3635,7 +3733,8 @@
/area/ship/hallway/central)
"Eu" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 5
+ dir = 5;
+ mode = 1
},
/obj/structure/cable,
/turf/open/floor/engine/hull,
@@ -3898,7 +3997,8 @@
/area/ship/hallway/central)
"FJ" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 5
+ dir = 5;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-4"
@@ -3918,7 +4018,8 @@
/area/ship/engineering/engines/starboard)
"FO" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 8
+ dir = 8;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-4"
@@ -3946,10 +4047,10 @@
/turf/open/floor/plasteel/mono/dark,
/area/ship/hallway/central)
"Gb" = (
-/obj/machinery/computer/crew{
- dir = 8
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
},
-/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/effect/turf_decal/floordetail/tiled,
/obj/structure/cable{
icon_state = "1-8"
},
@@ -4104,8 +4205,8 @@
"GW" = (
/obj/structure/rack,
/obj/item/stock_parts/cell/gun/pgf{
- pixel_y = 12;
- pixel_x = -3
+ pixel_x = -6;
+ pixel_y = -2
},
/obj/item/stock_parts/cell/gun/pgf{
pixel_y = 10;
@@ -4128,6 +4229,13 @@
pixel_x = 3
},
/obj/effect/turf_decal/corner/opaque/neutral/full,
+/obj/item/stock_parts/cell/gun/pgf{
+ pixel_x = -12
+ },
+/obj/item/stock_parts/cell/gun/pgf{
+ pixel_x = -8;
+ pixel_y = -2
+ },
/turf/open/floor/vault,
/area/ship/security/armory)
"Ha" = (
@@ -4146,7 +4254,8 @@
/area/ship/security/armory)
"Hb" = (
/obj/machinery/porta_turret/ship/weak{
- dir = 4
+ dir = 4;
+ mode = 1
},
/obj/structure/cable{
icon_state = "0-2"
@@ -4300,10 +4409,6 @@
/area/ship/crew/canteen)
"Ig" = (
/obj/machinery/computer/helm/viewscreen/directional/north,
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/obj/effect/turf_decal/floordetail/tiled,
/turf/open/floor/plasteel/telecomms_floor,
/area/ship/bridge)
"Ir" = (
@@ -4466,6 +4571,20 @@
},
/turf/open/floor/engine/hull,
/area/ship/external/dark)
+"KH" = (
+/obj/structure/window/reinforced/fulltile/shuttle,
+/obj/structure/grille,
+/obj/machinery/door/poddoor/shutters{
+ id = "lib_bridge_shut"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ship/bridge)
"KM" = (
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ship/hallway/port)
@@ -4516,9 +4635,6 @@
dir = 8;
name = "engine fuel pump"
},
-/obj/structure/cable{
- icon_state = "1-4"
- },
/obj/machinery/camera/autoname{
dir = 1;
network = list("GEC")
@@ -4677,7 +4793,7 @@
"Mw" = (
/obj/structure/bed,
/obj/item/bedsheet/hos{
- name = "Sergeant's Bedsheet";
+ name = "Lieutenant's Bedsheet";
desc = "It is decorated with a shield emblem."
},
/obj/effect/turf_decal/borderfloorblack,
@@ -4713,9 +4829,6 @@
pixel_x = -9;
pixel_y = 3
},
-/obj/item/clothing/head/gezena/medic/flap{
- pixel_x = 12
- },
/obj/item/clothing/head/gezena/medic{
pixel_y = 4;
pixel_x = 7
@@ -4743,6 +4856,11 @@
pixel_x = -13;
pixel_y = -19
},
+/obj/item/clothing/neck/stethoscope,
+/obj/item/clothing/head/gezena/flap/medic{
+ pixel_y = 1;
+ pixel_x = 12
+ },
/turf/open/floor/mineral/titanium,
/area/ship/medical)
"MF" = (
@@ -4801,6 +4919,9 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 8
},
+/obj/structure/railing/corner{
+ dir = 4
+ },
/turf/open/floor/plasteel/tech,
/area/ship/bridge)
"MZ" = (
@@ -4877,7 +4998,7 @@
dir = 8
},
/obj/structure/closet/crate{
- name = "Mishun Acomplshed"
+ name = "Mission Accomplished"
},
/obj/item/poster/mission_accomplished_7,
/obj/item/poster/mission_accomplished_6,
@@ -4917,8 +5038,13 @@
/area/ship/external/dark)
"NF" = (
/obj/structure/closet/crate/radiation,
-/obj/effect/turf_decal/borderfloorblack{
- dir = 4
+/obj/item/clothing/suit/radiation,
+/obj/item/clothing/suit/radiation,
+/obj/item/clothing/head/radiation{
+ pixel_x = -7
+ },
+/obj/item/clothing/head/radiation{
+ pixel_x = -7
},
/turf/open/floor/plasteel/dark,
/area/ship/construction)
@@ -5119,6 +5245,9 @@
/turf/open/floor/vault,
/area/ship/security/armory)
"Pb" = (
+/obj/structure/railing{
+ dir = 4
+ },
/turf/open/floor/plasteel/stairs{
icon = 'icons/obj/stairs.dmi';
dir = 2
@@ -5145,7 +5274,6 @@
/turf/open/floor/plating,
/area/ship/engineering)
"Ph" = (
-/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable{
icon_state = "2-9"
},
@@ -5155,6 +5283,9 @@
/obj/machinery/atmospherics/components/trinary/mixer/layer2{
dir = 1
},
+/obj/machinery/atmospherics/pipe/manifold/orange/visible{
+ dir = 4
+ },
/turf/open/floor/plasteel/tech,
/area/ship/engineering/engines/port)
"Pi" = (
@@ -5360,6 +5491,13 @@
/obj/effect/turf_decal/corner/opaque/neutral/full,
/turf/open/floor/vault,
/area/ship/security/armory)
+"Qi" = (
+/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/computer/cargo{
+ dir = 8
+ },
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ship/bridge)
"Qq" = (
/obj/structure/rack,
/obj/item/kitchen/knife/combat/survival{
@@ -5867,6 +6005,7 @@
/obj/item/gun/energy/kalix/pistol{
pixel_y = -16
},
+/obj/item/screwdriver,
/turf/open/floor/plasteel/sepia,
/area/ship/crew/dorm/dormthree)
"UH" = (
@@ -5915,10 +6054,6 @@
pixel_x = -10;
pixel_y = -7
},
-/obj/item/clothing/under/gezena/marine{
- pixel_x = -10;
- pixel_y = -7
- },
/obj/item/clothing/gloves/gezena/marine{
pixel_y = 11
},
@@ -5928,25 +6063,6 @@
/obj/item/clothing/gloves/gezena/marine{
pixel_y = 11
},
-/obj/item/clothing/gloves/gezena/marine{
- pixel_y = 11
- },
-/obj/item/clothing/head/gezena/marine/flap{
- pixel_x = -10
- },
-/obj/item/clothing/head/gezena/marine/flap{
- pixel_x = -10
- },
-/obj/item/clothing/head/gezena/marine/flap{
- pixel_x = -10
- },
-/obj/item/clothing/head/gezena/marine/flap{
- pixel_x = -10
- },
-/obj/item/clothing/head/gezena/marine{
- pixel_y = 10;
- pixel_x = -10
- },
/obj/item/clothing/head/gezena/marine{
pixel_y = 10;
pixel_x = -10
@@ -5975,13 +6091,6 @@
/obj/item/storage/backpack/duffelbag/sec{
pixel_y = -13
},
-/obj/item/storage/backpack/duffelbag/sec{
- pixel_y = -13
- },
-/obj/item/storage/backpack/satchel/sec{
- pixel_x = -8;
- pixel_y = -17
- },
/obj/item/storage/backpack/satchel/sec{
pixel_x = -8;
pixel_y = -17
@@ -6006,11 +6115,19 @@
pixel_x = 3;
pixel_y = 0
},
-/obj/item/clothing/shoes/combat/gezena{
- pixel_x = 3;
- pixel_y = 0
- },
/obj/effect/turf_decal/corner/opaque/neutral/full,
+/obj/item/clothing/head/gezena/flap/marine{
+ pixel_y = 1;
+ pixel_x = -10
+ },
+/obj/item/clothing/head/gezena/flap/marine{
+ pixel_y = 1;
+ pixel_x = -10
+ },
+/obj/item/clothing/head/gezena/flap/marine{
+ pixel_y = 1;
+ pixel_x = -10
+ },
/turf/open/floor/vault,
/area/ship/security/armory)
"Vp" = (
@@ -6059,11 +6176,11 @@
/turf/open/floor/plasteel/mono,
/area/ship/hangar/starboard)
"VM" = (
-/obj/machinery/power/terminal{
- dir = 8
- },
-/obj/structure/cable,
/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "engine fuel pump"
+ },
/turf/open/floor/plating,
/area/ship/engineering/engines/starboard)
"VY" = (
@@ -6075,7 +6192,7 @@
anchored = 1;
can_be_unanchored = 1;
icon_state = "warden";
- name = "sergeant's locker";
+ name = "Lieutenant's locker";
req_access_txt = "3";
req_access = list(3)
},
@@ -6106,10 +6223,6 @@
pixel_y = 1;
pixel_x = -11
},
-/obj/item/clothing/head/gezena/marine/lead/flap{
- pixel_y = 9;
- pixel_x = -11
- },
/obj/item/clothing/suit/armor/gezena/marinecoat{
pixel_y = 8
},
@@ -6117,14 +6230,6 @@
pixel_y = 11;
pixel_x = 5
},
-/obj/item/radio/headset/pgf/captain{
- pixel_x = -4;
- pixel_y = 9
- },
-/obj/item/kitchen/knife/combat/survival{
- pixel_y = 0;
- pixel_x = 1
- },
/obj/item/storage/belt/military/gezena{
pixel_y = 1
},
@@ -6132,6 +6237,10 @@
pixel_x = -8;
pixel_y = -17
},
+/obj/item/radio/headset/pgf/captain{
+ pixel_x = -2;
+ pixel_y = 9
+ },
/obj/item/storage/backpack/duffelbag/sec{
pixel_y = -13
},
@@ -6140,7 +6249,14 @@
pixel_x = -3
},
/obj/item/clothing/head/helmet/gezena{
- pixel_y = -11
+ pixel_x = -11
+ },
+/obj/item/clothing/suit/armor/gezena/marine{
+ pixel_y = 8
+ },
+/obj/item/clothing/head/gezena/flap/marine/lead{
+ pixel_y = 10;
+ pixel_x = -10
},
/turf/open/floor/plasteel/tech,
/area/ship/crew/dorm/dormtwo)
@@ -6171,6 +6287,16 @@
},
/turf/open/floor/plasteel/sepia,
/area/ship/crew/dorm)
+"Wg" = (
+/obj/effect/turf_decal/spline/fancy/opaque/lime{
+ dir = 1
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/lime,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech,
+/area/ship/bridge)
"Wk" = (
/obj/machinery/power/smes/shuttle/precharged{
dir = 4
@@ -6229,9 +6355,6 @@
dir = 5
},
/obj/structure/catwalk/over/plated_catwalk/dark,
-/obj/structure/cable{
- icon_state = "2-8"
- },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -6384,13 +6507,11 @@
/turf/open/floor/plasteel/tech,
/area/ship/construction)
"Yd" = (
-/obj/machinery/power/terminal{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/structure/catwalk/over/plated_catwalk/dark,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "engine fuel pump"
+ },
/turf/open/floor/plating,
/area/ship/engineering/engines/port)
"Yo" = (
@@ -6707,14 +6828,14 @@ xz
xz
lc
hJ
-hJ
+ae
is
lc
xz
xz
TV
FN
-fN
+dv
fN
TV
xz
@@ -6735,14 +6856,14 @@ xz
lc
lc
CB
-CB
+AM
UM
lc
FO
LD
TV
bB
-Wk
+pK
Wk
TV
TV
@@ -7914,8 +8035,8 @@ bb
wz
tQ
El
-Ms
-MF
+Wg
+om
MF
eO
Ly
@@ -7941,10 +8062,10 @@ MF
Ig
uh
qj
-Ms
-CZ
-xz
-Mk
+tY
+hX
+MF
+MF
Bc
KS
Sp
@@ -7968,10 +8089,10 @@ Hb
vr
dK
Gb
-Ms
+yy
+KH
CZ
xz
-xz
Mk
iK
sQ
@@ -7993,13 +8114,13 @@ xz
xz
xz
cR
-Rx
-bD
-bD
+Sd
+Qi
+bi
+Ms
CZ
xz
xz
-xz
Mk
Er
Mk
@@ -8021,10 +8142,10 @@ xz
xz
xz
xz
-xz
-xz
-xz
-xz
+Rx
+bD
+bD
+CZ
xz
xz
xz
diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm
index e4a85560cb67..5ef138ad19db 100644
--- a/_maps/shuttles/roumain/srm_elder.dmm
+++ b/_maps/shuttles/roumain/srm_elder.dmm
@@ -3609,7 +3609,7 @@
/turf/open/floor/wood/maple,
/area/ship/crew/cryo)
"Sg" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/effect/turf_decal/spline/fancy/wood{
diff --git a/_maps/shuttles/solgov/solgov_chronicle.dmm b/_maps/shuttles/solgov/solgov_chronicle.dmm
index 13e78929b4dc..012261bda246 100644
--- a/_maps/shuttles/solgov/solgov_chronicle.dmm
+++ b/_maps/shuttles/solgov/solgov_chronicle.dmm
@@ -350,7 +350,7 @@
/turf/open/floor/wood,
/area/ship/crew)
"da" = (
-/obj/machinery/computer/cargo/express/solgov{
+/obj/machinery/computer/cargo/solgov{
dir = 4
},
/obj/item/radio/intercom/directional/west,
diff --git a/_maps/shuttles/solgov/solgov_inkwell.dmm b/_maps/shuttles/solgov/solgov_inkwell.dmm
index da2a6b032eaa..f2cf61f1f33b 100644
--- a/_maps/shuttles/solgov/solgov_inkwell.dmm
+++ b/_maps/shuttles/solgov/solgov_inkwell.dmm
@@ -1848,10 +1848,10 @@
/area/ship/crew/canteen/kitchen)
"mz" = (
/obj/structure/closet/crate,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
@@ -2139,7 +2139,7 @@
/turf/open/floor/plasteel/mono,
/area/ship/cargo)
"nO" = (
-/obj/machinery/computer/cargo/express/solgov,
+/obj/machinery/computer/cargo/solgov,
/turf/open/floor/wood/maple,
/area/ship/bridge)
"nR" = (
@@ -2282,6 +2282,7 @@
dir = 4;
name = "Fuel Mixer"
},
+/obj/item/paper/guides/jobs/engi/combustion_thruster,
/turf/open/floor/plasteel/tech,
/area/ship/maintenance/starboard)
"oH" = (
diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm
index b099e500aee9..4700c74ee7b0 100644
--- a/_maps/shuttles/solgov/solgov_paracelsus.dmm
+++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm
@@ -731,10 +731,10 @@
/area/ship/hallway/starboard)
"hh" = (
/obj/structure/closet/crate,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
-/obj/item/reagent_containers/food/snacks/store/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
+/obj/item/food/bread/plain,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
/obj/item/reagent_containers/food/drinks/waterbottle/large,
@@ -2725,7 +2725,7 @@
/obj/structure/railing/wood{
dir = 8
},
-/obj/machinery/computer/cargo/express/solgov{
+/obj/machinery/computer/cargo/solgov{
dir = 4
},
/obj/effect/turf_decal/siding/wood{
diff --git a/_maps/shuttles/subshuttles/Subshuttle Catalog.txt b/_maps/shuttles/subshuttles/Subshuttle Catalog.txt
index 732d43938f30..14a2fff4895e 100644
--- a/_maps/shuttles/subshuttles/Subshuttle Catalog.txt
+++ b/_maps/shuttles/subshuttles/Subshuttle Catalog.txt
@@ -13,6 +13,11 @@ Size = "12x7"
Purpose = "A multi-role dropship used by almost every group faring space. Its ease of manufacture and high mobility makes it ideal for transport."
File Path = "_maps\shuttles\subshuttles\indepenent_kunai.dmm"
+Name = "Tanto-class Drop Pod"
+Size = "6x5"
+Purpose = "A combat-ready drop pod designed for quick deployment in hectic battles. Its lack of holofields makes it unsuitable for environments without sufficient atmosphere, unless depressurised beforehand."
+File Path = "_maps\shuttles\subshuttles\indepenent_kunai.dmm"
+
Name = "Haste-class Patient Recovery Ship"
Size = "6x4"
Purpose = "A small, nimble ship utilized as an ambulance by Inteq forces."
diff --git a/_maps/shuttles/subshuttles/independent_tanto.dmm b/_maps/shuttles/subshuttles/independent_tanto.dmm
new file mode 100644
index 000000000000..e99e605fed4b
--- /dev/null
+++ b/_maps/shuttles/subshuttles/independent_tanto.dmm
@@ -0,0 +1,333 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"e" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/landmark/ert_shuttle_spawn,
+/turf/open/floor/pod,
+/area/ship/storage)
+"f" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "pod_aft"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/docking_port/mobile{
+ dir = 4;
+ name = "tanto pod";
+ port_direction = 2;
+ preferred_direction = 4
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ship/storage)
+"l" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4;
+ layer = 3.3
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic,
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_y = -6;
+ pixel_x = -22;
+ name = "Aft Door";
+ id = "pod_aft"
+ },
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_x = -32;
+ name = "Window Shutters";
+ id = "pod_window"
+ },
+/obj/machinery/door/window/brigdoor/northleft,
+/obj/machinery/button/door{
+ dir = 4;
+ pixel_y = 6;
+ pixel_x = -22;
+ name = "Fore Door";
+ id = "pod_fore"
+ },
+/obj/effect/landmark/ert_shuttle_spawn,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/storage)
+"n" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/item/radio/intercom/directional/south,
+/obj/effect/landmark/ert_shuttle_brief_spawn,
+/turf/open/floor/pod,
+/area/ship/storage)
+"p" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced,
+/obj/structure/cable/yellow,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/storage)
+"s" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/pod,
+/area/ship/storage)
+"w" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/ship/storage)
+"x" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/power/port_gen/pacman,
+/obj/item/stack/sheet/mineral/plasma/twenty,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/wrench,
+/obj/machinery/door/window/brigdoor/southleft,
+/obj/structure/closet/wall/red/directional/west{
+ secure = 1;
+ locked = 1
+ },
+/obj/item/pickaxe/mini,
+/obj/item/flashlight/flare{
+ pixel_y = 3
+ },
+/obj/item/flashlight/flare,
+/obj/item/flashlight/flare{
+ pixel_y = -3
+ },
+/obj/item/storage/toolbox/emergency/shuttle/electric,
+/obj/item/tank/internals/emergency_oxygen/double,
+/obj/item/clothing/mask/gas,
+/obj/item/tank/internals/emergency_oxygen/double,
+/obj/item/clothing/mask/gas,
+/obj/item/tank/internals/emergency_oxygen/double,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/storage)
+"z" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/computer/helm{
+ dir = 8;
+ layer = 3.3
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/storage)
+"C" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/machinery/power/smes/shuttle/micro/precharged{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/storage)
+"E" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/machinery/power/terminal{
+ dir = 8
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/storage)
+"J" = (
+/obj/structure/window/reinforced,
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/machinery/light/small/directional/east{
+ pixel_y = -6
+ },
+/obj/machinery/light_switch{
+ dir = 8
+ },
+/obj/effect/turf_decal/techfloor,
+/obj/machinery/light_switch{
+ pixel_x = 22;
+ pixel_y = 5;
+ dir = 8
+ },
+/obj/effect/landmark/ert_shuttle_spawn,
+/turf/open/floor/plasteel/patterned/brushed,
+/area/ship/storage)
+"K" = (
+/obj/effect/turf_decal/siding/white,
+/obj/effect/turf_decal/siding/white{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/pod,
+/area/ship/storage)
+"L" = (
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 4
+ },
+/obj/effect/turf_decal/industrial/traffic{
+ dir = 8
+ },
+/obj/machinery/door/poddoor{
+ dir = 4;
+ id = "pod_fore"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine/hull/reinforced/interior,
+/area/ship/storage)
+"S" = (
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/power/smes/shuttle/micro/precharged{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "pod_window"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/storage)
+"Y" = (
+/obj/machinery/power/shuttle/engine/electric{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/turf/open/floor/engine/hull/reinforced,
+/area/ship/storage)
+
+(1,1,1) = {"
+a
+w
+f
+w
+a
+"}
+(2,1,1) = {"
+Y
+w
+e
+w
+Y
+"}
+(3,1,1) = {"
+C
+l
+K
+x
+S
+"}
+(4,1,1) = {"
+E
+z
+s
+J
+p
+"}
+(5,1,1) = {"
+w
+w
+n
+w
+w
+"}
+(6,1,1) = {"
+a
+w
+L
+w
+a
+"}
diff --git a/_maps/shuttles/subshuttles/pgf_nail.dmm b/_maps/shuttles/subshuttles/pgf_nail.dmm
index 9a5224dc4573..02255b90a5c0 100644
--- a/_maps/shuttles/subshuttles/pgf_nail.dmm
+++ b/_maps/shuttles/subshuttles/pgf_nail.dmm
@@ -391,7 +391,8 @@
icon_state = "0-4"
},
/obj/machinery/porta_turret/ship/weak{
- dir = 8
+ dir = 8;
+ mode = 1
},
/turf/open/floor/engine/hull/reinforced/interior,
/area/ship/external/dark)
diff --git a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
index 41faf816d827..ffc2472b5dec 100644
--- a/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
+++ b/_maps/shuttles/syndicate/syndicate_cybersun_kansatsu.dmm
@@ -258,7 +258,7 @@
/turf/open/floor/plasteel/stairs,
/area/ship/cargo)
"fk" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/obj/machinery/button/door{
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
index 7c7a34fd2690..ae46dc0286f3 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm
@@ -952,7 +952,7 @@
"pI" = (
/obj/item/radio/intercom/wideband/directional/east,
/obj/effect/decal/cleanable/dirt/dust,
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 1
},
/obj/effect/turf_decal/borderfloorblack,
diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
index 7c323e43dbe0..8a29a537d060 100644
--- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
+++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm
@@ -964,7 +964,7 @@
/obj/machinery/door/poddoor/shutters{
dir = 8;
id = "syndie_mechbay";
- name = "Mechbay"
+ name = "Exosuit Bay"
},
/obj/machinery/door/firedoor/border_only{
dir = 8
@@ -2044,7 +2044,7 @@
/obj/machinery/button/door{
dir = 4;
id = "syndie_mechbay";
- name = "mechbay door";
+ name = "Exosuit Bay Door";
pixel_x = -24
},
/obj/item/radio/intercom/directional/south,
@@ -2099,7 +2099,7 @@
/obj/machinery/button/door{
dir = 8;
id = "syndie_mechbay";
- name = "mechbay door";
+ name = "Exosuit Bay Door";
pixel_x = 24
},
/obj/effect/turf_decal/techfloor{
@@ -2475,6 +2475,7 @@
/obj/machinery/atmospherics/components/trinary/mixer/flipped{
dir = 1
},
+/obj/item/paper/guides/jobs/engi/combustion_thruster,
/turf/open/floor/plasteel/tech,
/area/ship/engineering)
"wJ" = (
@@ -3507,7 +3508,7 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ship/hallway/central)
"HI" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
layer = 3
},
/obj/effect/turf_decal/techfloor{
diff --git a/_maps/shuttles/syndicate/syndicate_litieguai.dmm b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
index c2e92f15f167..09ad85bc606f 100644
--- a/_maps/shuttles/syndicate/syndicate_litieguai.dmm
+++ b/_maps/shuttles/syndicate/syndicate_litieguai.dmm
@@ -2608,7 +2608,7 @@
/turf/open/floor/plasteel/white,
/area/ship/hallway/central)
"TA" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/turf/open/floor/plasteel/dark,
diff --git a/_maps/shuttles/syndicate/syndicate_panacea.dmm b/_maps/shuttles/syndicate/syndicate_panacea.dmm
index a55e39dd9e27..4fdcc0741037 100644
--- a/_maps/shuttles/syndicate/syndicate_panacea.dmm
+++ b/_maps/shuttles/syndicate/syndicate_panacea.dmm
@@ -887,7 +887,7 @@
/turf/open/floor/suns/dark/plain,
/area/ship/crew/office/lobby)
"fG" = (
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8
},
/turf/open/floor/suns/dark,
@@ -6072,7 +6072,7 @@
/area/ship/external/dark)
"JJ" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/snacks/store/cake/lemon{
+/obj/item/food/cake/lemon{
pixel_y = 5
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
index 9967d69f6d07..1adef58948fe 100644
--- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
+++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm
@@ -1580,7 +1580,7 @@
/obj/effect/turf_decal/corner/opaque/syndiered/half{
dir = 4
},
-/obj/machinery/computer/cargo/express{
+/obj/machinery/computer/cargo{
dir = 8;
icon_state = "computer-left"
},
diff --git a/check_regex.yaml b/check_regex.yaml
index 3b5e13a650e5..441f1e44d743 100644
--- a/check_regex.yaml
+++ b/check_regex.yaml
@@ -31,7 +31,7 @@ standards:
- exactly: [4, "/mob text paths", '"/mob']
- exactly: [43, "/obj text paths", '"/obj']
- exactly: [0, "/turf text paths", '"/turf']
- - exactly: [117, "text2path uses", "text2path"]
+ - exactly: [116, "text2path uses", "text2path"]
- exactly: [18, "world<< uses", 'world[ \t]*<<']
- exactly: [0, "world.log<< uses", 'world.log[ \t]*<<']
diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index c55604dcebdd..a37fda280ec0 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -24,6 +24,7 @@
#define MEDAL_SNAIL "KKKiiilll mmmeee"
#define MEDAL_LOOKOUTSIR "Look Out, Sir!"
#define MEDAL_GOTTEM "GOTTEM"
+#define MEDAL_SPRINGLOCK "The Man Inside the Modsuit"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm
new file mode 100644
index 000000000000..ca2068106994
--- /dev/null
+++ b/code/__DEFINES/actions.dm
@@ -0,0 +1,20 @@
+///Action button checks if hands are unusable
+#define AB_CHECK_HANDS_BLOCKED (1<<0)
+///Action button checks if user is immobile
+#define AB_CHECK_IMMOBILE (1<<1)
+///Action button checks if user is resting
+#define AB_CHECK_LYING (1<<2)
+///Action button checks if user is conscious
+#define AB_CHECK_CONSCIOUS (1<<3)
+
+///Action button triggered with right click
+#define TRIGGER_SECONDARY_ACTION (1<<0)
+
+// Defines for formatting cooldown actions for the stat panel.
+/// The stat panel the action is displayed in.
+#define PANEL_DISPLAY_PANEL "panel"
+/// The status shown in the stat panel.
+/// Can be stuff like "ready", "on cooldown", "active", "charges", "charge cost", etc.
+#define PANEL_DISPLAY_STATUS "status"
+/// The name shown in the stat panel.
+#define PANEL_DISPLAY_NAME "name"
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 6e99bc182e61..22e69cd06d9f 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -33,6 +33,10 @@
/// Amount of air to take a from a tile
#define BREATH_PERCENTAGE (BREATH_VOLUME/CELL_VOLUME)
+/// This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
+#define BODYTEMP_AUTORECOVERY_DIVISOR 28
+/// The natural temperature for a body
+#define BODYTEMP_NORMAL 310.15
//EXCITED GROUPS
/// number of FULL air controller ticks before an excited group breaks down (averages gas contents across turfs)
@@ -331,6 +335,8 @@
#define GAS_PLUOXIUM "pluox"
#define GAS_FREON "freon"
#define GAS_HYDROGEN "h2"
+#define GAS_CHLORINE "cl2"
+#define GAS_HYDROGEN_CHLORIDE "hcl"
#define GAS_FLAG_DANGEROUS (1<<0)
#define GAS_FLAG_BREATH_PROC (1<<1)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 69886107d61c..6fa77815ff2b 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -168,3 +168,14 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
//We will round to this value in damage calculations.
#define DAMAGE_PRECISION 0.1
+
+/// Alternate attack defines. Return these at the end of procs like afterattack_secondary.
+/// Calls the normal attack proc. For example, if returned in afterattack_secondary, will call afterattack.
+/// Will continue the chain depending on the return value of the non-alternate proc, like with normal attacks.
+#define SECONDARY_ATTACK_CALL_NORMAL 1
+
+/// Cancels the attack chain entirely.
+#define SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN 2
+
+/// Proceed with the attack chain, but don't call the normal methods.
+#define SECONDARY_ATTACK_CONTINUE_CHAIN 3
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals/signals.dm
similarity index 83%
rename from code/__DEFINES/dcs/signals.dm
rename to code/__DEFINES/dcs/signals/signals.dm
index d0038cf5277e..ecb2f4666dae 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals/signals.dm
@@ -59,6 +59,14 @@
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
+/// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, params)
+#define COMSIG_ITEM_PRE_ATTACK_SECONDARY "item_pre_attack_secondary"
+ #define COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN (1<<0)
+ #define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1)
+ #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2)
+#define COMSIG_PARENT_ATTACKBY_SECONDARY "atom_attackby_secondary"
+/// From base of [/atom/proc/attack_hand_secondary]: (mob/user, list/modifiers) - Called when the atom receives a secondary unarmed attack.
+#define COMSIG_ATOM_ATTACK_HAND_SECONDARY "atom_attack_hand_secondary"
///Return this in response if you don't want afterattack to be called
#define COMPONENT_NO_AFTERATTACK (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
@@ -158,6 +166,10 @@
///from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMSIG_ATOM_CANREACH "atom_can_reach"
#define COMPONENT_BLOCK_REACH 1
+ #define COMPONENT_ALLOW_REACH (1<<0)
+///for when an atom has been created through processing (atom/original_atom, list/chosen_processing_option)
+#define COMSIG_ATOM_CREATEDBY_PROCESSING "atom_createdby_processing"
+
///from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act"
///from base of atom/wrench_act(): (mob/living/user, obj/item/I)
@@ -172,7 +184,11 @@
#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act"
///from base of atom/analyser_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act"
+
+///for any tool behaviors: (mob/living/user, obj/item/I, list/recipes)
+#define COMSIG_ATOM_TOOL_ACT(tooltype) "tool_act_[tooltype]"
#define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
+
///called when teleporting into a protected turf: (channel, turf/origin)
#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport"
#define COMPONENT_BLOCK_TELEPORT (1<<0)
@@ -182,6 +198,12 @@
#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
///called when an atom stops orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
+/* Attack signals. They should share the returned flags, to standardize the attack chain. */
+/// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack
+ ///Ends the attack chain. If sent early might cause posterior attacks not to happen.
+ #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0)
+ ///Skips the specific attack step, continuing for the next one to happen.
+ #define COMPONENT_SKIP_ATTACK (1<<1)
///from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost"
///from base of atom/attack_hand(): (mob/user)
@@ -324,6 +346,37 @@
#define COMSIG_MOVABLE_LIGHT_OVERLAY_TOGGLE_ON "movable_light_overlay_toggle_on"
///called when the movable's glide size is updated: (new_glide_size)
#define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size"
+/// from base of atom/movable/Process_Spacemove(): (movement_dir, continuous_move)
+#define COMSIG_MOVABLE_SPACEMOVE "spacemove"
+ #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0)
+ ///from datum/component/drift/apply_initial_visuals(): ()
+#define COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT "movable_drift_visual_attempt"
+ #define DRIFT_VISUAL_FAILED (1<<0)
+ ///from datum/component/drift/allow_final_movement(): ()
+#define COMSIG_MOVABLE_DRIFT_BLOCK_INPUT "movable_drift_block_input"
+ #define DRIFT_ALLOW_INPUT (1<<0)
+
+///signal sent out by an atom when it checks if it can be pulled, for additional checks
+#define COMSIG_ATOM_CAN_BE_PULLED "movable_can_be_pulled"
+ #define COMSIG_ATOM_CANT_PULL (1 << 0)
+///signal sent out by an atom when it is no longer being pulled by something else
+#define COMSIG_ATOM_NO_LONGER_PULLED "movable_no_longer_pulled"
+///signal sent out by an atom when it is no longer pulling something : (atom/pulling)
+#define COMSIG_ATOM_NO_LONGER_PULLING "movable_no_longer_pulling"
+///called on /living, when pull is attempted, but before it completes, from base of [/mob/living/start_pulling]: (atom/movable/thing, force)
+#define COMSIG_LIVING_TRY_PULL "living_try_pull"
+ #define COMSIG_LIVING_CANCEL_PULL (1 << 0)
+/// Called from /mob/living/update_pull_movespeed
+#define COMSIG_LIVING_UPDATING_PULL_MOVESPEED "living_updating_pull_movespeed"
+/// Called from /mob/living/PushAM -- Called when this mob is about to push a movable, but before it moves
+/// (aotm/movable/being_pushed)
+#define COMSIG_LIVING_PUSHING_MOVABLE "living_pushing_movable"
+///from base of [/atom/proc/interact]: (mob/user)
+#define COMSIG_ATOM_UI_INTERACT "atom_ui_interact"
+///called on /living when attempting to pick up an item, from base of /mob/living/put_in_hand_check(): (obj/item/I)
+#define COMSIG_LIVING_TRY_PUT_IN_HAND "living_try_put_in_hand"
+ /// Can't pick up
+ #define COMPONENT_LIVING_CANT_PUT_IN_HAND (1<<0)
// /mob signals
@@ -345,6 +398,9 @@
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
+///From base of mob/living/MobBump() (mob/living)
+#define COMSIG_LIVING_MOB_BUMP "living_mob_bump"
+
///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_ALLOWED "mob_allowed"
///from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
@@ -498,84 +554,6 @@
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK 1
-// /obj signals
-
-///from base of obj/deconstruct(): (disassembled)
-#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
-///from base of code/game/machinery
-#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
-///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
-#define COMSIG_OBJ_HIDE "obj_hide"
-
-// /obj/machinery signals
-
-///from /obj/machinery/obj_break(damage_flag): (damage_flag)
-#define COMSIG_MACHINERY_BROKEN "machinery_broken"
-///from base power_change() when power is lost
-#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
-///from base power_change() when power is restored
-#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
-
-// /obj/machinery/power/supermatter_crystal signals
-/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM delam reaches the point of sounding alarms
-#define COMSIG_SUPERMATTER_DELAM_START_ALARM "sm_delam_start_alarm"
-/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm
-#define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm"
-
-// /obj/item signals
-#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
-#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
- #define COMPONENT_NO_INTERACT 1
-#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob)
- #define COMPONENT_NO_ATTACK_OBJ 1
-#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
- #define COMPONENT_NO_ATTACK 1
-#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
-#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
-#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
-#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
-#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
-#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
-#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
-#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
- #define COMPONENT_BLOCK_MARK_RETRIEVAL 1
-#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args)
-#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed)
-#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M)
-#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act" //from base of item/sharpener/attackby(): (amount, max)
- #define COMPONENT_BLOCK_SHARPEN_APPLIED 1
- #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2
- #define COMPONENT_BLOCK_SHARPEN_ALREADY 4
- #define COMPONENT_BLOCK_SHARPEN_MAXED 8
-#define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
-#define COMSIG_TOOL_START_USE "tool_start_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
-#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]:
-#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/item/mine/proc/trigger_mine]:
-///from [/obj/structure/closet/supplypod/proc/endlaunch]:
-#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"
-
-// Item mouse siganls
-#define COMSIG_ITEM_MOUSE_EXIT "item_mouse_exit" //from base of obj/item/MouseExited(): (location, control, params)
-#define COMSIG_ITEM_MOUSE_ENTER "item_mouse_enter" //from base of obj/item/MouseEntered(): (location, control, params)
-
-///Called when an item is being offered, from [/obj/item/proc/on_offered(mob/living/carbon/offerer)]
-#define COMSIG_ITEM_OFFERING "item_offering"
- ///Interrupts the offer proc
- #define COMPONENT_OFFER_INTERRUPT (1<<0)
-///Called when an someone tries accepting an offered item, from [/obj/item/proc/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)]
-#define COMSIG_ITEM_OFFER_TAKEN "item_offer_taken"
- ///Interrupts the offer acceptance
- #define COMPONENT_OFFER_TAKE_INTERRUPT (1<<0)
-/// sent from obj/effect/attackby(): (/obj/effect/hit_effect, /mob/living/attacker, params)
-#define COMSIG_ITEM_ATTACK_EFFECT "item_effect_attacked"
-
-// /obj/item signals for economy
-#define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem
-#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" //called when a wrapped up structure is opened by hand
-#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" //called when a wrapped up item is opened by hand
- #define COMSIG_ITEM_SPLIT_VALUE 1
-#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" //Called when getting the item's exact ratio for cargo's profit.
-#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry" //Called when getting the item's exact ratio for cargo's profit, without selling the item.
/// Admin helps
/// From /datum/admin_help/RemoveActive().
@@ -585,21 +563,6 @@
/// Called when the player replies. From /client/proc/cmd_admin_pm().
#define COMSIG_ADMIN_HELP_REPLIED "admin_help_replied"
-// /obj/item/clothing signals
-#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
-#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle" //from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
-
-// /obj/item/implant signals
-#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): ()
-#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args)
- #define COMPONENT_STOP_IMPLANTING 1
-#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
- //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both
- #define COMPONENT_DELETE_NEW_IMPLANT 2
- #define COMPONENT_DELETE_OLD_IMPLANT 4
-#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
- //This uses all return values of COMSIG_IMPLANT_OTHER
-
// /obj/item/pda signals
#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
#define COMPONENT_STOP_RINGTONE_CHANGE 1
@@ -615,10 +578,6 @@
// /obj/item/gun signals
#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
-// /obj/item/grenade signals
-#define COMSIG_GRENADE_PRIME "grenade_prime" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
-#define COMSIG_GRENADE_ARMED "grenade_armed" //called in /obj/item/gun/process_fire (user, target, params, zone_override)
-
// /obj/projectile signals (sent to the firer)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
@@ -633,13 +592,6 @@
// /obj/mecha signals
#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to
-// /mob/living/carbon/human signals
-#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
-#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
-#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
-#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
-#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set
-
// /datum/species signals
#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species)
@@ -665,9 +617,6 @@
//Creamed
#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength)
-//Food
-#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
-
//Gibs
#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
@@ -753,10 +702,6 @@
#define COMSIG_BEAM_BEFORE_DRAW "beam_before_draw"
#define BEAM_CANCEL_DRAW (1 << 0)
-// Aquarium related signals
-#define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed"
-#define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed"
-
// Fish signals
#define COMSIG_FISH_STATUS_CHANGED "fish_status_changed"
#define COMSIG_FISH_STIRRED "fish_stirred"
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
new file mode 100644
index 000000000000..2428eddf1346
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm
@@ -0,0 +1,82 @@
+///Called from /mob/living/carbon/help_shake_act, before any hugs have ocurred. (mob/living/helper)
+#define COMSIG_CARBON_PRE_HELP_ACT "carbon_pre_help"
+ /// Stops the rest of help act (hugging, etc) from occuring
+ #define COMPONENT_BLOCK_HELP_ACT (1<<0)
+
+///Called from /mob/living/carbon/help_shake_act on the person being helped, after any hugs have ocurred. (mob/living/helper)
+#define COMSIG_CARBON_HELP_ACT "carbon_help"
+///Called from /mob/living/carbon/help_shake_act on the helper, after any hugs have ocurred. (mob/living/helped)
+#define COMSIG_CARBON_HELPED "carbon_helped_someone"
+
+///Before a carbon mob is shoved, sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target)
+#define COMSIG_CARBON_DISARM_PRESHOVE "carbon_disarm_preshove"
+ #define COMSIG_CARBON_ACT_SOLID (1<<0) //Tells disarm code to act as if the mob was shoved into something solid, even we we're not
+///When a carbon mob is disarmed, this is sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target, shove_blocked)
+#define COMSIG_CARBON_DISARM_COLLIDE "carbon_disarm_collision"
+ #define COMSIG_CARBON_SHOVE_HANDLED (1<<0)
+
+// /mob/living/carbon physiology signals
+#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
+#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L)
+///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
+#define COMSIG_CARBON_ATTACH_LIMB "carbon_attach_limb"
+#define COMSIG_CARBON_REMOVE_LIMB "carbon_remove_limb" //from base of /obj/item/bodypart/proc/drop_limb(lost_limb, dismembered)
+#define COMSIG_BODYPART_GAUZED "bodypart_gauzed" // from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze)
+#define COMSIG_BODYPART_GAUZE_DESTROYED "bodypart_degauzed" // from [/obj/item/bodypart/proc/seep_gauze] when it runs out of absorption
+
+///Called when someone attempts to cuff a carbon
+#define COMSIG_CARBON_CUFF_ATTEMPTED "carbon_attempt_cuff"
+///Called when a carbon mutates (source = dna, mutation = mutation added)
+#define COMSIG_CARBON_GAIN_MUTATION "carbon_gain_mutation"
+///Called when a carbon loses a mutation (source = dna, mutation = mutation lose)
+#define COMSIG_CARBON_LOSE_MUTATION "carbon_lose_mutation"
+///Called when a carbon becomes addicted (source = what addiction datum, addicted_mind = mind of the addicted carbon)
+#define COMSIG_CARBON_GAIN_ADDICTION "carbon_gain_addiction"
+///Called when a carbon is no longer addicted (source = what addiction datum was lost, addicted_mind = mind of the freed carbon)
+#define COMSIG_CARBON_LOSE_ADDICTION "carbon_lose_addiction"
+///Called when a carbon gets a brain trauma (source = carbon, trauma = what trauma was added) - this is before on_gain()
+#define COMSIG_CARBON_GAIN_TRAUMA "carbon_gain_trauma"
+///Called when a carbon loses a brain trauma (source = carbon, trauma = what trauma was removed)
+#define COMSIG_CARBON_LOSE_TRAUMA "carbon_lose_trauma"
+///Called when a carbon updates their health (source = carbon)
+#define COMSIG_CARBON_HEALTH_UPDATE "carbon_health_update"
+///Called when a carbon updates their sanity (source = carbon)
+#define COMSIG_CARBON_SANITY_UPDATE "carbon_sanity_update"
+///Called when a carbon breathes, before the breath has actually occured
+#define COMSIG_CARBON_PRE_BREATHE "carbon_pre_breathe"
+///Called when a carbon updates their mood
+#define COMSIG_CARBON_MOOD_UPDATE "carbon_mood_update"
+
+// /mob/living/carbon/human signals
+
+///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
+#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
+///Whenever EquipRanked is called, called after job is set
+#define COMSIG_JOB_RECEIVED "job_received"
+///from /mob/living/carbon/human/proc/set_coretemperature(): (oldvalue, newvalue)
+#define COMSIG_HUMAN_CORETEMP_CHANGE "human_coretemp_change"
+///from /datum/species/handle_fire. Called when the human is set on fire and burning clothes and stuff
+#define COMSIG_HUMAN_BURNING "human_burning"
+///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers)
+#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
+///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers)
+#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack"
+//from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
+#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
+//from /mob/living/carbon/human/proc/check_shields(): (atom/hit_by, damage, attack_text, attack_type, armour_penetration)
+#define COMSIG_HUMAN_CHECK_SHIELDS "human_check_shields"
+ #define SHIELD_BLOCK (1<<0)
+
+// Mob transformation signals
+///Called when a human turns into a monkey, from /mob/living/carbon/proc/finish_monkeyize()
+#define COMSIG_HUMAN_MONKEYIZE "human_monkeyize"
+///Called when a monkey turns into a human, from /mob/living/carbon/proc/finish_humanize(species)
+#define COMSIG_MONKEY_HUMANIZE "monkey_humanize"
+
+///From mob/living/carbon/human/suicide()
+#define COMSIG_HUMAN_SUICIDE_ACT "human_suicide_act"
+
+/// A mob has just equipped an item. Called on [/mob] from base of [/obj/item/equipped()]: (/obj/item/equipped_item, slot)
+#define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item"
+/// A mob has just unequipped an item.
+#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item"
diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm
new file mode 100644
index 000000000000..e5c27a902a65
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_mod.dm
@@ -0,0 +1,25 @@
+//MODsuit signals
+/// Called when a module is selected to be the active one from on_select(obj/item/mod/module/module)
+#define COMSIG_MOD_MODULE_SELECTED "mod_module_selected"
+/// Called when a MOD activation is called from toggle_activate(mob/user)
+#define COMSIG_MOD_ACTIVATE "mod_activate"
+ /// Cancels the suit's activation
+ #define MOD_CANCEL_ACTIVATE (1 << 0)
+/// Called when a MOD is having modules removed from crowbar_act(mob/user, obj/crowbar)
+#define COMSIG_MOD_MODULE_REMOVAL "mod_module_removal"
+ /// Cancels the removal of modules
+ #define MOD_CANCEL_REMOVAL (1 << 0)
+/// Called when a module attempts to activate, however it does. At the end of checks so you can add some yourself, or work on trigger behavior (mob/user)
+#define COMSIG_MODULE_TRIGGERED "mod_module_triggered"
+ // Cancels activation, with no message. include feedback on your cancel.
+ #define MOD_ABORT_USE (1<<0)
+/// Called when a module activates, after all checks have passed and cooldown started.
+#define COMSIG_MODULE_ACTIVATED "mod_module_activated"
+/// Called when a module deactivates, after all checks have passed.
+#define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated"
+/// Called when a module is used, after all checks have passed and cooldown started.
+#define COMSIG_MODULE_USED "mod_module_used"
+/// Called when the MODsuit wearer is set.
+#define COMSIG_MOD_WEARER_SET "mod_wearer_set"
+/// Called when the MODsuit wearer is unset.
+#define COMSIG_MOD_WEARER_UNSET "mod_wearer_unset"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_clothing.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_clothing.dm
new file mode 100644
index 000000000000..6eb107d55fda
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_clothing.dm
@@ -0,0 +1,10 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/item/clothing signals
+
+//from base of obj/item/clothing/shoes/proc/step_action(): ()
+#define COMSIG_SHOES_STEP_ACTION "shoes_step_action"
+//from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
+#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm
new file mode 100644
index 000000000000..831363f5a523
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_food.dm
@@ -0,0 +1,22 @@
+// Eating stuff
+/// From datum/component/edible/proc/TakeBite: (mob/living/eater, mob/feeder, bitecount, bitesize)
+#define COMSIG_FOOD_EATEN "food_eaten"
+/// From base of Component/edible/On_Consume: (mob/living/eater, mob/living/feeder)
+#define COMSIG_FOOD_CONSUMED "food_consumed"
+
+// Deep frying foods
+/// An item becomes fried - From /datum/element/fried_item/Attach: (fry_time)
+#define COMSIG_ITEM_FRIED "item_fried"
+ #define COMSIG_FRYING_HANDLED (1<<0)
+
+// Microwaving foods
+///called on item when microwaved (): (obj/machinery/microwave/M)
+#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
+ #define COMPONENT_SUCCESFUL_MICROWAVE (1<<0)
+///called on item when created through microwaving (): (obj/machinery/microwave/M, cooking_efficiency)
+#define COMSIG_ITEM_MICROWAVE_COOKED "microwave_cooked"
+
+///From /datum/component/edible/on_compost(source, /mob/living/user)
+#define COMSIG_EDIBLE_ON_COMPOST "on_compost"
+ // Used to stop food from being composted.
+ #define COMPONENT_EDIBLE_BLOCK_COMPOST 1
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_grenade.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_grenade.dm
new file mode 100644
index 000000000000..03767ecbc53f
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_grenade.dm
@@ -0,0 +1,11 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/item/grenade signals
+
+//called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_GRENADE_PRIME "grenade_prime"
+
+//called in /obj/item/gun/process_fire (user, target, params, zone_override)
+#define COMSIG_GRENADE_ARMED "grenade_armed"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_implant.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_implant.dm
new file mode 100644
index 000000000000..95123ef8b309
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_implant.dm
@@ -0,0 +1,14 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/item/implant signals
+#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): ()
+#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args)
+ #define COMPONENT_STOP_IMPLANTING 1
+#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
+ //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both
+ #define COMPONENT_DELETE_NEW_IMPLANT 2
+ #define COMPONENT_DELETE_OLD_IMPLANT 4
+#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
+ //This uses all return values of COMSIG_IMPLANT_OTHER
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm
new file mode 100644
index 000000000000..1a562b84a4a1
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm
@@ -0,0 +1,68 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/item signals
+///from base of obj/item/equipped(): (/mob/equipper, slot)
+#define COMSIG_ITEM_EQUIPPED "item_equip"
+///from base of obj/item/dropped(): (mob/user)
+#define COMSIG_ITEM_DROPPED "item_drop"
+///from base of obj/item/pickup(): (/mob/taker)
+#define COMSIG_ITEM_PICKUP "item_pickup"
+
+///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
+#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone"
+///from base of obj/item/hit_reaction(): (list/args)
+#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args)
+ #define COMPONENT_HIT_REACTION_BLOCK (1<<0)
+
+#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
+#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob)
+ #define COMPONENT_NO_INTERACT 1
+#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob)
+ #define COMPONENT_NO_ATTACK_OBJ 1
+#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
+ #define COMPONENT_NO_ATTACK 1
+#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
+#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
+#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
+ #define COMPONENT_BLOCK_MARK_RETRIEVAL 1
+#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed)
+
+///from base of item/sharpener/attackby(): (amount, max)
+#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
+ #define COMPONENT_BLOCK_SHARPEN_APPLIED 1
+ #define COMPONENT_BLOCK_SHARPEN_BLOCKED 2
+ #define COMPONENT_BLOCK_SHARPEN_ALREADY 4
+ #define COMPONENT_BLOCK_SHARPEN_MAXED 8
+
+#define COMSIG_TOOL_IN_USE "tool_in_use" ///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
+#define COMSIG_TOOL_START_USE "tool_start_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
+#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]:
+#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/item/mine/proc/trigger_mine]:
+///from [/obj/structure/closet/supplypod/proc/endlaunch]:
+#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"
+
+// Item mouse siganls
+#define COMSIG_ITEM_MOUSE_EXIT "item_mouse_exit" //from base of obj/item/MouseExited(): (location, control, params)
+#define COMSIG_ITEM_MOUSE_ENTER "item_mouse_enter" //from base of obj/item/MouseEntered(): (location, control, params)
+
+///Called when an item is being offered, from [/obj/item/proc/on_offered(mob/living/carbon/offerer)]
+#define COMSIG_ITEM_OFFERING "item_offering"
+ ///Interrupts the offer proc
+ #define COMPONENT_OFFER_INTERRUPT (1<<0)
+///Called when an someone tries accepting an offered item, from [/obj/item/proc/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)]
+#define COMSIG_ITEM_OFFER_TAKEN "item_offer_taken"
+ ///Interrupts the offer acceptance
+ #define COMPONENT_OFFER_TAKE_INTERRUPT (1<<0)
+/// sent from obj/effect/attackby(): (/obj/effect/hit_effect, /mob/living/attacker, params)
+#define COMSIG_ITEM_ATTACK_EFFECT "item_effect_attacked"
+
+// /obj/item signals for economy
+#define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem
+#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" //called when a wrapped up structure is opened by hand
+#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" //called when a wrapped up item is opened by hand
+ #define COMSIG_ITEM_SPLIT_VALUE 1
+#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" //Called when getting the item's exact ratio for cargo's profit.
+#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry" //Called when getting the item's exact ratio for cargo's profit, without selling the item.
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_aquarium.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_aquarium.dm
new file mode 100644
index 000000000000..d4c88d7c16b2
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_aquarium.dm
@@ -0,0 +1,7 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// Aquarium related signals
+#define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed"
+#define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_machinery.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_machinery.dm
new file mode 100644
index 000000000000..929a2f844074
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_machinery.dm
@@ -0,0 +1,12 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/machinery signals
+
+///from /obj/machinery/obj_break(damage_flag): (damage_flag)
+#define COMSIG_MACHINERY_BROKEN "machinery_broken"
+///from base power_change() when power is lost
+#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
+///from base power_change() when power is restored
+#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_supermatter.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_supermatter.dm
new file mode 100644
index 000000000000..b4e8abe2b80b
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_machine/signals_supermatter.dm
@@ -0,0 +1,9 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj/machinery/power/supermatter_crystal signals
+/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM delam reaches the point of sounding alarms
+#define COMSIG_SUPERMATTER_DELAM_START_ALARM "sm_delam_start_alarm"
+/// from /obj/machinery/power/supermatter_crystal/process_atmos(); when the SM sounds an audible alarm
+#define COMSIG_SUPERMATTER_DELAM_ALARM "sm_delam_alarm"
diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_object.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_object.dm
new file mode 100644
index 000000000000..136b73ffb3d2
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_obj/signals_object.dm
@@ -0,0 +1,14 @@
+// Format:
+// When the signal is called: (signal arguments)
+// All signals send the source datum of the signal as the first argument
+
+// /obj signals
+
+///from base of obj/deconstruct(): (disassembled)
+#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
+///from base of code/game/machinery
+#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
+///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
+#define COMSIG_OBJ_HIDE "obj_hide"
+/// from base of [/atom/proc/obj_destruction]: (damage_flag)
+#define COMSIG_OBJ_DESTRUCTION "obj_destruction"
diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm
new file mode 100644
index 000000000000..456ac3c0781a
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_storage.dm
@@ -0,0 +1,4 @@
+/// Sent when /datum/storage/dump_content_at(): (obj/item/storage_source, mob/user)
+#define COMSIG_STORAGE_DUMP_CONTENT "storage_dump_contents"
+ /// Return to stop the standard dump behavior.
+ #define STORAGE_DUMP_HANDLED (1<<0)
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index c27a78ffd2de..00093c8ecf72 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -46,6 +46,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define SHOW_BEHIND_LARGE_ICONS_1 (1<<12)
/// Should we use the initial icon for display? Mostly used by overlay only objects
#define HTML_USE_INITAL_ICON_1 (1<<20)
+// Whether or not this atom is storing contents for a disassociated storage object
+#define HAS_DISASSOCIATED_STORAGE_1 (1<<24)
// Update flags for [/atom/proc/update_appearance]
/// Update the atom's name
diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm
index f2b6a8fd196d..a12ceca284dd 100644
--- a/code/__DEFINES/food.dm
+++ b/code/__DEFINES/food.dm
@@ -49,6 +49,16 @@
#define DRINK_FANTASTIC 4
#define FOOD_AMAZING 5
+/// Food is "in a container", not in a code sense, but in a literal sense (canned foods)
#define FOOD_IN_CONTAINER (1<<0)
+/// Finger food can be eaten while walking / running around
+#define FOOD_FINGER_FOOD (1<<1)
#define STOP_SERVING_BREAKFAST (15 MINUTES)
+
+///Amount of reagents you start with on crafted food excluding the used parts
+#define CRAFTED_FOOD_BASE_REAGENT_MODIFIER 0.7
+///Modifier of reagents you get when crafting food from the parts used
+#define CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER 0.5
+
+#define IS_EDIBLE(O) (O.GetComponent(/datum/component/edible))
diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm
index 17cbab5683d8..01cfa1e5bd5c 100644
--- a/code/__DEFINES/guns.dm
+++ b/code/__DEFINES/guns.dm
@@ -24,6 +24,9 @@
///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in.
/// Example: Pistols with a slide lock, some SMGs
#define BOLT_TYPE_LOCKING 4
+///Gun has an HK-style locking charging handle, so you can slap it. Only use this for flavor, otherwise modern-style automatics should use BOLT_TYPE_LOCKING.
+/// Example: everything made by lanchester
+#define BOLT_TYPE_CLIP 5
//Sawn off nerfs
///accuracy penalty of sawn off guns
#define SAWN_OFF_ACC_PENALTY 25
@@ -61,6 +64,7 @@
#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it"
#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'"
#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo"
+#define MANUFACTURER_MINUTEMAN_LASER "the Clover Photonics logo"
#define MANUFACTURER_DONKCO "the Donk! Co. logo"
#define MANUFACTURER_PGF "the Etherbor Industries emblem"
#define MANUFACTURER_IMPORT "Lanchester Import Co."
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 64aa6aa52627..6cad7078b6ec 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -46,6 +46,7 @@
#define HIDEFACIALHAIR (1<<9)
#define HIDENECK (1<<10)
#define HIDEHORNS (1<<11) // Used for hiding Sarathi horns.
+#define HIDESNOUT (1<<11)
//bitflags for clothing coverage - also used for limbs
#define HEAD (1<<0)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 241136c297b9..de8091fca186 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -166,6 +166,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isitem(A) (istype(A, /obj/item))
+#define isstack(A) (istype(A, /obj/item/stack))
+
#define isgrenade(A) (istype(A, /obj/item/grenade))
#define islandmine(A) (istype(A, /obj/item/mine))
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index d021558901f4..bd9b0f0063bb 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -1,5 +1,6 @@
//Defines for atom layers and planes
//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
+#define LOWEST_EVER_PLANE -100
#define CLICKCATCHER_PLANE -99
@@ -21,6 +22,20 @@
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
#define BLACKNESS_PLANE_RENDER_TARGET "BLACKNESS_PLANE"
+#define ABOVE_GAME_PLANE 1
+
+//-------------------- Rendering ---------------------
+#define RENDER_PLANE_GAME 100
+#define RENDER_PLANE_NON_GAME 101
+#define RENDER_PLANE_MASTER 102
+
+// Lummox I swear to god I will find you
+// NOTE! You can only ever have planes greater then -10000, if you add too many with large offsets you will brick multiz
+// Same can be said for large multiz maps. Tread carefully mappers
+#define HIGHEST_EVER_PLANE RENDER_PLANE_MASTER
+/// The range unique planes can be in
+#define PLANE_RANGE (HIGHEST_EVER_PLANE - LOWEST_EVER_PLANE)
+
#define SPACE_LAYER 1.8
//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
#define MID_TURF_LAYER 2.02
diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm
index 719f06f2a812..a442ddb464b8 100644
--- a/code/__DEFINES/maths.dm
+++ b/code/__DEFINES/maths.dm
@@ -290,3 +290,11 @@
/// Like SPT_PROB_RATE but easier to use, simply put `if(SPT_PROB(10, 5))`
#define SPT_PROB(prob_per_second_percent, seconds_per_tick) (prob(100*SPT_PROB_RATE((prob_per_second_percent)/100, (seconds_per_tick))))
+
+/// Converts a probability/second chance to probability/delta_time chance
+/// For example, if you want an event to happen with a 10% per second chance, but your proc only runs every 5 seconds, do `if(prob(100*DT_PROB_RATE(0.1, 5)))`
+#define DT_PROB_RATE(prob_per_second, delta_time) (1 - (1 - (prob_per_second)) ** (delta_time))
+
+/// Like DT_PROB_RATE but easier to use, simply put `if(DT_PROB(10, 5))`
+#define DT_PROB(prob_per_second_percent, delta_time) (prob(100*DT_PROB_RATE((prob_per_second_percent)/100, (delta_time))))
+// )
diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm
new file mode 100644
index 000000000000..29a450eceb91
--- /dev/null
+++ b/code/__DEFINES/mod.dm
@@ -0,0 +1,40 @@
+/// Default value for the max_complexity var on MODsuits
+#define DEFAULT_MAX_COMPLEXITY 15
+
+/// Default cell drain per process on MODsuits
+#define DEFAULT_CHARGE_DRAIN 0.09
+
+/// Default time for a part to seal
+#define MOD_ACTIVATION_STEP_TIME (2 SECONDS)
+
+/// Passive module, just acts when put in naturally.
+#define MODULE_PASSIVE 0
+/// Usable module, does something when you press a button.
+#define MODULE_USABLE 1
+/// Toggle module, you turn it on/off and it does stuff.
+#define MODULE_TOGGLE 2
+/// Actively usable module, you may only have one selected at a time.
+#define MODULE_ACTIVE 3
+
+//Defines used by the theme for clothing flags and similar
+#define CONTROL_LAYER "control_layer"
+#define HELMET_FLAGS "helmet_flags"
+#define CHESTPLATE_FLAGS "chestplate_flags"
+#define GAUNTLETS_FLAGS "gauntlets_flags"
+#define BOOTS_FLAGS "boots_flags"
+
+#define UNSEALED_LAYER "unsealed_layer"
+#define UNSEALED_CLOTHING "unsealed_clothing"
+#define SEALED_CLOTHING "sealed_clothing"
+#define UNSEALED_INVISIBILITY "unsealed_invisibility"
+#define SEALED_INVISIBILITY "sealed_invisibility"
+#define UNSEALED_COVER "unsealed_cover"
+#define SEALED_COVER "sealed_cover"
+#define CAN_OVERSLOT "can_overslot"
+
+//Defines used to override MOD clothing's icon and worn icon files in the skin.
+#define MOD_ICON_OVERRIDE "mod_icon_override"
+#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override"
+
+/// Global list of all /datum/mod_theme
+GLOBAL_LIST_INIT(mod_themes, setup_mod_themes())
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index d9ca63008c1d..387f87c90acc 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -52,6 +52,7 @@
#define ANTI_TINFOIL_MANEUVER (1<<12) //Hats with negative effects when worn (i.e the tinfoil hat).
#define DANGEROUS_OBJECT (1<<13) //Clothes that cause a larger notification when placed on a person.
#define FAST_EMBARK (1<<14) //Clothes that speed up mech and pod boarding.
+#define SEALS_EYES (1<<15) //Goggles and helmets that seal eyes from the enviroment
/// Flags for the organ_flags var on /obj/item/organ
#define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal
diff --git a/code/__DEFINES/processing.dm b/code/__DEFINES/processing.dm
new file mode 100644
index 000000000000..905c03830d51
--- /dev/null
+++ b/code/__DEFINES/processing.dm
@@ -0,0 +1,3 @@
+#define TOOL_PROCESSING_RESULT "result"
+#define TOOL_PROCESSING_AMOUNT "amount"
+#define TOOL_PROCESSING_TIME "time"
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 1bd23038c600..285e7ce5ff80 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -174,4 +174,36 @@
#define SOUND_AREA_ICEMOON SOUND_ENVIRONMENT_CAVE
#define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY
+/// List of all of our sound keys.
+#define SFX_BODYFALL "bodyfall"
+#define SFX_BULLET_MISS "bullet_miss"
+#define SFX_CAN_OPEN "can_open"
+#define SFX_CLOWN_STEP "clown_step"
+#define SFX_DESECRATION "desecration"
+#define SFX_EXPLOSION "explosion"
+#define SFX_EXPLOSION_CREAKING "explosion_creaking"
+#define SFX_HISS "hiss"
+#define SFX_HONKBOT_E "honkbot_e"
+#define SFX_HULL_CREAKING "hull_creaking"
+#define SFX_HYPERTORUS_CALM "hypertorus_calm"
+#define SFX_HYPERTORUS_MELTING "hypertorus_melting"
+#define SFX_IM_HERE "im_here"
+#define SFX_LAW "law"
+#define SFX_PAGE_TURN "page_turn"
+#define SFX_PUNCH "punch"
+#define SFX_REVOLVER_SPIN "revolver_spin"
+#define SFX_RICOCHET "ricochet"
+#define SFX_RUSTLE "rustle"
+#define SFX_SHATTER "shatter"
+#define SFX_SM_CALM "sm_calm"
+#define SFX_SM_DELAM "sm_delam"
+#define SFX_SPARKS "sparks"
+#define SFX_SUIT_STEP "suit_step"
+#define SFX_SWING_HIT "swing_hit"
+#define SFX_TERMINAL_TYPE "terminal_type"
+#define SFX_WARPSPEED "warpspeed"
+#define SFX_CRUNCHY_BUSH_WHACK "crunchy_bush_whack"
+#define SFX_TREE_CHOP "tree_chop"
+#define SFX_ROCK_TAP "rock_tap"
+
#define SOUND_EMPTY_MAG 'sound/weapons/empty.ogg'
diff --git a/code/__DEFINES/species_clothing_defines.dm b/code/__DEFINES/species_clothing_defines.dm
index 517579192634..937adf6b7cdd 100644
--- a/code/__DEFINES/species_clothing_defines.dm
+++ b/code/__DEFINES/species_clothing_defines.dm
@@ -22,6 +22,7 @@
#define VOX_SUIT_PATH 'icons/mob/species/vox/onmob_suit_vox.dmi'
#define VOX_EARS_PATH 'icons/mob/species/vox/onmob_ears_vox.dmi'
#define VOX_MASK_PATH 'icons/mob/species/vox/onmob_mask_vox.dmi'
+#define VOX_NECK_PATH 'icons/mob/species/vox/onmob_neck_vox.dmi'
#define VOX_HEAD_PATH 'icons/mob/species/vox/onmob_head_vox.dmi'
#define VOX_GLOVES_PATH 'icons/mob/species/vox/onmob_hands_vox.dmi'
#define VOX_GLASSES_PATH 'icons/mob/species/vox/onmob_eyes_vox.dmi'
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index d1fbf26616d5..68913e3925fd 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -99,6 +99,14 @@
#define STATUS_EFFECT_METAB_FROZEN /datum/status_effect/metab_frozen // Affected cannot process chems
+//Incapacitated status effect flags
+/// If the incapacitated status effect will ignore a mob in restraints (handcuffs)
+#define IGNORE_RESTRAINTS (1<<0)
+/// If the incapacitated status effect will ignore a mob in stasis (stasis beds)
+#define IGNORE_STASIS (1<<1)
+/// If the incapacitated status effect will ignore a mob being agressively grabbed
+#define IGNORE_GRAB (1<<2)
+
/////////////
// NEUTRAL //
/////////////
diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
index 320648170b44..35860ac927f4 100644
--- a/code/__DEFINES/tools.dm
+++ b/code/__DEFINES/tools.dm
@@ -14,6 +14,7 @@
#define TOOL_DRILL "drill"
#define TOOL_SCALPEL "scalpel"
#define TOOL_SAW "saw"
+#define TOOL_KNIFE "knife" //luv me kuh-nyfe
// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY,
// tool sound is only played when op is started. If not, it's played twice.
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index f88f0c9d791c..7b687330d71a 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -173,13 +173,20 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_RESISTCOLD "resist_cold"
#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure"
#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure"
+#define TRAIT_METALLIC "metallic" //used on IPCs
#define TRAIT_BOMBIMMUNE "bomb_immunity"
#define TRAIT_RADIMMUNE "rad_immunity"
#define TRAIT_GENELESS "geneless"
#define TRAIT_VIRUSIMMUNE "virus_immunity"
#define TRAIT_PIERCEIMMUNE "pierce_immunity"
#define TRAIT_NODISMEMBER "dismember_immunity"
+#define TRAIT_LAVA_IMMUNE "lava_immunity"
+#define TRAIT_SNOWSTORM_IMMUNE "snow_immunity"
+#define TRAIT_ASHSTORM_IMMUNE "ash_immunity"
+#define TRAIT_SANDSTORM_IMMUNE "sand_immunity"
#define TRAIT_NOFIRE "nonflammable"
+/// Prevents plasmamen from self-igniting if only their helmet is missing
+#define TRAIT_NOSELFIGNITION_HEAD_ONLY "no_selfignition_head_only"
#define TRAIT_NOGUNS "no_guns"
#define TRAIT_NOHUNGER "no_hunger"
#define TRAIT_NOMETABOLISM "no_metabolism"
@@ -215,6 +222,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NOMOBSWAP "no-mob-swap"
#define TRAIT_XRAY_VISION "xray_vision"
#define TRAIT_THERMAL_VISION "thermal_vision"
+/// Like antimagic, but doesn't block the user from casting
+#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock"
/// We have some form of forced gravity acting on us
#define TRAIT_FORCED_GRAVITY "forced_gravity"
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
@@ -248,6 +257,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_GAMERGOD "gamer-god" //double arcade prizes
#define TRAIT_GIANT "giant"
#define TRAIT_DWARF "dwarf"
+#define TRAIT_FASTMED "fast_med_use"
#define TRAIT_SILENT_FOOTSTEPS "silent_footsteps" //makes your footsteps completely silent
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good....
/// The holder of this trait has antennae or whatever that hurt a ton when noogied
@@ -279,6 +289,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_AREA_SENSITIVE "area-sensitive"
///Used for managing KEEP_TOGETHER in [/atom/var/appearance_flags]
+///every object that is currently the active storage of some client mob has this trait
+#define TRAIT_ACTIVE_STORAGE "active_storage"
+
#define TRAIT_KEEP_TOGETHER "keep-together"
// item traits
@@ -362,6 +375,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define LYING_DOWN_TRAIT "lying-down"
/// Trait associated to lacking electrical power.
#define POWER_LACK_TRAIT "power-lack"
+/// Trait applied by MODsuits.
+#define MOD_TRAIT "mod"
// unique trait sources, still defines
#define CLONING_POD_TRAIT "cloning-pod"
@@ -435,6 +450,31 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define BEAUTY_ELEMENT_TRAIT "beauty_element"
#define MOOD_COMPONENT_TRAIT "mood_component"
+// 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)
+// BUT FOR NOW, THESE ARE HOOKED TO DO update_mobility() VIA COMSIG IN living_mobility.dm
+// SO IF YOU ADD MORE, BESURE TO UPDATE IT THERE.
+
+/// Disallow movement
+#define TRAIT_MOBILITY_NOMOVE "mobility_nomove"
+/// Disallow pickup
+#define TRAIT_MOBILITY_NOPICKUP "mobility_nopickup"
+/// Disallow item use
+#define TRAIT_MOBILITY_NOUSE "mobility_nouse"
+///Disallow resting/unresting
+#define TRAIT_MOBILITY_NOREST "mobility_norest"
+
+#define TRAIT_FORCED_STANDING "forcedstanding"
+
+///Movement type traits for movables. See elements/movetype_handler.dm
+#define TRAIT_MOVE_GROUND "move_ground"
+#define TRAIT_MOVE_FLYING "move_flying"
+#define TRAIT_MOVE_VENTCRAWLING "move_ventcrawling"
+#define TRAIT_MOVE_FLOATING "move_floating"
+#define TRAIT_MOVE_PHASING "move_phasing"
+/// Disables the floating animation. See above.
+#define TRAIT_NO_FLOATING_ANIM "no-floating-animation"
+
/// Trait granted by [mob/living/silicon/ai]
/// Applied when the ai anchors itself
#define AI_ANCHOR_TRAIT "ai_anchor"
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index f603e85292ad..435b83e29797 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -109,13 +109,25 @@
return "[output][and_text][input[index]]"
-//Checks for specific types in a list
-/proc/is_type_in_list(atom/A, list/L)
- if(!LAZYLEN(L) || !A)
+/**
+ * Checks for specific types in a list.
+ *
+ * If using zebra mode the list should be an assoc list with truthy/falsey values.
+ * The check short circuits so earlier entries in the input list will take priority.
+ * Ergo, subtypes should come before parent types.
+ * Notice that this is the opposite priority of [/proc/typecacheof].
+ *
+ * Arguments:
+ * - [type_to_check][/datum]: An instance to check.
+ * - [list_to_check][/list]: A list of typepaths to check the type_to_check against.
+ * - zebra: Whether to use the value of the matching type in the list instead of just returning true when a match is found.
+ */
+/proc/is_type_in_list(datum/type_to_check, list/list_to_check, zebra = FALSE)
+ if(!LAZYLEN(list_to_check) || !type_to_check)
return FALSE
- for(var/type in L)
- if(istype(A, type))
- return TRUE
+ for(var/type in list_to_check)
+ if(istype(type_to_check, type))
+ return !zebra || list_to_check[type] // Subtypes must come first in zebra lists.
return FALSE
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm
new file mode 100644
index 000000000000..d8306c356d4c
--- /dev/null
+++ b/code/__HELPERS/_planes.dm
@@ -0,0 +1,80 @@
+// This file contains helper macros for plane operations
+// See the planes section of Visuals.md for more detail, but essentially
+// When we render multiz, we do it by placing all atoms on lower levels on well, lower planes
+// This is done with stacks of plane masters (things we use to apply effects to planes)
+// These macros exist to facilitate working with this system, and other associated small bits
+
+/// Takes an atom to change the plane of, a new plane value, and something that can be used as a reference to a z level as input
+/// Modifies the new value to match the plane we actually want. Note, if you pass in an already offset plane the offsets will add up
+/// Use PLANE_TO_TRUE() to avoid this
+#define SET_PLANE(thing, new_value, z_reference) (thing.plane = MUTATE_PLANE(new_value, z_reference))
+
+/// Takes a plane and a z reference, and offsets the plane by the mutation
+/// The SSmapping.max_plane_offset bit here is technically redundant, but saves a bit of work in the base case
+/// And the base case is important to me. Non multiz shouldn't get hit too bad by this code
+#define MUTATE_PLANE(new_value, z_reference) ((SSmapping.max_plane_offset) ? GET_NEW_PLANE(new_value, GET_TURF_PLANE_OFFSET(z_reference)) : (new_value))
+
+/// Takes a z reference that we are unsure of, sanity checks it
+/// Returns either its offset, or 0 if it's not a valid ref
+#define GET_TURF_PLANE_OFFSET(z_reference) ((SSmapping.max_plane_offset && isatom(z_reference)) ? GET_Z_PLANE_OFFSET(z_reference.z) : 0)
+/// Essentially just an unsafe version of GET_TURF_PLANE_OFFSET()
+/// Takes a z value we returns its offset with a list lookup
+/// Will runtime during parts of init. Be careful :)
+#define GET_Z_PLANE_OFFSET(z) (SSmapping.z_level_to_plane_offset[z])
+
+/// Takes a plane to offset, and the multiplier to use, and well, does the offsetting
+/// Respects a blacklist we use to remove redundant plane masters, such as hud objects
+#define GET_NEW_PLANE(new_value, multiplier) (SSmapping.plane_offset_blacklist?["[new_value]"] ? new_value : (new_value) - (PLANE_RANGE * (multiplier)))
+
+// Now for the more niche things
+
+/// Takes an object, new plane, and multipler, and offsets the plane
+/// This is for cases where you have a multipler precalculated, and just want to use it
+/// Often an optimization, sometimes a necessity
+#define SET_PLANE_W_SCALAR(thing, new_value, multiplier) (thing.plane = GET_NEW_PLANE(new_value, multiplier))
+
+
+/// Implicit plane set. We take the turf from the object we're changing the plane of, and use ITS z as a spokesperson for our plane value
+#define SET_PLANE_IMPLICIT(thing, new_value) SET_PLANE_EXPLICIT(thing, new_value, thing)
+
+// This is an unrolled and optimized version of SET_PLANE, for use anywhere where you are unsure of a source's "turfness"
+// The plane is cached to allow for fancy stuff to be eval'd once, rather then often
+#define SET_PLANE_EXPLICIT(thing, new_value, source) \
+ do {\
+ if(SSmapping.max_plane_offset) {\
+ var/_cached_plane = new_value;\
+ var/turf/_our_turf = get_turf(source);\
+ if(_our_turf){\
+ thing.plane = GET_NEW_PLANE(_cached_plane, GET_Z_PLANE_OFFSET(_our_turf.z));\
+ }\
+ }\
+ else {\
+ thing.plane = new_value;\
+ }\
+ }\
+ while (FALSE)
+
+// Now for macros that exist to get info from SSmapping
+// Mostly about details of planes, or z levels
+
+/// Takes a z level, gets the lowest plane offset in its "stack"
+#define GET_LOWEST_STACK_OFFSET(z) ((SSmapping.max_plane_offset) ? SSmapping.z_level_to_lowest_plane_offset[z] : 0)
+/// Takes a plane, returns the canonical, unoffset plane it represents
+#define PLANE_TO_TRUE(plane) ((SSmapping.plane_offset_to_true) ? SSmapping.plane_offset_to_true["[plane]"] : plane)
+/// Takes a plane, returns the offset it uses
+#define PLANE_TO_OFFSET(plane) ((SSmapping.plane_to_offset) ? SSmapping.plane_to_offset["[plane]"] : plane)
+/// Takes a plane, returns TRUE if it is of critical priority, FALSE otherwise
+#define PLANE_IS_CRITICAL(plane) ((SSmapping.plane_to_offset) ? !!SSmapping.critical_planes["[plane]"] : FALSE)
+/// Takes a true plane, returns the offset planes that would canonically represent it
+#define TRUE_PLANE_TO_OFFSETS(plane) ((SSmapping.true_to_offset_planes) ? SSmapping.true_to_offset_planes["[plane]"] : list(plane))
+/// Takes a render target and an offset, returns a canonical render target string for it
+#define OFFSET_RENDER_TARGET(render_target, offset) (_OFFSET_RENDER_TARGET(render_target, SSmapping.render_offset_blacklist?["[render_target]"] ? 0 : offset))
+/// Helper macro for the above
+/// Honestly just exists to make the pattern of render target strings more readable
+#define _OFFSET_RENDER_TARGET(render_target, offset) ("[(render_target)] #[(offset)]")
+
+// Known issues:
+// Potentially too much client load? Hard to tell due to not having a potato pc to hand.
+// This is solvable with lowspec preferences, which would not be hard to implement
+// Player popups will now render their effects, like overlay lights. this is fixable, but I've not gotten to it
+// I think overlay lights can render on the wrong z layer. s fucked
diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm
new file mode 100644
index 000000000000..dbb42122ff45
--- /dev/null
+++ b/code/__HELPERS/atoms.dm
@@ -0,0 +1,9 @@
+///Returns the src and all recursive contents as a list.
+/atom/proc/get_all_contents(ignore_flag_1)
+ . = list(src)
+ var/i = 0
+ while(i < length(.))
+ var/atom/checked_atom = .[++i]
+ if(checked_atom.flags_1 & ignore_flag_1)
+ continue
+ . += checked_atom.contents
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index e7af7f31884d..34cacd872d42 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -596,3 +596,31 @@ block( \
continue
C.energy_fail(rand(duration_min,duration_max))
+
+///Returns a list of turfs around a center based on RANGE_TURFS()
+/proc/circle_range_turfs(center = usr, radius = 3)
+
+ var/turf/center_turf = get_turf(center)
+ var/list/turfs = new/list()
+ var/rsq = radius * (radius + 0.5)
+
+ for(var/turf/checked_turf as anything in RANGE_TURFS(radius, center_turf))
+ var/dx = checked_turf.x - center_turf.x
+ var/dy = checked_turf.y - center_turf.y
+ if(dx * dx + dy * dy <= rsq)
+ turfs += checked_turf
+ return turfs
+
+///Returns a list of turfs around a center based on view()
+/proc/circle_view_turfs(center=usr,radius=3) //Is there even a diffrence between this proc and circle_range_turfs()?
+
+ var/turf/center_turf = get_turf(center)
+ var/list/turfs = new/list()
+ var/rsq = radius * (radius + 0.5)
+
+ for(var/turf/checked_turf in view(radius, center_turf))
+ var/dx = checked_turf.x - center_turf.x
+ var/dy = checked_turf.y - center_turf.y
+ if(dx * dx + dy * dy <= rsq)
+ turfs += checked_turf
+ return turfs
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
new file mode 100644
index 000000000000..983ecc800274
--- /dev/null
+++ b/code/__HELPERS/maths.dm
@@ -0,0 +1,13 @@
+///Calculate the angle between two movables and the west|east coordinate
+/proc/get_angle(atom/movable/start, atom/movable/end)//For beams.
+ if(!start || !end)
+ return 0
+ var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y)
+ var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x)
+ if(!dy)
+ return (dx >= 0) ? 90 : 270
+ . = arctan(dx/dy)
+ if(dy < 0)
+ . += 180
+ else if(dx < 0)
+ . += 360
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 6a3028443dcc..ae5a1c1ce929 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -257,7 +257,19 @@ GLOBAL_LIST_EMPTY(species_list)
return ..()
/**
- * Timed action involving one mob user. A target can also be specified, but it is optional.
+ * Used to get the amount of change between two body temperatures
+ *
+ * When passed the difference between two temperatures returns the amount of change to temperature to apply.
+ * The change rate should be kept at a low value tween 0.16 and 0.02 for optimal results.
+ * vars:
+ * * temp_diff (required) The differance between two temperatures
+ * * change_rate (optional)(Default: 0.06) The rate of range multiplyer
+ */
+/proc/get_temp_change_amount(temp_diff, change_rate = 0.06)
+ if(temp_diff < 0)
+ return -(BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 - (temp_diff * change_rate))
+
+/* Timed action involving one mob user. A target can also be specified, but it is optional.
*
* Checks that `user` does not move, change hands, get stunned, etc. for the
* given `delay`. Returns `TRUE` on success or `FALSE` on failure.
diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm
index 65ea832c0e0b..fb02a93e144d 100644
--- a/code/__HELPERS/priority_announce.dm
+++ b/code/__HELPERS/priority_announce.dm
@@ -1,4 +1,4 @@
-/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type, sender_override, auth_id, zlevel) //WS Edit - Make cap's announcement use logged-in name
+/proc/priority_announce(text, title = "", sound = 'sound/ai/attention.ogg', type, sender_override, auth_id, zlevel)
if(!text)
return
@@ -73,3 +73,9 @@
to_chat(M, "[title] [message] [from ? "-[from.name] ([from.job])" : null]")
if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)
SEND_SOUND(M, S)
+
+/proc/create_distress_beacon(datum/overmap/ship/ship)
+ if(!ship)
+ return
+ var/text = "A distress beacon has been launched by [ship.name], at local sector co-ordinates [ship.x || ship.docked_to.x]/[ship.y || ship.docked_to.y]. No further information available."
+ priority_announce(text, null, 'sound/effects/alert.ogg', sender_override = "Outpost Distress Beacon System", zlevel = 0)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index c8c7b63d0a09..36764c6bae9f 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1420,10 +1420,15 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
REMOVE_TRAIT(the_atom2,trait,source)
/proc/get_random_food()
- var/list/blocked = list(/obj/item/reagent_containers/food/snacks/store/bread,
- /obj/item/reagent_containers/food/snacks/breadslice,
- /obj/item/reagent_containers/food/snacks/store/cake,
- /obj/item/reagent_containers/food/snacks/cakeslice,
+ var/static/list/allowed_food = list()
+
+ if(!LAZYLEN(allowed_food)) //it's static so we only ever do this once
+ var/list/blocked = list(
+ /obj/item/food/spaghetti,
+ /obj/item/food/bread,
+ /obj/item/food/breadslice,
+ /obj/item/food/cake,
+ /obj/item/food/cakeslice,
/obj/item/reagent_containers/food/snacks/store,
/obj/item/reagent_containers/food/snacks/pie,
/obj/item/reagent_containers/food/snacks/kebab,
@@ -1435,15 +1440,21 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
- /obj/item/reagent_containers/food/snacks/deepfryholder,
+ /obj/item/food/deepfryholder,
/obj/item/reagent_containers/food/snacks/clothing,
/obj/item/reagent_containers/food/snacks/grown/shell, //base types
- /obj/item/reagent_containers/food/snacks/store/bread,
+ /obj/item/food/bread,
/obj/item/reagent_containers/food/snacks/grown/nettle
)
- blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
+ blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
- return pick(subtypesof(/obj/item/reagent_containers/food/snacks) - blocked)
+ var/list/unfiltered_allowed_food = subtypesof(/obj/item/food) - blocked
+ for(var/obj/item/food/food as anything in unfiltered_allowed_food)
+ if(!initial(food.icon_state)) //food with no icon_state should probably not be spawned
+ continue
+ allowed_food.Add(food)
+
+ return pick(allowed_food)
/proc/get_random_drink()
var/list/blocked = list(/obj/item/reagent_containers/food/drinks/soda_cans,
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 5f5c26731d15..a155e570df4f 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -44,6 +44,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD,
"TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE,
"TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE,
+ "TRAIT_METALLIC" = TRAIT_METALLIC,
"TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE,
"TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE,
"TRAIT_GENELESS" = TRAIT_GENELESS,
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index fb2bac175034..6cd9aa8a0849 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -56,10 +56,16 @@
if(id && usr.client) //try to (un)remember position
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
return TRUE
+ var/trigger_flags
+ if(LAZYACCESS(modifiers, ALT_CLICK))
+ if(locked)
+ to_chat(usr, "Action button \"[name]\" is locked, unlock it first.")
+ return TRUE
+ trigger_flags |= TRIGGER_SECONDARY_ACTION
if(usr.next_click > world.time)
return
usr.next_click = world.time + 1
- linked_action.Trigger()
+ linked_action.Trigger(trigger_flags)
return TRUE
//Hide/Show Action Buttons ... Button
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 43ae8ffbe246..bdbe8d1ac376 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -587,6 +587,29 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the
desc = "Your blood's electric charge is becoming dangerously high, find an outlet for your energy. Use Grab Intent on an APC to channel your energy into it."
icon_state = "ethereal_overcharge"
+//MODsuit unique
+/atom/movable/screen/alert/nocore
+ name = "Missing Core"
+ desc = "Unit has no core. No modules available until a core is reinstalled. Robotics may provide assistance."
+ icon_state = "no_cell"
+
+/atom/movable/screen/alert/emptycell/plasma
+ name = "Out of Power"
+ desc = "Unit's plasma core has no charge remaining. No modules available until plasma core is recharged. \
+ Unit can be refilled through plasma fuel."
+
+/atom/movable/screen/alert/emptycell/plasma/update_desc()
+ . = ..()
+ desc = initial(desc)
+
+/atom/movable/screen/alert/lowcell/plasma
+ name = "Low Charge"
+ desc = "Unit's plasma core is running low. Unit can be refilled through plasma fuel."
+
+/atom/movable/screen/alert/lowcell/plasma/update_desc()
+ . = ..()
+ desc = initial(desc)
+
//Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg
/atom/movable/screen/alert/hacked
name = "Hacked"
@@ -625,11 +648,11 @@ so as to remain in compliance with the most up-to-date laws."
if(T)
AI.eyeobj.setLoc(T)
-//MECHS
+//EXOSUITS
/atom/movable/screen/alert/low_mech_integrity
- name = "Mech Damaged"
- desc = "Mech integrity is low."
+ name = "Exosuit Damaged"
+ desc = "Exosuit integrity is low."
icon_state = "low_mech_integrity"
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 03720e4d641f..a8f905e5fe25 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -42,6 +42,28 @@ SUBSYSTEM_DEF(mapping)
/// Translation of virtual level ID to a virtual level reference
var/list/virtual_z_translation = list()
+ /// List of z level (as number) -> plane offset of that z level
+ /// Used to maintain the plane cube
+ var/list/z_level_to_plane_offset = list()
+ /// List of z level (as number) -> The lowest plane offset in that z stack
+ var/list/z_level_to_lowest_plane_offset = list()
+ // This pair allows for easy conversion between an offset plane, and its true representation
+ // Both are in the form "input plane" -> output plane(s)
+ /// Assoc list of string plane values to their true, non offset representation
+ var/list/plane_offset_to_true
+ /// Assoc list of true string plane values to a list of all potential offset planess
+ var/list/true_to_offset_planes
+ /// Assoc list of string plane to the plane's offset value
+ var/list/plane_to_offset
+ /// List of planes that do not allow for offsetting
+ var/list/plane_offset_blacklist
+ /// List of render targets that do not allow for offsetting
+ var/list/render_offset_blacklist
+ /// List of plane masters that are of critical priority
+ var/list/critical_planes
+ /// The largest plane offset we've generated so far
+ var/max_plane_offset = 0
+
/datum/controller/subsystem/mapping/Initialize(timeofday)
if(initialized)
return
diff --git a/code/datums/action.dm b/code/datums/action.dm
index cdca8729984f..e8d0ea303888 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -1,8 +1,3 @@
-#define AB_CHECK_HANDS_BLOCKED (1<<0)
-#define AB_CHECK_IMMOBILE (1<<1)
-#define AB_CHECK_LYING (1<<2)
-#define AB_CHECK_CONSCIOUS (1<<3)
-
/datum/action
var/name = "Generic Action"
var/desc = null
@@ -91,7 +86,7 @@
button.locked = FALSE
button.id = null
-/datum/action/proc/Trigger()
+/datum/action/proc/Trigger(trigger_flags)
if(!IsAvailable())
return FALSE
if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER)
diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm
deleted file mode 100644
index b65a2d8b7e32..000000000000
--- a/code/datums/components/edible.dm
+++ /dev/null
@@ -1,259 +0,0 @@
-/*!
-
-This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
-These items take a specific time to eat, and can do most of the things our original food items could.
-
-Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
- Components:
- Drying component (jerky etc)
- Customizable component (custom pizzas etc)
- Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
- Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents)
-
- Misc:
- Something for cakes (You can store things inside)
-
-*/
-/datum/component/edible
- ///Amount of reagents taken per bite
- var/bite_consumption = 2
- ///Amount of bites taken so far
- var/bitecount = 0
- ///Flags for food
- var/food_flags = NONE
- ///Bitfield of the types of this food
- var/foodtypes = NONE
- ///Amount of seconds it takes to eat this food
- var/eat_time = 30
- ///Defines how much it lowers someones satiety (Need to eat, essentialy)
- var/junkiness = 0
- ///Message to send when eating
- var/list/eatverbs
- ///Callback to be ran for when you take a bite of something
- var/datum/callback/after_eat
- ///Last time we checked for food likes
- var/last_check_time
- ///Color we use when stuffed in things
- var/filling_color = "#FFFFFF"
-
-/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, filling_color = "#FFFFFF", datum/callback/after_eat)
- if(!isatom(parent))
- return COMPONENT_INCOMPATIBLE
-
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal))
- if(isitem(parent))
- RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(UseFromHand))
- else if(isturf(parent))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(TryToEatTurf))
-
- src.bite_consumption = bite_consumption
- src.food_flags = food_flags
- src.foodtypes = foodtypes
- src.eat_time = eat_time
- src.eatverbs = eatverbs
- src.junkiness = junkiness
- src.after_eat = after_eat
- src.filling_color = filling_color
-
- var/atom/owner = parent
-
- owner.create_reagents(volume, INJECTABLE)
-
- if(initial_reagents)
- for(var/rid in initial_reagents)
- var/amount = initial_reagents[rid]
- if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
- owner.reagents.add_reagent(rid, amount, tastes.Copy())
- else
- owner.reagents.add_reagent(rid, amount)
-
-/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
- SIGNAL_HANDLER
-
- if(!(food_flags & FOOD_IN_CONTAINER))
- switch (bitecount)
- if (0)
- return
- if(1)
- examine_list += "[parent] was bitten by someone!"
- if(2,3)
- examine_list += "[parent] was bitten [bitecount] times!"
- else
- examine_list += "[parent] was bitten multiple times!"
-
-/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user)
- SIGNAL_HANDLER
-
- return TryToEat(M, user)
-
-/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user)
- SIGNAL_HANDLER
-
- return TryToEat(user, user)
-
-///All the checks for the act of eating itself and
-/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
-
- set waitfor = FALSE
-
- var/atom/owner = parent
-
- if(feeder.a_intent == INTENT_HARM)
- return
- if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it.
- to_chat(feeder, "None of [owner] left, oh no!")
- if(isturf(parent))
- var/turf/T = parent
- T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
- else
- qdel(parent)
- return
- if(!CanConsume(eater, feeder))
- return
- var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
- for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
- fullness += C.nutriment_factor * C.volume / C.metabolization_rate
-
- . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
-
- if(eater == feeder)//If you're eating it yourself.
- if(!do_after(feeder, eat_time, eater)) //Gotta pass the minimal eat time
- return
- var/eatverb = pick(eatverbs)
- if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
- to_chat(eater, "You don't feel like eating any more junk food at the moment!")
- return
- else if(fullness <= 50)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
- else if(fullness > 50 && fullness < 150)
- eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
- else if(fullness > 150 && fullness < 500)
- eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
- else if(fullness > 500 && fullness < 600)
- eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
- else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
- eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
- return
- else //If you're feeding it to someone else.
- if(isbrain(eater))
- to_chat(feeder, "[eater] doesn't seem to have a mouth!")
- return
- if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
- eater.visible_message("[feeder] attempts to feed [eater] [parent].", \
- "[feeder] attempts to feed you [parent].")
- else
- eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \
- "[feeder] cannot force any more of [parent] down your throat!")
- return
- if(!do_after(feeder, target = eater)) //Wait 3 seconds before you can feed
- return
-
- log_combat(feeder, eater, "fed", owner.reagents.log_list())
- eater.visible_message("[feeder] forces [eater] to eat [parent]!", \
- "[feeder] forces you to eat [parent]!")
-
- TakeBite(eater, feeder)
-
-///This function lets the eater take a bite and transfers the reagents to the eater.
-/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
-
- var/atom/owner = parent
-
- if(!owner?.reagents)
- return FALSE
- if(eater.satiety > -200)
- eater.satiety -= junkiness
- playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
- if(owner.reagents.total_volume)
- SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder)
- var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
- owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
- bitecount++
- On_Consume(eater)
- checkLiked(fraction, eater)
-
- //Invoke our after eat callback if it is valid
- if(after_eat)
- after_eat.Invoke(eater, feeder)
-
- return TRUE
-
-///Checks whether or not the eater can actually consume the food
-/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
- if(!iscarbon(eater))
- return FALSE
- var/mob/living/carbon/C = eater
- var/covered = ""
- if(C.is_mouth_covered(head_only = 1))
- covered = "headgear"
- else if(C.is_mouth_covered(mask_only = 1))
- covered = "mask"
- if(covered)
- var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
- to_chat(feeder, "You have to remove [who] [covered] first!")
- return FALSE
- return TRUE
-
-///Check foodtypes to see if we should send a moodlet
-/datum/component/edible/proc/checkLiked(fraction, mob/M)
- if(last_check_time + 50 > world.time)
- return FALSE
- if(!ishuman(M))
- return FALSE
- var/mob/living/carbon/human/H = M
- if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food)
- to_chat(H, "You don't feel so good...")
- H.adjust_disgust(25 + 30 * fraction)
- else
- if(foodtypes & H.dna.species.toxic_food)
- to_chat(H,"What the hell was that thing?!")
- H.adjust_disgust(25 + 30 * fraction)
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
- else if(foodtypes & H.dna.species.disliked_food)
- to_chat(H,"That didn't taste very good...")
- H.adjust_disgust(11 + 15 * fraction)
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
- else if(foodtypes & H.dna.species.liked_food)
- to_chat(H,"I love this taste!")
- H.adjust_disgust(-5 + -2.5 * fraction)
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
- if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
- last_check_time = world.time
-
-///Delete the item when it is fully eaten
-/datum/component/edible/proc/On_Consume(mob/living/eater)
-
- var/atom/owner = parent
-
- if(!eater)
- return
- if(!owner.reagents.total_volume)
- if(isturf(parent))
- var/turf/T = parent
- T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
- else
- qdel(parent)
-
-///Ability to feed food to puppers
-/datum/component/edible/proc/UseByAnimal(datum/source, mob/user)
-
- SIGNAL_HANDLER
-
-
- var/atom/owner = parent
-
- if(!isdog(user))
- return
- var/mob/living/L = user
- if(bitecount == 0 || prob(50))
- L.manual_emote("nibbles away at \the [parent]")
- bitecount++
- . = COMPONENT_ITEM_NO_ATTACK
- L.taste(owner.reagents) // why should carbons get all the fun?
- if(bitecount >= 5)
- var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was")
- if(sattisfaction_text)
- L.manual_emote(sattisfaction_text)
- qdel(parent)
diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm
new file mode 100644
index 000000000000..cde77f969911
--- /dev/null
+++ b/code/datums/components/food/edible.dm
@@ -0,0 +1,494 @@
+/*!
+
+This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
+These items take a specific time to eat, and can do most of the things our original food items could.
+
+Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
+ Components:
+ Drying component (jerky etc)
+ Customizable component (custom pizzas etc)
+ Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
+ Microwavability component
+ Frying component
+
+ Misc:
+ Something for cakes (You can store things inside)
+
+*/
+/datum/component/edible
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ ///Amount of reagents taken per bite
+ var/bite_consumption = 2
+ ///Amount of bites taken so far
+ var/bitecount = 0
+ ///Flags for food
+ var/food_flags = NONE
+ ///Bitfield of the types of this food
+ var/foodtypes = NONE
+ ///Amount of seconds it takes to eat this food
+ var/eat_time = 30
+ ///Defines how much it lowers someones satiety (Need to eat, essentialy)
+ var/junkiness = 0
+ ///Message to send when eating
+ var/list/eatverbs
+ ///Callback to be ran before you eat something, so you can check if someone *can* eat it.
+ var/datum/callback/pre_eat
+ ///Callback to be ran before composting something, in case you don't want a piece of food to be compostable for some reason.
+ var/datum/callback/on_compost
+ ///Callback to be ran for when you take a bite of something
+ var/datum/callback/after_eat
+ ///Callback to be ran for when you finish eating something
+ var/datum/callback/on_consume
+ ///Last time we checked for food likes
+ var/last_check_time
+ ///The initial reagents of this food when it is made
+ var/list/initial_reagents
+ ///The initial volume of the foods reagents
+ var/volume
+ ///The flavortext for taste
+ var/list/tastes
+ ///The type of atom this creates when the object is microwaved.
+ var/microwaved_type
+
+ //TEMP VAR, filling is nonfunctional because newfood isnt customizable yet
+ var/filling_color
+
+/datum/component/edible/Initialize(list/initial_reagents,
+ food_flags = NONE,
+ foodtypes = NONE,
+ volume = 50,
+ eat_time = 10,
+ list/tastes,
+ list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
+ bite_consumption = 2,
+ microwaved_type,
+ junkiness,
+ filling_color = null, //Temp var
+ datum/callback/pre_eat,
+ datum/callback/on_compost,
+ datum/callback/after_eat,
+ datum/callback/on_consume
+)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(use_by_animal))
+ RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(on_craft))
+ RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(on_processed))
+ RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked))
+ RegisterSignal(parent, COMSIG_EDIBLE_ON_COMPOST, PROC_REF(compost))
+
+ if(isitem(parent))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand))
+ RegisterSignal(parent, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
+ RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved))
+
+ var/obj/item/item = parent
+ if (!item.grind_results)
+ item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it.
+
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.eat_time = eat_time
+ src.eatverbs = string_list(eatverbs)
+ src.junkiness = junkiness
+ src.pre_eat = pre_eat
+ src.on_compost = on_compost
+ src.after_eat = after_eat
+ src.on_consume = on_consume
+ src.initial_reagents = string_assoc_list(initial_reagents)
+ src.tastes = string_assoc_list(tastes)
+ src.microwaved_type = microwaved_type
+
+ var/atom/owner = parent
+
+ owner.create_reagents(volume, INJECTABLE)
+
+ for(var/rid in initial_reagents)
+ var/amount = initial_reagents[rid]
+ if(length(tastes) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
+ owner.reagents.add_reagent(rid, amount, tastes.Copy())
+ else
+ owner.reagents.add_reagent(rid, amount)
+
+/datum/component/edible/InheritComponent(datum/component/C,
+ i_am_original,
+ list/initial_reagents,
+ food_flags = NONE,
+ foodtypes = NONE,
+ volume = 50,
+ eat_time = 30,
+ list/tastes,
+ list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
+ bite_consumption = 2,
+ filling_color = null, //Temp var
+ datum/callback/pre_eat,
+ datum/callback/on_compost,
+ datum/callback/after_eat,
+ datum/callback/on_consume
+ )
+
+ . = ..()
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.eat_time = eat_time
+ src.eatverbs = eatverbs
+ src.junkiness = junkiness
+ src.pre_eat = pre_eat
+ src.on_compost = on_compost
+ src.after_eat = after_eat
+ src.on_consume = on_consume
+
+/datum/component/edible/Destroy(force, silent)
+ QDEL_NULL(pre_eat)
+ QDEL_NULL(on_compost)
+ QDEL_NULL(after_eat)
+ QDEL_NULL(on_consume)
+ return ..()
+
+/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!(food_flags & FOOD_IN_CONTAINER))
+ switch (bitecount)
+ if (0)
+ return
+ if(1)
+ examine_list += "[parent] was bitten by someone!"
+ if(2,3)
+ examine_list += "[parent] was bitten [bitecount] times!"
+ else
+ examine_list += "[parent] was bitten multiple times!"
+
+/datum/component/edible/proc/use_from_hand(obj/item/source, mob/living/M, mob/living/user)
+ SIGNAL_HANDLER
+
+ return TryToEat(M, user)
+
+/datum/component/edible/proc/on_fried(fry_object)
+ SIGNAL_HANDLER
+ var/atom/our_atom = parent
+ our_atom.reagents.trans_to(fry_object, our_atom.reagents.total_volume)
+ qdel(our_atom)
+ return COMSIG_FRYING_HANDLED
+
+///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents.
+/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option)
+ SIGNAL_HANDLER
+
+ if(!original_atom.reagents)
+ return
+
+ var/atom/this_food = parent
+ var/reagents_for_slice = chosen_processing_option[TOOL_PROCESSING_AMOUNT]
+
+ this_food.create_reagents(volume) //Make sure we have a reagent container
+
+ original_atom.reagents.trans_to(this_food, reagents_for_slice)
+
+ if(original_atom.name != initial(original_atom.name))
+ this_food.name = "slice of [original_atom.name]"
+ if(original_atom.desc != initial(original_atom.desc))
+ this_food.desc = "[original_atom.desc]"
+
+///Called when food is crafted through a crafting recipe datum.
+/datum/component/edible/proc/on_craft(datum/source, list/parts_list, datum/crafting_recipe/food/recipe)
+ SIGNAL_HANDLER
+
+ var/atom/this_food = parent
+
+ this_food.reagents.clear_reagents()
+
+ for(var/obj/item/crafted_part in this_food.contents)
+ crafted_part.reagents?.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER)
+
+ var/list/objects_to_delete = list()
+
+ // Remove all non recipe objects from the contents
+ for(var/content_object in this_food.contents)
+ for(var/recipe_object in recipe.real_parts)
+ if(istype(content_object, recipe_object))
+ continue
+ objects_to_delete += content_object
+
+ QDEL_LIST(objects_to_delete)
+
+ for(var/r_id in initial_reagents)
+ var/amount = initial_reagents[r_id] * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
+ if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
+ this_food.reagents.add_reagent(r_id, amount, tastes)
+ else
+ this_food.reagents.add_reagent(r_id, amount)
+
+ SSblackbox.record_feedback("tally", "food_made", 1, type)
+
+/datum/component/edible/proc/on_microwaved(datum/source, obj/machinery/microwave/used_microwave)
+ SIGNAL_HANDLER
+
+ var/turf/parent_turf = get_turf(parent)
+
+ if(!microwaved_type)
+ new /obj/item/reagent_containers/food/snacks/badrecipe(parent_turf)
+ qdel(parent)
+ return
+
+ var/obj/item/result
+
+ result = new microwaved_type(parent_turf)
+
+ var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1
+
+ SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, parent, efficiency)
+
+ SSblackbox.record_feedback("tally", "food_made", 1, result.type)
+ qdel(parent)
+ return COMPONENT_SUCCESFUL_MICROWAVE
+
+///Corrects the reagents on the newly cooked food
+/datum/component/edible/proc/on_microwave_cooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
+ SIGNAL_HANDLER
+
+ var/atom/this_food = parent
+
+ this_food.reagents.clear_reagents()
+
+ source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume)
+
+ for(var/r_id in initial_reagents)
+ var/amount = initial_reagents[r_id] * cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
+ if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
+ this_food.reagents.add_reagent(r_id, amount, tastes)
+ else
+ this_food.reagents.add_reagent(r_id, amount)
+
+///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles
+/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder)
+ if(QDELETED(owner)|| !(IS_EDIBLE(owner)))
+ return TRUE
+ if(owner.reagents.total_volume)
+ return FALSE
+ return TRUE
+
+/// Normal time to forcefeed someone something
+#define EAT_TIME_FORCE_FEED (3 SECONDS)
+
+///All the checks for the act of eating itself and
+/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
+
+ set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything
+
+ var/atom/owner = parent
+
+ if(feeder.a_intent == INTENT_HARM)
+ return
+
+ . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose
+
+ if(IsFoodGone(owner, feeder))
+ return
+
+ if(!CanConsume(eater, feeder))
+ return
+ var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
+
+ var/time_to_eat = (eater = feeder) ? eat_time : EAT_TIME_FORCE_FEED
+
+ if(eater == feeder)//If you're eating it yourself.
+ if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time
+ return
+ if(IsFoodGone(owner, feeder))
+ return
+ var/eatverb = pick(eatverbs)
+
+ if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
+ to_chat(eater, "You don't feel like eating any more junk food at the moment!")
+ return
+ else if(fullness <= 50)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
+ else if(fullness > 50 && fullness < 150)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
+ else if(fullness > 150 && fullness < 500)
+ eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
+ else if(fullness > 500 && fullness < 600)
+ eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
+ else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
+ eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
+ return
+
+
+
+
+
+ else //If you're feeding it to someone else.
+ if(isbrain(eater))
+ to_chat(feeder, "[eater] doesn't seem to have a mouth!")
+ return
+ if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
+ eater.visible_message(
+ "[feeder] attempts to feed [eater] [parent].", \
+ "[feeder] attempts to feed you [parent]."
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You feel someone trying to feed you something!")
+ else
+ eater.visible_message(
+ "[feeder] cannot force any more of [parent] down [eater]'s throat!", \
+ "[feeder] cannot force any more of [parent] down your throat!"
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You're too full to eat what's being fed to you!")
+ return
+ if(!do_after(feeder, delay = time_to_eat, target = eater)) //Wait 3 seconds before you can feed
+ return
+ if(IsFoodGone(owner, feeder))
+ return
+ log_combat(feeder, eater, "fed", owner.reagents.log_list())
+ eater.visible_message(
+ "[feeder] forces [eater] to eat [parent]!", \
+ "[feeder] forces you to eat [parent]!"
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You're forced to eat something!")
+
+ TakeBite(eater, feeder)
+
+ //If we're not force-feeding, try take another bite
+ if(eater == feeder && eat_time)
+ INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder)
+
+#undef EAT_TIME_FORCE_FEED
+
+///This function lets the eater take a bite and transfers the reagents to the eater.
+/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
+
+ var/atom/owner = parent
+
+ if(!owner?.reagents)
+ return FALSE
+ if(eater.satiety > -200)
+ eater.satiety -= junkiness
+ playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ if(!owner.reagents.total_volume)
+ return
+ SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption)
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
+ bitecount++
+ check_liked(fraction, eater)
+ if(!owner.reagents.total_volume)
+ on_consume(eater, feeder)
+
+ //Invoke our after eat callback if it is valid
+ if(after_eat)
+ after_eat.Invoke(eater, feeder, bitecount)
+
+ return TRUE
+
+///Checks if we can compost something, and handles it
+/datum/component/edible/proc/compost(mob/living/user)
+ SIGNAL_HANDLER
+ if(on_compost && !on_compost.Invoke(user))
+ return COMPONENT_EDIBLE_BLOCK_COMPOST
+
+///Checks whether or not the eater can actually consume the food
+/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
+ if(!iscarbon(eater))
+ return FALSE
+ if(pre_eat && !pre_eat.Invoke(eater, feeder))
+ return FALSE
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
+ to_chat(feeder, "You have to remove [who] [covered] first!")
+ return FALSE
+ return TRUE
+
+///Check foodtypes to see if we should send a moodlet
+/datum/component/edible/proc/check_liked(fraction, mob/eater)
+ if(last_check_time + 50 > world.time)
+ return FALSE
+ if(!ishuman(eater))
+ return FALSE
+ var/mob/living/carbon/human/human_eater = eater
+ if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
+ if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
+ if(foodtypes & human_eater.dna.species.toxic_food)
+ to_chat(human_eater, "You don't feel so good...")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ else
+ if(foodtypes & human_eater.dna.species.toxic_food)
+ to_chat(human_eater,"What the hell was that thing?!")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtypes & human_eater.dna.species.disliked_food)
+ to_chat(human_eater,"That didn't taste very good...")
+ human_eater.adjust_disgust(11 + 15 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
+ else if(foodtypes & human_eater.dna.species.liked_food)
+ to_chat(human_eater,"I love this taste!")
+ human_eater.adjust_disgust(-5 + -2.5 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
+ last_check_time = world.time
+
+ /* Should shiptest ever want to move taste to tongues as Beestation & later TGstation did, rather than on species
+ var/obj/item/organ/tongue/tongue = human_eater.getorganslot(ORGAN_SLOT_TONGUE)
+ if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
+ if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
+ if(foodtypes & tongue.toxic_food)
+ to_chat(human_eater, "You don't feel so good...")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ else
+ if(foodtypes & tongue.toxic_food)
+ to_chat(human_eater,"What the hell was that thing?!")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtypes & tongue.disliked_food)
+ to_chat(human_eater,"That didn't taste very good...")
+ human_eater.adjust_disgust(11 + 15 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
+ else if(foodtypes & tongue.liked_food)
+ to_chat(human_eater,"I love this taste!")
+ human_eater.adjust_disgust(-5 + -2.5 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
+ last_check_time = world.time
+ */
+
+///Delete the item when it is fully eaten
+/datum/component/edible/proc/on_consume(mob/living/eater, mob/living/feeder)
+ SEND_SIGNAL(parent, COMSIG_FOOD_CONSUMED, eater, feeder)
+
+ on_consume?.Invoke(eater, feeder)
+
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+
+///Ability to feed food to puppers
+/datum/component/edible/proc/use_by_animal(datum/source, mob/user)
+ SIGNAL_HANDLER
+ var/atom/owner = parent
+
+ if(!isdog(user))
+ return
+ var/mob/living/L = user
+ if(bitecount == 0 || prob(50))
+ L.manual_emote("nibbles away at \the [parent].")
+ bitecount++
+ . = COMPONENT_CANCEL_ATTACK_CHAIN
+ L.taste(owner.reagents) // why should carbons get all the fun?
+ if(bitecount >= 5)
+ var/satisfaction_text = pick("burps from enjoyment.", "yaps for more!", "woofs twice.", "looks at the area where \the [parent] was.")
+ L.manual_emote(satisfaction_text)
+ qdel(parent)
diff --git a/code/datums/components/food/food_storage.dm b/code/datums/components/food/food_storage.dm
new file mode 100644
index 000000000000..259ef4a8b6c6
--- /dev/null
+++ b/code/datums/components/food/food_storage.dm
@@ -0,0 +1,204 @@
+/// --Food storage component--
+/// This component lets you slide one item into large foods, such as bread, cheese wheels, or cakes.
+/// Consuming food storages with an item inside can cause unique interactions, such as eating glass shards.
+
+/datum/component/food_storage
+ /// Reference to what we have in our food.
+ var/obj/item/stored_item
+ /// The amount of volume the food has on creation - Used for probabilities
+ var/initial_volume = 10
+ /// Minimum size items that can be inserted
+ var/minimum_weight_class = WEIGHT_CLASS_SMALL
+ /// What are the odds we bite into the stored item?
+ var/bad_chance_of_discovery = 0
+ /// What are the odds we see the stored item before we bite it?
+ var/good_chance_of_discovery = 100
+ /// The stored item was found out somehow.
+ var/discovered = FALSE
+
+/datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100)
+
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(try_inserting_item))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(try_removing_item))
+ RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage))
+
+ var/atom/food = parent
+ initial_volume = food.reagents.total_volume
+
+ minimum_weight_class = _minimum_weight_class
+ bad_chance_of_discovery = _bad_chance
+ good_chance_of_discovery = _good_chance
+
+/datum/component/food_storage/Destroy(force, silent)
+ if(stored_item)
+ stored_item.forceMove(stored_item.drop_location())
+ stored_item.dropped()
+ stored_item = null
+ . = ..()
+
+/** Begins the process of inserted an item.
+ *
+ * Clicking on the food storage with an item will begin a do_after, which if successful inserts the item.
+ *
+ * Arguments
+ * inserted_item - the item being placed into the food
+ * user - the person inserting the item
+ */
+/datum/component/food_storage/proc/try_inserting_item(datum/source, obj/item/inserted_item, mob/user, params)
+ SIGNAL_HANDLER
+
+ // No matryoshka-ing food storage
+ if(istype(inserted_item, /obj/item/storage) || IS_EDIBLE(inserted_item))
+ return
+
+ //Harm intent will bypass inserting for injecting food with syringes and such
+ if(user.a_intent == INTENT_HARM)
+ return
+
+ if(inserted_item.w_class > minimum_weight_class)
+ to_chat(user, "\The [inserted_item.name] won't fit in \the [parent].")
+ return
+
+ if(!QDELETED(stored_item))
+ to_chat(user, "There's something in \the [parent].")
+ return
+
+ if(HAS_TRAIT(inserted_item, TRAIT_NODROP))
+ to_chat(user, "\the [inserted_item] is stuck to your hand, you can't put into \the [parent]!")
+ return
+
+ user.visible_message("[user.name] begins inserting [inserted_item.name] into \the [parent].", \
+ "You start to insert the [inserted_item.name] into \the [parent].")
+
+ INVOKE_ASYNC(src, PROC_REF(insert_item), inserted_item, user)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+/** Begins the process of attempting to remove the stored item.
+ *
+ * Clicking on food storage on grab intent will begin a do_after, which if successful removes the stored_item.
+ *
+ * Arguments
+ * user - the person removing the item.
+ */
+/datum/component/food_storage/proc/try_removing_item(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ var/atom/food = parent
+
+ if(user.a_intent != INTENT_GRAB)
+ return
+
+ if(QDELETED(stored_item))
+ return
+
+ if(!food.can_interact(user))
+ return
+
+ user.visible_message("[user.name] begins tearing at \the [parent].", \
+ "You start to rip into \the [parent].")
+
+ INVOKE_ASYNC(src, PROC_REF(begin_remove_item), user)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+/** Inserts the item into the food, after a do_after.
+ *
+ * Arguments
+ * inserted_item - The item being inserted.
+ * user - the person inserting the item.
+ */
+/datum/component/food_storage/proc/insert_item(obj/item/inserted_item, mob/user)
+ if(do_after(user, 1.5 SECONDS, target = parent))
+ var/atom/food = parent
+ to_chat(user, "You slip [inserted_item.name] inside \the [parent].")
+ inserted_item.forceMove(food)
+ user.log_message("[key_name(user)] inserted [inserted_item] into [parent] at [AREACOORD(user)]", LOG_ATTACK)
+ food.add_fingerprint(user)
+ inserted_item.add_fingerprint(user)
+
+ stored_item = inserted_item
+
+/** Removes the item from the food, after a do_after.
+ *
+ * Arguments
+ * user - person removing the item.
+ */
+/datum/component/food_storage/proc/begin_remove_item(mob/user)
+ if(do_after(user, 10 SECONDS, target = parent))
+ remove_item(user)
+
+/**
+ * Removes the stored item, putting it in user's hands or on the ground, then updates the reference.
+ */
+/datum/component/food_storage/proc/remove_item(mob/user)
+ if(user.put_in_hands(stored_item))
+ user.visible_message("[user.name] slowly pulls [stored_item.name] out of \the [parent].", \
+ "You slowly pull [stored_item.name] out of \the [parent].")
+ else
+ stored_item.dropped()
+ stored_item.visible_message("[stored_item.name] falls out of \the [parent].")
+
+ update_stored_item()
+
+/** Checks for stored items when the food is eaten.
+ *
+ * If the food is eaten while an item is stored in it, calculates the odds that the item will be found.
+ * Then, if the item is found before being bitten, the item is removed.
+ * If the item is found by biting into it, calls on_accidental_consumption on the stored item.
+ * Afterwards, removes the item from the food if it was discovered.
+ *
+ * Arguments
+ * target - person doing the eating (can be the same as user)
+ * user - person causing the eating to happen
+ * bitecount - how many times the current food has been bitten
+ * bitesize - how large bties are for this food
+ */
+/datum/component/food_storage/proc/consume_food_storage(datum/source, mob/living/target, mob/living/user, bitecount, bitesize)
+ SIGNAL_HANDLER
+
+ if(QDELETED(stored_item)) //if the stored item was deleted/null...
+ if(!update_stored_item()) //check if there's a replacement item
+ return
+
+ /// Chance of biting the held item = amount of bites / (intitial reagents / reagents per bite) * 100
+ bad_chance_of_discovery = (bitecount / (initial_volume / bitesize))*100
+ /// Chance of finding the held item = bad chance - 50
+ good_chance_of_discovery = bad_chance_of_discovery - 50
+
+ if(prob(good_chance_of_discovery)) //finding the item, without biting it
+ discovered = TRUE
+ to_chat(target, "It feels like there's something in \the [parent]...!")
+
+ else if(prob(bad_chance_of_discovery)) //finding the item, BY biting it
+ user.log_message("[key_name(user)] just fed [key_name(target)] a/an [stored_item] which was hidden in [parent] at [AREACOORD(target)]", LOG_ATTACK)
+ discovered = stored_item.on_accidental_consumption(target, user, parent)
+ update_stored_item() //make sure if the item was changed, the reference changes as well
+
+ if(!QDELETED(stored_item) && discovered)
+ INVOKE_ASYNC(src, PROC_REF(remove_item), user)
+
+/** Updates the reference of the stored item.
+ *
+ * Checks the food's contents for if an alternate item was placed into the food.
+ * If there is an alternate item, updates the reference to the new item.
+ * If there isn't, updates the reference to null.
+ *
+ * Returns FALSE if the ref is nulled, or TRUE is another item replaced it.
+ */
+/datum/component/food_storage/proc/update_stored_item()
+ var/atom/food = parent
+ if(!food?.contents.len) //if there's no items in the food or food is deleted somehow
+ stored_item = null
+ return FALSE
+
+ for(var/obj/item/i in food.contents) //search the food's contents for a replacement item
+ if(IS_EDIBLE(i))
+ continue
+ if(QDELETED(i))
+ continue
+
+ stored_item = i //we found something to replace it
+ return TRUE
+
+ //if there's nothing else in the food, or we found nothing valid
+ stored_item = null
+ return FALSE
diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm
new file mode 100644
index 000000000000..3451a75538ad
--- /dev/null
+++ b/code/datums/components/jetpack.dm
@@ -0,0 +1,149 @@
+// Welcome to the jetpack component
+// Apply this to something when you want it to be "like a jetpack"
+// So propulsion through space on move, that sort of thing
+/datum/component/jetpack
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ var/datum/callback/check_on_move
+ var/datum/callback/get_mover
+ /// If we should stabilize ourselves when not drifting
+ var/stabilize = FALSE
+ /// The signal we listen for as an activation
+ var/activation_signal
+ /// The signal we listen for as a de-activation
+ var/deactivation_signal
+ /// The return flag our parent expects for a failed activation
+ var/return_flag
+ var/datum/effect_system/trail_follow/trail
+ /// The typepath to instansiate our trail as, when we need it
+ var/effect_type
+
+/**
+ * Arguments:
+ * * stabilize - If we should drift when we finish moving, or sit stable in space]
+ * * activation_signal - Signal we activate on
+ * * deactivation_signal - Signal we deactivate on
+ * * return_flag - Flag to return if activation fails
+ * * get_mover - Callback we use to get the "moving" thing, for trail purposes, alongside signal registration
+ * * check_on_move - Callback we call each time we attempt a move, we expect it to retun true if the move is ok, false otherwise. It expects an arg, TRUE if fuel should be consumed, FALSE othewise
+ * * effect_type - Type of trail_follow to spawn
+ */
+/datum/component/jetpack/Initialize(stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/get_mover, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type)
+ . = ..()
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ if(!activation_signal) // Can't activate? go away
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, activation_signal, PROC_REF(activate))
+ if(deactivation_signal)
+ RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate))
+
+ src.check_on_move = check_on_move
+ src.get_mover = get_mover
+ src.stabilize = stabilize
+ src.return_flag = return_flag
+ src.activation_signal = activation_signal
+ src.deactivation_signal = deactivation_signal
+ src.effect_type = effect_type
+
+/datum/component/jetpack/InheritComponent(datum/component/component, original, stabilize, activation_signal, deactivation_signal, return_flag, datum/callback/get_mover, datum/callback/check_on_move, datum/effect_system/trail_follow/effect_type)
+ UnregisterSignal(parent, src.activation_signal)
+ if(src.deactivation_signal)
+ UnregisterSignal(parent, src.deactivation_signal)
+ RegisterSignal(parent, activation_signal, PROC_REF(activate))
+ if(deactivation_signal)
+ RegisterSignal(parent, deactivation_signal, PROC_REF(deactivate))
+
+ src.check_on_move = check_on_move
+ src.get_mover = get_mover
+ src.stabilize = stabilize
+ src.activation_signal = activation_signal
+ src.deactivation_signal = deactivation_signal
+ src.effect_type = effect_type
+
+ if(trail && effect_type != trail.type)
+ QDEL_NULL(trail)
+ setup_trail()
+
+/datum/component/jetpack/Destroy()
+ QDEL_NULL(trail)
+ QDEL_NULL(check_on_move)
+ return ..()
+
+/datum/component/jetpack/proc/setup_trail()
+ var/mob/moving = get_mover.Invoke()
+ if(!moving || trail)
+ return
+ trail = new effect_type
+ trail.auto_process = FALSE
+ trail.set_up(moving)
+
+/datum/component/jetpack/proc/activate(datum/source)
+ SIGNAL_HANDLER
+ var/mob/moving = get_mover.Invoke()
+ if(!thrust(moving))
+ return return_flag
+ trail.start()
+ RegisterSignal(moving, COMSIG_MOVABLE_MOVED, PROC_REF(move_react))
+ RegisterSignal(moving, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react))
+ RegisterSignal(moving, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react))
+ RegisterSignal(moving, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT, PROC_REF(block_starting_visuals))
+ RegisterSignal(moving, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT, PROC_REF(ignore_ending_block))
+
+/datum/component/jetpack/proc/deactivate(datum/source)
+ SIGNAL_HANDLER
+ QDEL_NULL(trail)
+ var/mob/moving = get_mover.Invoke()
+ if(moving)
+ UnregisterSignal(moving, COMSIG_MOVABLE_MOVED)
+ UnregisterSignal(moving, COMSIG_MOVABLE_PRE_MOVE)
+ UnregisterSignal(moving, COMSIG_MOVABLE_SPACEMOVE)
+ UnregisterSignal(moving, COMSIG_MOVABLE_DRIFT_VISUAL_ATTEMPT)
+ UnregisterSignal(moving, COMSIG_MOVABLE_DRIFT_BLOCK_INPUT)
+
+/datum/component/jetpack/proc/move_react(mob/user)
+ SIGNAL_HANDLER
+ if(!user || !user.client)//Don't allow jet self using
+ return
+ if(!isturf(user.loc))//You can't use jet in nowhere or from mecha/closet
+ return
+ if(!(user.movement_type & FLOATING) || user.buckled)//You don't want use jet in gravity or while buckled.
+ return
+ if(user.pulledby)//You don't must use jet if someone pull you
+ return
+ if(user.throwing)//You don't must use jet if you thrown
+ return
+ if(length(user.client.keys_held & user.client.movement_keys))//You use jet when press keys. yes.
+ thrust()
+
+/datum/component/jetpack/proc/pre_move_react(mob/user)
+ SIGNAL_HANDLER
+ trail.oldposition = get_turf(user)
+
+/datum/component/jetpack/proc/spacemove_react(mob/user, movement_dir, continuous_move)
+ SIGNAL_HANDLER
+ if(!continuous_move && movement_dir)
+ return COMSIG_MOVABLE_STOP_SPACEMOVE
+ // Check if we have the fuel to stop this. Do NOT cosume any fuel, just check
+ // This is done because things other then us can use our fuel
+ if(stabilize && check_on_move.Invoke(FALSE))
+ return COMSIG_MOVABLE_STOP_SPACEMOVE
+
+/// Returns true if the thrust went well, false otherwise
+/datum/component/jetpack/proc/thrust()
+ if(!check_on_move.Invoke(TRUE))
+ return FALSE
+ if(!trail)
+ setup_trail()
+ trail.generate_effect()
+ return TRUE
+
+/// Basically, tell the drift component not to do its starting visuals, because they look dumb for us
+/datum/component/jetpack/proc/block_starting_visuals(datum/source)
+ SIGNAL_HANDLER
+ return DRIFT_VISUAL_FAILED
+
+/// If we're on, don't let the drift component block movements at the end since we can speed
+/datum/component/jetpack/proc/ignore_ending_block(datum/source)
+ SIGNAL_HANDLER
+ return DRIFT_ALLOW_INPUT
diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm
new file mode 100644
index 000000000000..81cb0c2b4d40
--- /dev/null
+++ b/code/datums/components/shielded.dm
@@ -0,0 +1,186 @@
+/**
+ * The shielded component causes the parent item to nullify a certain number of attacks against the wearer, see: shielded vests.
+ */
+
+/datum/component/shielded
+ /// The person currently wearing us
+ var/mob/living/wearer
+ /// How many charges we can have max, and how many we start with
+ var/max_charges
+ /// How many charges we currently have
+ var/current_charges
+ /// How long we have to avoid being hit to replenish charges. If set to 0, we never recharge lost charges
+ var/recharge_start_delay = 20 SECONDS
+ /// Once we go unhit long enough to recharge, we replenish charges this often. The floor is effectively 1 second, AKA how often SSdcs processes
+ var/charge_increment_delay = 1 SECONDS
+ /// How many charges we recover on each charge increment
+ var/charge_recovery = 1
+ /// What .dmi we're pulling the shield icon from
+ var/shield_icon_file = 'icons/effects/effects.dmi'
+ /// What icon is used when someone has a functional shield up
+ var/shield_icon = "shield-old"
+ /// Do we still shield if we're being held in-hand? If FALSE, it needs to be equipped to a slot to work
+ var/shield_inhand = FALSE
+ /// Should the shield lose charges equal to the damage dealt by a hit?
+ var/lose_multiple_charges = FALSE
+ /// The cooldown tracking when we were last hit
+ COOLDOWN_DECLARE(recently_hit_cd)
+ /// The cooldown tracking when we last replenished a charge
+ COOLDOWN_DECLARE(charge_add_cd)
+ /// A callback for the sparks/message that play when a charge is used, see [/datum/component/shielded/proc/default_run_hit_callback]
+ var/datum/callback/on_hit_effects
+
+/datum/component/shielded/Initialize(max_charges = 3, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, starting_charges = null, shield_icon_file = 'icons/effects/effects.dmi', shield_icon = "shield-old", shield_inhand = FALSE, run_hit_callback)
+ if(!isitem(parent) || max_charges <= 0)
+ return COMPONENT_INCOMPATIBLE
+
+ src.max_charges = max_charges
+ src.recharge_start_delay = recharge_start_delay
+ src.charge_increment_delay = charge_increment_delay
+ src.charge_recovery = charge_recovery
+ src.lose_multiple_charges = lose_multiple_charges
+ src.shield_icon_file = shield_icon_file
+ src.shield_icon = shield_icon
+ src.shield_inhand = shield_inhand
+ src.on_hit_effects = run_hit_callback || CALLBACK(src, PROC_REF(default_run_hit_callback))
+ if(isnull(starting_charges))
+ current_charges = max_charges
+ else
+ current_charges = starting_charges
+ if(recharge_start_delay)
+ START_PROCESSING(SSdcs, src)
+
+/datum/component/shielded/Destroy(force, silent)
+ if(wearer)
+ shield_icon = "broken"
+ UnregisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS)
+ wearer.update_appearance(UPDATE_ICON)
+ wearer = null
+ QDEL_NULL(on_hit_effects)
+ return ..()
+
+/datum/component/shielded/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped))
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(lost_wearer))
+ RegisterSignal(parent, COMSIG_ITEM_HIT_REACT, PROC_REF(on_hit_react))
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(check_recharge_rune))
+ var/atom/shield = parent
+ if(ismob(shield.loc))
+ var/mob/holder = shield.loc
+ if(holder.is_holding(parent) && !shield_inhand)
+ return
+ set_wearer(holder)
+
+/datum/component/shielded/UnregisterFromParent()
+ UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_HIT_REACT, COMSIG_PARENT_ATTACKBY))
+ var/atom/shield = parent
+ if(shield.loc == wearer)
+ lost_wearer(src, wearer)
+
+// Handle recharging, if we want to
+/datum/component/shielded/process(delta_time)
+ if(current_charges >= max_charges)
+ STOP_PROCESSING(SSdcs, src)
+ return
+
+ if(!COOLDOWN_FINISHED(src, recently_hit_cd))
+ return
+ if(!COOLDOWN_FINISHED(src, charge_add_cd))
+ return
+
+ var/obj/item/item_parent = parent
+ COOLDOWN_START(src, charge_add_cd, charge_increment_delay)
+ adjust_charge(charge_recovery) // set the number of charges to current + recovery per increment, clamped from zero to max_charges
+ playsound(item_parent, 'sound/magic/charge.ogg', 50, TRUE)
+ if(current_charges == max_charges)
+ playsound(item_parent, 'sound/machines/ding.ogg', 50, TRUE)
+
+/datum/component/shielded/proc/adjust_charge(change)
+ current_charges = clamp(current_charges + change, 0, max_charges)
+ if(wearer)
+ wearer.update_appearance(UPDATE_ICON)
+
+/// Check if we've been equipped to a valid slot to shield
+/datum/component/shielded/proc/on_equipped(datum/source, mob/user, slot)
+ SIGNAL_HANDLER
+
+ if(slot == ITEM_SLOT_HANDS && !shield_inhand)
+ lost_wearer(source, user)
+ return
+ set_wearer(source, user)
+
+/// Either we've been dropped or our wearer has been QDEL'd. Either way, they're no longer our problem
+/datum/component/shielded/proc/lost_wearer(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ if(wearer)
+ UnregisterSignal(wearer, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_PARENT_QDELETING))
+ wearer.update_appearance(UPDATE_ICON)
+ wearer = null
+
+/datum/component/shielded/proc/set_wearer(mob/user)
+ wearer = user
+ RegisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays))
+ RegisterSignal(wearer, COMSIG_PARENT_QDELETING, PROC_REF(lost_wearer))
+ if(current_charges)
+ wearer.update_appearance(UPDATE_ICON)
+
+/// Used to draw the shield overlay on the wearer
+/datum/component/shielded/proc/on_update_overlays(atom/parent_atom, list/overlays)
+ SIGNAL_HANDLER
+
+ overlays += mutable_appearance(shield_icon_file, (current_charges > 0 ? shield_icon : "broken"), ABOVE_MOB_LAYER)
+
+/**
+ * This proc fires when we're hit, and is responsible for checking if we're charged, then deducting one + returning that we're blocking if so.
+ * It then runs the callback in [/datum/component/shielded/var/on_hit_effects] which handles the messages/sparks (so the visuals)
+ */
+/datum/component/shielded/proc/on_hit_react(datum/source, mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type)
+ SIGNAL_HANDLER
+
+ COOLDOWN_START(src, recently_hit_cd, recharge_start_delay)
+
+ if(current_charges <= 0)
+ return
+ . = COMPONENT_HIT_REACTION_BLOCK
+
+ var/charge_loss = 1 // how many charges do we lose
+
+ if(lose_multiple_charges) // if the shield has health like damage we'll lose charges equal to the damage of the hit
+ charge_loss = damage
+
+ adjust_charge(-charge_loss)
+
+ INVOKE_ASYNC(src, PROC_REF(actually_run_hit_callback), owner, attack_text, current_charges)
+
+ if(!recharge_start_delay) // if recharge_start_delay is 0, we don't recharge
+ if(!current_charges) // obviously if someone ever adds a manual way to replenish charges, change this
+ qdel(src)
+ return
+
+ START_PROCESSING(SSdcs, src) // if we DO recharge, start processing so we can do that
+
+/// The wrapper to invoke the on_hit callback, so we don't have to worry about blocking in the signal handler
+/datum/component/shielded/proc/actually_run_hit_callback(mob/living/owner, attack_text, current_charges)
+ on_hit_effects.Invoke(owner, attack_text, current_charges)
+
+/// Default on_hit proc, since cult robes are stupid and have different descriptions/sparks
+/datum/component/shielded/proc/default_run_hit_callback(mob/living/owner, attack_text, current_charges)
+ do_sparks(2, TRUE, owner)
+ owner.visible_message(span_danger("Щит [owner] отражает [attack_text]!"))
+ if(current_charges <= 0)
+ owner.visible_message(span_warning("Щит [owner] перегружается!"))
+
+/datum/component/shielded/proc/check_recharge_rune(datum/source, obj/item/wizard_armour_charge/recharge_rune, mob/living/user)
+ /*SIGNAL_HANDLER
+
+ if(!istype(recharge_rune))
+ return
+ . = COMPONENT_NO_AFTERATTACK
+ if(!istype(parent, /obj/item/clothing/suit/space/hardsuit/shielded/wizard))
+ to_chat(user, span_warning("Руна может быть использована только на броне боевого мага!"))
+ return
+
+ current_charges += recharge_rune.restored_charges
+ to_chat(user, span_notice("Заряжаю [parent]. Теперь она сможет поглотить [current_charges] ударов."))
+ qdel(recharge_rune)*/
diff --git a/code/datums/components/sizzle.dm b/code/datums/components/sizzle.dm
index 88fadb377ceb..ecb45e448d84 100644
--- a/code/datums/components/sizzle.dm
+++ b/code/datums/components/sizzle.dm
@@ -3,9 +3,11 @@
var/sizzlealpha = 0
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
-/datum/component/sizzle/Initialize()
+/datum/component/sizzle/Initialize(_alpha)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
+ if(_alpha)
+ sizzlealpha = _alpha
setup_sizzle()
/datum/component/sizzle/InheritComponent(datum/component/C, i_am_original)
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index 89831dafab72..765e14e5db64 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -424,7 +424,7 @@
/datum/component/storage/proc/dump_content_at(atom/dest_object, mob/M)
var/atom/A = parent
var/atom/dump_destination = dest_object.get_dumping_location()
- if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination))
+ if(M.CanReach(A) && dump_destination && M.CanReach(dump_destination))
if(locked)
to_chat(M, "[parent] seems to be [locked_flavor]!")
return FALSE
@@ -433,6 +433,12 @@
return TRUE
return FALSE
+/datum/component/storage/proc/get_dumping_location(atom/dest_object)
+ var/datum/component/storage/storage = dest_object.GetComponent(/datum/component/storage)
+ if(storage)
+ return storage.real_location()
+ return dest_object.get_dumping_location()
+
//This proc is called when you want to place an item into the storage item.
/datum/component/storage/proc/attackby(datum/source, obj/item/I, mob/M, params)
SIGNAL_HANDLER
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 68c74921b8b7..0d3d520c2b54 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -270,11 +270,10 @@
if(ishuman(target))
var/mob/living/carbon/human/T = target
- var/suit_slot = T.get_item_by_slot(ITEM_SLOT_OCLOTHING)
if(isnull(T.wear_suit) && isnull(T.w_uniform)) // who honestly puts all of their effort into tackling a naked guy?
defense_mod += 2
- if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/space/hardsuit)))
+ if(T.mob_negates_gravity())
defense_mod += 1
if(T.is_shove_knockdown_blocked()) // riot armor and such
defense_mod += 5
diff --git a/code/datums/diseases/legionvirus.dm b/code/datums/diseases/legionvirus.dm
index 22144a7b2a14..a6e1bdadcdd2 100644
--- a/code/datums/diseases/legionvirus.dm
+++ b/code/datums/diseases/legionvirus.dm
@@ -1,28 +1,29 @@
-/datum/disease/transformation/legionvirus
- name = "Soulus Saturation"
+/datum/disease/transformation/legionvirus //Diseases are a quick way to exposit a bunch of information onto players, most of the effects here are handled by the legion skull organ from /mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+ name = "Legion Infection"
max_stages = 5
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
- cure_text = "System Cleaner"
- cures = list(/datum/reagent/medicine/system_cleaner)
- agent = "Soulus Dust"
+ cure_text = "Surgically removing the skull from the patient's chest; applications of spaceacillin or synaptizine can delay onset of the infection."
+ agent = "Legion skull"
viable_mobtypes = list(/mob/living/carbon/human)
visibility_flags = 0
- stage_prob = 5
- cure_chance = 20
- desc = "If left untreated, this disease will cause the infected to transform into a legion."
+ stage_prob = 0 // WOOOOOO SNOWFLAKE!!!!!!! WOOOOOO!!!!
+ desc = "If left untreated, the skull will slowly overtake its host's body, eventually growing into a legion."
severity = DISEASE_SEVERITY_HARMFUL
- disease_flags = CURABLE
+ disease_flags = NONE
+ visibility_flags = HIDDEN_PANDEMIC
bypasses_immunity = TRUE
- stage1 = list("Your joints itch.")
- stage2 = list("Your head begins to ache.")
- stage3 = list("Ash begins to flake off your skin.")
- stage4 = list("You feel like your head is splitting in two!")
- stage5 = list("You feel something growing inside your chest!")
+ stage1 = list(span_notice("You feel a dull pain in your chest."))
+ stage2 = list(span_notice("Your head begins to ache."))
+ stage3 = list(span_notice("Something moves underneath your skin."))
+ stage4 = list(span_warning("You feel something pressing against your skin!"))
+ stage5 = list(span_warning("Your skin begins to tear apart-!"))
new_form = /mob/living/simple_animal/hostile/asteroid/hivelord/legion
/datum/disease/transformation/legionvirus/do_disease_transformation(mob/living/H)
- H.visible_message("[H] transforms into a legion!")
+ if(stage5)
+ to_chat(affected_mob, pick(stage5))
+ H.visible_message(span_warning("[H] suddenly collapses, a pallid grey mass bursting from their body!"))
var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
@@ -32,4 +33,3 @@
H.adjustBruteLoss(1000)
L.stored_mob = H
H.forceMove(L)
- qdel(src)
diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm
new file mode 100644
index 000000000000..8d5d798c3cb8
--- /dev/null
+++ b/code/datums/elements/empprotection.dm
@@ -0,0 +1,20 @@
+/datum/element/empprotection
+ element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
+ id_arg_index = 2
+ var/flags = NONE
+
+/datum/element/empprotection/Attach(datum/target, _flags)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE || !isatom(target))
+ return ELEMENT_INCOMPATIBLE
+ flags = _flags
+ RegisterSignal(target, COMSIG_ATOM_EMP_ACT, PROC_REF(getEmpFlags))
+
+/datum/element/empprotection/Detach(atom/target)
+ UnregisterSignal(target, COMSIG_ATOM_EMP_ACT)
+ return ..()
+
+/datum/element/empprotection/proc/getEmpFlags(datum/source, severity)
+ SIGNAL_HANDLER
+
+ return flags
diff --git a/code/datums/elements/dunkable.dm b/code/datums/elements/food/dunkable.dm
similarity index 99%
rename from code/datums/elements/dunkable.dm
rename to code/datums/elements/food/dunkable.dm
index 1eaee1d8cbbc..80661d5c4ac0 100644
--- a/code/datums/elements/dunkable.dm
+++ b/code/datums/elements/food/dunkable.dm
@@ -17,8 +17,6 @@
UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK)
/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag)
- SIGNAL_HANDLER
-
if(!proximity_flag) // if the user is not adjacent to the container
return
var/obj/item/reagent_containers/container = target // the container we're trying to dunk into
diff --git a/code/datums/elements/food/edible.dm b/code/datums/elements/food/edible.dm
new file mode 100644
index 000000000000..a06a5ec28b79
--- /dev/null
+++ b/code/datums/elements/food/edible.dm
@@ -0,0 +1,471 @@
+/*!
+
+This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items).
+These items take a specific time to eat, and can do most of the things our original food items could.
+
+Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else:
+ Components:
+ Drying component (jerky etc)
+ Customizable component (custom pizzas etc)
+ Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.)
+ Microwavability component
+ Frying component
+
+ Misc:
+ Something for cakes (You can store things inside)
+
+*/
+/datum/component/edible
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ ///Amount of reagents taken per bite
+ var/bite_consumption = 2
+ ///Amount of bites taken so far
+ var/bitecount = 0
+ ///Flags for food
+ var/food_flags = NONE
+ ///Bitfield of the types of this food
+ var/foodtypes = NONE
+ ///Amount of seconds it takes to eat this food
+ var/eat_time = 30
+ ///Defines how much it lowers someones satiety (Need to eat, essentialy)
+ var/junkiness = 0
+ ///Message to send when eating
+ var/list/eatverbs
+ ///Callback to be ran before you eat something, so you can check if someone *can* eat it.
+ var/datum/callback/pre_eat
+ ///Callback to be ran before composting something, in case you don't want a piece of food to be compostable for some reason.
+ var/datum/callback/on_compost
+ ///Callback to be ran for when you take a bite of something
+ var/datum/callback/after_eat
+ ///Callback to be ran for when you finish eating something
+ var/datum/callback/on_consume
+ ///Last time we checked for food likes
+ var/last_check_time
+ ///The initial reagents of this food when it is made
+ var/list/initial_reagents
+ ///The initial volume of the foods reagents
+ var/volume
+ ///The flavortext for taste
+ var/list/tastes
+ ///The type of atom this creates when the object is microwaved.
+ var/microwaved_type
+
+ //TEMP VAR. To be phased out
+ var/filling_color = null
+
+
+/datum/component/edible/Initialize(list/initial_reagents,
+ food_flags = NONE,
+ foodtypes = NONE,
+ volume = 50,
+ eat_time = 10,
+ list/tastes,
+ list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
+ bite_consumption = 2,
+ microwaved_type,
+ junkiness,
+ datum/callback/pre_eat,
+ datum/callback/on_compost,
+ datum/callback/after_eat,
+ datum/callback/on_consume
+)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(use_by_animal))
+ RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(on_craft))
+ RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(on_processed))
+ RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked))
+ RegisterSignal(parent, COMSIG_EDIBLE_ON_COMPOST, PROC_REF(compost))
+
+ if(isitem(parent))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand))
+ RegisterSignal(parent, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
+ RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved))
+
+ var/obj/item/item = parent
+ if (!item.grind_results)
+ item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it.
+
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.initial_reagents = initial_reagents
+ src.tastes = tastes
+ src.eat_time = eat_time
+ src.eatverbs = string_list(eatverbs)
+ src.junkiness = junkiness
+ src.pre_eat = pre_eat
+ src.on_compost = on_compost
+ src.after_eat = after_eat
+ src.on_consume = on_consume
+ src.initial_reagents = string_assoc_list(initial_reagents)
+ src.tastes = string_assoc_list(tastes)
+ src.microwaved_type = microwaved_type
+
+ var/atom/owner = parent
+
+ owner.create_reagents(volume, INJECTABLE)
+
+ for(var/rid in initial_reagents)
+ var/amount = initial_reagents[rid]
+ if(length(tastes) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin))
+ owner.reagents.add_reagent(rid, amount, tastes.Copy())
+ else
+ owner.reagents.add_reagent(rid, amount)
+
+/datum/component/edible/InheritComponent(datum/component/C,
+ i_am_original,
+ list/initial_reagents,
+ food_flags = NONE,
+ foodtypes = NONE,
+ volume = 50,
+ eat_time = 30,
+ list/tastes,
+ list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
+ bite_consumption = 2,
+ datum/callback/pre_eat,
+ datum/callback/on_compost,
+ datum/callback/after_eat,
+ datum/callback/on_consume
+ )
+
+ . = ..()
+ src.bite_consumption = bite_consumption
+ src.food_flags = food_flags
+ src.foodtypes = foodtypes
+ src.eat_time = eat_time
+ src.eatverbs = eatverbs
+ src.junkiness = junkiness
+ src.pre_eat = pre_eat
+ src.on_compost = on_compost
+ src.after_eat = after_eat
+ src.on_consume = on_consume
+
+/datum/component/edible/Destroy(force, silent)
+ QDEL_NULL(pre_eat)
+ QDEL_NULL(on_compost)
+ QDEL_NULL(after_eat)
+ QDEL_NULL(on_consume)
+ return ..()
+
+/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!(food_flags & FOOD_IN_CONTAINER))
+ switch (bitecount)
+ if (0)
+ return
+ if(1)
+ examine_list += "[parent] was bitten by someone!"
+ if(2,3)
+ examine_list += "[parent] was bitten [bitecount] times!"
+ else
+ examine_list += "[parent] was bitten multiple times!"
+
+/datum/component/edible/proc/use_from_hand(obj/item/source, mob/living/M, mob/living/user)
+ SIGNAL_HANDLER
+
+ return TryToEat(M, user)
+
+/datum/component/edible/proc/on_fried(fry_object)
+ SIGNAL_HANDLER
+ var/atom/our_atom = parent
+ our_atom.reagents.trans_to(fry_object, our_atom.reagents.total_volume)
+ qdel(our_atom)
+ return COMSIG_FRYING_HANDLED
+
+///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents.
+/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option)
+ SIGNAL_HANDLER
+
+ if(!original_atom.reagents)
+ return
+
+ var/atom/this_food = parent
+ var/reagents_for_slice = chosen_processing_option[TOOL_PROCESSING_AMOUNT]
+
+ this_food.create_reagents(volume) //Make sure we have a reagent container
+
+ original_atom.reagents.trans_to(this_food, reagents_for_slice)
+
+ if(original_atom.name != initial(original_atom.name))
+ this_food.name = "slice of [original_atom.name]"
+ if(original_atom.desc != initial(original_atom.desc))
+ this_food.desc = "[original_atom.desc]"
+
+///Called when food is crafted through a crafting recipe datum.
+/datum/component/edible/proc/on_craft(datum/source, list/parts_list, datum/crafting_recipe/food/recipe)
+ SIGNAL_HANDLER
+
+ var/atom/this_food = parent
+
+ this_food.reagents.clear_reagents()
+
+ for(var/obj/item/crafted_part in this_food.contents)
+ crafted_part.reagents?.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER)
+
+ var/list/objects_to_delete = list()
+
+ // Remove all non recipe objects from the contents
+ for(var/content_object in this_food.contents)
+ for(var/recipe_object in recipe.real_parts)
+ if(istype(content_object, recipe_object))
+ continue
+ objects_to_delete += content_object
+
+ QDEL_LIST(objects_to_delete)
+
+ for(var/r_id in initial_reagents)
+ var/amount = initial_reagents[r_id] * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
+ if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
+ this_food.reagents.add_reagent(r_id, amount, tastes)
+ else
+ this_food.reagents.add_reagent(r_id, amount)
+
+ SSblackbox.record_feedback("tally", "food_made", 1, type)
+
+/datum/component/edible/proc/on_microwaved(datum/source, obj/machinery/microwave/used_microwave)
+ SIGNAL_HANDLER
+
+ var/turf/parent_turf = get_turf(parent)
+
+ if(!microwaved_type)
+ new /obj/item/reagent_containers/food/snacks/badrecipe(parent_turf)
+ qdel(src)
+ return
+
+
+ var/obj/item/result
+
+ result = new microwaved_type(parent_turf)
+
+ var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1
+
+ SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, parent, efficiency)
+
+ SSblackbox.record_feedback("tally", "food_made", 1, result.type)
+
+///Corrects the reagents on the newly cooked food
+/datum/component/edible/proc/on_microwave_cooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
+ SIGNAL_HANDLER
+
+ var/atom/this_food = parent
+
+ this_food.reagents.clear_reagents()
+
+ source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume)
+
+ for(var/r_id in initial_reagents)
+ var/amount = initial_reagents[r_id] * cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER
+ if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin)
+ this_food.reagents.add_reagent(r_id, amount, tastes)
+ else
+ this_food.reagents.add_reagent(r_id, amount)
+
+///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles
+/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder)
+ if(QDELETED(owner)|| !(IS_EDIBLE(owner)))
+ return TRUE
+ if(owner.reagents.total_volume)
+ return FALSE
+ return TRUE
+
+/// Normal time to forcefeed someone something
+#define EAT_TIME_FORCE_FEED (3 SECONDS)
+
+///All the checks for the act of eating itself and
+/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder)
+
+ set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything
+
+ var/atom/owner = parent
+
+ if(feeder.a_intent == INTENT_HARM)
+ return
+
+ . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose
+
+ if(IsFoodGone(owner, feeder))
+ return
+
+ if(!CanConsume(eater, feeder))
+ return
+ var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
+
+ var/time_to_eat = (eater = feeder) ? eat_time : EAT_TIME_FORCE_FEED
+
+ if(eater == feeder)//If you're eating it yourself.
+ if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time
+ return
+ if(IsFoodGone(owner, feeder))
+ return
+ var/eatverb = pick(eatverbs)
+
+ if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS))
+ to_chat(eater, "You don't feel like eating any more junk food at the moment!")
+ return
+ else if(fullness <= 50)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!")
+ else if(fullness > 50 && fullness < 150)
+ eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].")
+ else if(fullness > 150 && fullness < 500)
+ eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].")
+ else if(fullness > 500 && fullness < 600)
+ eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].")
+ else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
+ eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!")
+ return
+
+
+
+
+
+ else //If you're feeding it to someone else.
+ if(isbrain(eater))
+ to_chat(feeder, "[eater] doesn't seem to have a mouth!")
+ return
+ if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
+ eater.visible_message(
+ "[feeder] attempts to feed [eater] [parent].", \
+ "[feeder] attempts to feed you [parent]."
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You feel someone trying to feed you something!")
+ else
+ eater.visible_message(
+ "[feeder] cannot force any more of [parent] down [eater]'s throat!", \
+ "[feeder] cannot force any more of [parent] down your throat!"
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You're too full to eat what's being fed to you!")
+ return
+ if(!do_after(feeder, delay = time_to_eat, target = eater)) //Wait 3 seconds before you can feed
+ return
+ if(IsFoodGone(owner, feeder))
+ return
+ log_combat(feeder, eater, "fed", owner.reagents.log_list())
+ eater.visible_message(
+ "[feeder] forces [eater] to eat [parent]!", \
+ "[feeder] forces you to eat [parent]!"
+ )
+ if(eater.is_blind())
+ to_chat(eater, "You're forced to eat something!")
+
+ TakeBite(eater, feeder)
+
+ //If we're not force-feeding, try take another bite
+ if(eater == feeder && eat_time)
+ INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder)
+
+#undef EAT_TIME_FORCE_FEED
+
+///This function lets the eater take a bite and transfers the reagents to the eater.
+/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder)
+
+ var/atom/owner = parent
+
+ if(!owner?.reagents)
+ return FALSE
+ if(eater.satiety > -200)
+ eater.satiety -= junkiness
+ playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ if(!owner.reagents.total_volume)
+ return
+ SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption)
+ var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
+ owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST)
+ bitecount++
+ check_liked(fraction, eater)
+ if(!owner.reagents.total_volume)
+ on_consume(eater, feeder)
+
+ //Invoke our after eat callback if it is valid
+ if(after_eat)
+ after_eat.Invoke(eater, feeder, bitecount)
+
+ return TRUE
+
+///Checks if we can compost something, and handles it
+/datum/component/edible/proc/compost(mob/living/user)
+ SIGNAL_HANDLER
+ if(on_compost && !on_compost.Invoke(user))
+ return COMPONENT_EDIBLE_BLOCK_COMPOST
+
+///Checks whether or not the eater can actually consume the food
+/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder)
+ if(!iscarbon(eater))
+ return FALSE
+ if(pre_eat && !pre_eat.Invoke(eater, feeder))
+ return FALSE
+ var/mob/living/carbon/C = eater
+ var/covered = ""
+ if(C.is_mouth_covered(head_only = 1))
+ covered = "headgear"
+ else if(C.is_mouth_covered(mask_only = 1))
+ covered = "mask"
+ if(covered)
+ var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]"
+ to_chat(feeder, "You have to remove [who] [covered] first!")
+ return FALSE
+ return TRUE
+
+///Check foodtypes to see if we should send a moodlet
+/datum/component/edible/proc/check_liked(fraction, mob/eater)
+ if(last_check_time + 50 > world.time)
+ return FALSE
+ if(!ishuman(eater))
+ return FALSE
+ var/mob/living/carbon/human/human_eater = eater
+ var/obj/item/organ/tongue/tongue = human_eater.getorganslot(ORGAN_SLOT_TONGUE)
+ if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
+ if(HAS_TRAIT(human_eater, TRAIT_AGEUSIA))
+ if(foodtypes & tongue.toxic_food)
+ to_chat(human_eater, "You don't feel so good...")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ else
+ if(foodtypes & tongue.toxic_food)
+ to_chat(human_eater,"What the hell was that thing?!")
+ human_eater.adjust_disgust(25 + 30 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food)
+ else if(foodtypes & tongue.disliked_food)
+ to_chat(human_eater,"That didn't taste very good...")
+ human_eater.adjust_disgust(11 + 15 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
+ else if(foodtypes & tongue.liked_food)
+ to_chat(human_eater,"I love this taste!")
+ human_eater.adjust_disgust(-5 + -2.5 * fraction)
+ SEND_SIGNAL(human_eater, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food)
+ last_check_time = world.time
+
+///Delete the item when it is fully eaten
+/datum/component/edible/proc/on_consume(mob/living/eater, mob/living/feeder)
+ SEND_SIGNAL(parent, COMSIG_FOOD_CONSUMED, eater, feeder)
+
+ on_consume?.Invoke(eater, feeder)
+
+ if(isturf(parent))
+ var/turf/T = parent
+ T.ScrapeAway(1, CHANGETURF_INHERIT_AIR)
+ else
+ qdel(parent)
+
+///Ability to feed food to puppers
+/datum/component/edible/proc/use_by_animal(datum/source, mob/user)
+ SIGNAL_HANDLER
+ var/atom/owner = parent
+
+ if(!isdog(user))
+ return
+ var/mob/living/L = user
+ if(bitecount == 0 || prob(50))
+ L.manual_emote("nibbles away at \the [parent].")
+ bitecount++
+ . = COMPONENT_CANCEL_ATTACK_CHAIN
+ L.taste(owner.reagents) // why should carbons get all the fun?
+ if(bitecount >= 5)
+ var/satisfaction_text = pick("burps from enjoyment.", "yaps for more!", "woofs twice.", "looks at the area where \the [parent] was.")
+ L.manual_emote(satisfaction_text)
+ qdel(parent)
diff --git a/code/datums/elements/food/food_trash.dm b/code/datums/elements/food/food_trash.dm
new file mode 100644
index 000000000000..6c484c414a07
--- /dev/null
+++ b/code/datums/elements/food/food_trash.dm
@@ -0,0 +1,40 @@
+// If an item has the food_trash element it will drop an item when it is consumed.
+/datum/element/food_trash
+ element_flags = ELEMENT_BESPOKE
+ id_arg_index = 2
+ /// The type of trash that is spawned by this element
+ var/trash
+ ///Flags of the trash element that change its behavior UNUSED UNTIL PART 2
+ //var/flags
+ ///Generate trash proc path
+ var/generate_trash_procpath
+
+/datum/element/food_trash/Attach(datum/target, atom/trash, flags, generate_trash_proc)
+ . = ..()
+ if(!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+ src.trash = trash
+ //src.flags = flags
+ RegisterSignal(target, COMSIG_FOOD_CONSUMED, PROC_REF(generate_trash))
+ if(!generate_trash_procpath && generate_trash_proc)
+ generate_trash_procpath = generate_trash_proc
+
+/datum/element/food_trash/Detach(datum/target)
+ . = ..()
+ UnregisterSignal(target, COMSIG_FOOD_CONSUMED)
+
+/datum/element/food_trash/proc/generate_trash(datum/source, mob/living/eater, mob/living/feeder)
+ SIGNAL_HANDLER
+
+ ///cringy signal_handler shouldnt be needed if you dont want to return but oh well
+ INVOKE_ASYNC(src, PROC_REF(async_generate_trash), source)
+
+/datum/element/food_trash/proc/async_generate_trash(datum/source)
+ var/atom/edible_object = source
+
+ var/obj/item/trash_item = generate_trash_procpath ? call(source, generate_trash_procpath)() : new trash(edible_object.drop_location())
+
+ if(isliving(edible_object.loc))
+ var/mob/living/food_holding_mob = edible_object.loc
+ food_holding_mob.dropItemToGround(edible_object)
+ food_holding_mob.put_in_hands(trash_item)
diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm
new file mode 100644
index 000000000000..503e5169c877
--- /dev/null
+++ b/code/datums/elements/food/processable.dm
@@ -0,0 +1,47 @@
+// If an item has the processable item, it can be processed into another item with a specific tool. This adds generic behavior for those actions to make it easier to set-up generically.
+/datum/element/processable
+ element_flags = ELEMENT_BESPOKE
+ id_arg_index = 2
+ ///The type of atom this creates when the processing recipe is used.
+ var/result_atom_type
+ ///The tool behaviour for this processing recipe
+ var/tool_behaviour
+ ///Time to process the atom
+ var/time_to_process
+ ///Amount of the resulting actor this will create
+ var/amount_created
+ ///Whether or not the atom being processed has to be on a table or tray to process it
+ var/table_required
+
+/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 20, table_required = FALSE)
+ . = ..()
+ if(!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.tool_behaviour = tool_behaviour
+ src.amount_created = amount_created
+ src.time_to_process = time_to_process
+ src.result_atom_type = result_atom_type
+ src.table_required = table_required
+
+ RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour), PROC_REF(try_process))
+
+/datum/element/processable/Detach(datum/target)
+ . = ..()
+ UnregisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour))
+
+/datum/element/processable/proc/try_process(datum/source, mob/living/user, obj/item/I, list/mutable_recipes)
+ SIGNAL_HANDLER
+
+ if(table_required)
+ var/obj/item/found_item = source
+ var/found_location = found_item.loc
+ var/found_turf = isturf(found_location)
+ var/found_table = locate(/obj/structure/table) in found_location
+ var/found_tray = locate(/obj/item/storage/bag/tray) in found_location
+ if(!found_turf && !istype(found_location, /obj/item/storage/bag/tray) || found_turf && !(found_table || found_tray))
+ to_chat(user, "You cannot make that here! You need a table or at least a tray.")
+ return
+
+ mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process))
+ return COMPONENT_NO_AFTERATTACK
diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm
index 1431ab53c6b9..e285f5b1ac6c 100644
--- a/code/datums/mapgen/planetary/SandGenerator.dm
+++ b/code/datums/mapgen/planetary/SandGenerator.dm
@@ -173,10 +173,10 @@
)
/datum/biome/sand/acid //plains
- open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/lit = 10, /turf/open/acid/whitesands = 1)
+ open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/lit = 10, /turf/open/water/acid/whitesands = 1)
/datum/biome/sand/acid/total
- open_turf_types = list(/turf/open/acid/whitesands = 1)
+ open_turf_types = list(/turf/open/water/acid/whitesands = 1)
flora_spawn_chance = 0
feature_spawn_chance = 0
mob_spawn_chance = 0
@@ -228,4 +228,4 @@
open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/dried = 7, /turf/open/lava = 1)
/datum/biome/cave/sand/volcanic/acidic
- open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/dried = 8, /turf/open/acid/whitesands = 1)
+ open_turf_types = list(/turf/open/floor/plating/asteroid/whitesands/dried = 8, /turf/open/water/acid/whitesands = 1)
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 4f505cb2a3e7..1b05f7d7ef95 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -79,6 +79,16 @@ Simple datum which is instanced once per type and is used for every object of sa
/atom/proc/mat_update_desc(/datum/material/mat)
return
+
+/**
+ * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption.
+ * Arguments
+ * * M - person consuming the mat
+ * * S - (optional) item the mat is contained in (NOT the item with the mat itself)
+ */
+/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S)
+ return FALSE
+
///This proc is called when the material is added to an object specifically.
/datum/material/proc/on_applied_obj(obj/o, amount, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 816ffd685c14..6f57fe8adb82 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -42,3 +42,9 @@
id = "crashed_star"
description = "A crashed pirate ship. It would seem that it's crew died a while ago."
suffix = "lavaland_crashed_starwalker.dmm"
+
+/datum/map_template/ruin/lavaland/abandonedlisteningpost
+ name = "Abandoned Listening Post"
+ id = "abandonedlistening"
+ description = "An abandoned Cybersun listening post. Seems like the Ramzi Clique has an interest in the site."
+ suffix = "lavaland_abandonedlisteningpost.dmm"
diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm
index f576f1a93464..ac9e2ffc4081 100644
--- a/code/datums/ruins/rockplanet.dm
+++ b/code/datums/ruins/rockplanet.dm
@@ -29,3 +29,8 @@
id = "rockplanet_nomadcrash"
suffix = "rockplanet_nomadcrash.dmm"
+/datum/map_template/ruin/rockplanet/distillery
+ name = "Frontiersman Distillery"
+ description = "A former pre-ICW era Nanotrasen outpost converted into a moonshine distillery by Frontiersman bootleggers."
+ id = "rockplanet_distillery"
+ suffix = "rockplanet_distillery.dmm"
diff --git a/code/datums/ruins/wasteplanet.dm b/code/datums/ruins/wasteplanet.dm
index 8083567a7c68..3d51594a40c2 100644
--- a/code/datums/ruins/wasteplanet.dm
+++ b/code/datums/ruins/wasteplanet.dm
@@ -23,7 +23,7 @@
suffix = "wasteplanet_unhonorable.dmm"
/datum/map_template/ruin/wasteplanet/abandoned_mechbay
- name = "Abandoned Mech Bay"
- description = "A military base formerly used for staging 4 mechs and crew. God knows what's in it now."
+ name = "Abandoned Exosuit Bay"
+ description = "A military base formerly used for staging 4 exosuits and crew. God knows what's in it now."
id = "abandoned_mechbay"
suffix = "wasteplanet_abandoned_mechbay.dmm"
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index d7b60476d977..31a5e9165d3c 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -358,7 +358,7 @@
name = "Sugarcube Transport"
prefix = "ISV"
-//your subshuttle here
+//your subshuttle here //why is my subshuttle here
/datum/map_template/shuttle/subshuttles/heron
file_name = "nanotrasen_falcon"
name = "Falcon Dropship"
@@ -402,6 +402,11 @@
name = "Nail-class Boarding Vessel"
prefix = "PGF"
+/datum/map_template/shuttle/subshuttles/tanto
+ file_name = "independent_tanto"
+ name = "Tanto-class Drop Pod"
+ prefix = "SV"
+
/datum/map_template/shuttle/subshuttles/brawler
file_name = "frontiersmen_brawler"
name = "Brawler-class Dropship"
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index d1a8fd6acaa5..6bb9ca1200c8 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -105,7 +105,7 @@
if("Clown")
heirloom_type = /obj/item/bikehorn/golden
if("Mime")
- heirloom_type = /obj/item/reagent_containers/food/snacks/baguette
+ heirloom_type = /obj/item/food/baguette
if("Janitor")
heirloom_type = pick(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket, /obj/item/paper/fluff/stations/soap)
if("Cook")
@@ -451,20 +451,19 @@
/datum/quirk/social_anxiety/on_process()
var/nearby_people = 0
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
for(var/mob/living/carbon/human/H in oview(3, quirk_holder))
if(H.client)
nearby_people++
var/mob/living/carbon/human/H = quirk_holder
if(prob(2 + nearby_people))
- H.stuttering = max(3, H.stuttering)
- else if(prob(min(3, nearby_people)) && !H.silent)
- to_chat(H, "You retreat into yourself. You really don't feel up to talking.")
- H.silent = max(10, H.silent)
+ H.stuttering = max(4, H.stuttering)
else if(prob(0.5) && dumb_thing)
to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.")
dumb_thing = FALSE //only once per life
if(prob(1))
- new/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code
+ new/obj/item/food/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code
// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
@@ -479,6 +478,8 @@
/datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner)
SIGNAL_HANDLER
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
if(prob(75))
return
var/msg
diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm
new file mode 100644
index 000000000000..b5805557eafa
--- /dev/null
+++ b/code/datums/wires/mod.dm
@@ -0,0 +1,57 @@
+/datum/wires/mod
+ holder_type = /obj/item/mod/control
+ proper_name = "MOD control unit"
+
+/datum/wires/mod/New(atom/holder)
+ wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE)
+ add_duds(2)
+ ..()
+
+/datum/wires/mod/interactable(mob/user)
+ if(!..())
+ return FALSE
+ var/obj/item/mod/control/mod = holder
+ return mod.open
+
+/datum/wires/mod/get_status()
+ var/obj/item/mod/control/mod = holder
+ var/list/status = list()
+ status += "The orange light is [mod.seconds_electrified ? "on" : "off"]."
+ status += "The red light is [mod.malfunctioning ? "off" : "blinking"]."
+ status += "The green light is [mod.locked ? "on" : "off"]."
+ status += "The yellow light is [mod.interface_break ? "off" : "on"]."
+ return status
+
+/datum/wires/mod/on_pulse(wire)
+ var/obj/item/mod/control/mod = holder
+ switch(wire)
+ if(WIRE_HACK)
+ mod.locked = !mod.locked
+ if(WIRE_DISABLE)
+ mod.malfunctioning = TRUE
+ if(WIRE_SHOCK)
+ mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME
+ if(WIRE_INTERFACE)
+ mod.interface_break = !mod.interface_break
+
+/datum/wires/mod/on_cut(wire, mend)
+ var/obj/item/mod/control/mod = holder
+ switch(wire)
+ if(WIRE_HACK)
+ if(!mend)
+ mod.req_access = list()
+ if(WIRE_DISABLE)
+ mod.malfunctioning = !mend
+ if(WIRE_SHOCK)
+ if(mend)
+ mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED
+ else
+ mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT
+ if(WIRE_INTERFACE)
+ mod.interface_break = !mend
+
+/datum/wires/mod/ui_act(action, params)
+ var/obj/item/mod/control/mod = holder
+ if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr))
+ return FALSE
+ return ..()
diff --git a/code/game/MapData/shuttles/nanotrasen_ranger.dm b/code/game/MapData/shuttles/nanotrasen_ranger.dm
index 1766cd11ee0c..40f7816c2eb0 100644
--- a/code/game/MapData/shuttles/nanotrasen_ranger.dm
+++ b/code/game/MapData/shuttles/nanotrasen_ranger.dm
@@ -101,7 +101,7 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/lp
resistance_flags = null
max_heat_protection_temperature = null
- slowdown = 1.2
+ supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION
/obj/item/clothing/head/helmet/space/hardsuit/ert/lp
armor = list("melee" = 50, "bullet" = 40, "laser" = 30, "energy" = 40, "bomb" = 35, "bio" = 100, "rad" = 60, "fire" = 50, "acid" = 80)
@@ -111,7 +111,7 @@
max_heat_protection_temperature = null
/obj/item/clothing/suit/space/hardsuit/ert/lp/sec
- armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 50, "fire" = 40, "acid" = 40)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/lp/sec
name = "Loss Prevention Security Hardsuit"
desc = "The best of the best security staff get assigned to the ERT. Second best are given this Hardsuit as a part of the LP Team."
@@ -119,7 +119,7 @@
item_state = "ert_security"
/obj/item/clothing/head/helmet/space/hardsuit/ert/lp/sec
- armor = list("melee" = 35, "bullet" = 20, "laser" = 30,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 20,"energy" = 20, "bomb" = 20, "bio" = 100, "rad" = 50, "fire" = 40, "acid" = 40)
hardsuit_type = "ert_security"
name = "Loss Prevention Security Hardsuit Helmet"
desc = "The helmet that comes attached to the LP Team Security Hardsuit."
@@ -127,7 +127,7 @@
item_state = "hardsuit0-ert_security"
/obj/item/clothing/suit/space/hardsuit/ert/lp/engi
- armor = list("melee" = 30, "bullet" = 15, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 100, "rad" = 75, "fire" = 90, "acid" = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/lp/engi
name = "Loss Prevention Engineering Hardsuit"
desc = "The best of the best engineering staff get assigned to the ERT. Second best are given this Hardsuit as a part of the LP Team."
@@ -135,7 +135,7 @@
item_state = "ert_engineer"
/obj/item/clothing/head/helmet/space/hardsuit/ert/lp/engi
- armor = list("melee" = 30, "bullet" = 15, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 38, "bullet" = 20, "laser" = 30, "energy" = 30, "bomb" = 25, "bio" = 100, "rad" = 75, "fire" = 90, "acid" = 75)
name = "Loss Prevention Engineering Hardsuit Helmet"
desc = "The helmet that comes attached to the LP Team Engineering Hardsuit."
icon_state = "hardsuit0-ert_engineer"
@@ -143,25 +143,27 @@
hardsuit_type = "ert_engineer"
/obj/item/clothing/suit/space/hardsuit/ert/lp/med
- armor = list("melee" = 30, "bullet" = 15, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
+ armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 25, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 60)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/lp/med
name = "Loss Prevention Medical Hardsuit"
desc = "The best of the best medical staff get assigned to the ERT. Second best are given this Hardsuit as a part of the LP Team."
icon_state = "ert_medical"
item_state = "ert_medical"
+ slowdown = 0.5
/obj/item/clothing/head/helmet/space/hardsuit/ert/lp/med
- armor = list("melee" = 30, "bullet" = 15, "laser" = 15, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
+ armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 25, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 60)
name = "Loss Prevention Medical Hardsuit Helmet"
desc = "The helmet that comes attached to the LP Team Medical Hardsuit."
icon_state = "hardsuit0-ert_medical"
item_state = "hardsuit0-ert_medical"
hardsuit_type = "ert_medical"
+ clothing_flags = SCAN_REAGENTS
/obj/item/clothing/head/helmet/space/hardsuit/lp
name = "RIG heatsuit helmet"
desc = "The helmet to the RIG heat suit. It's packed with heat diverting materials, coolant pipes, and a two inch thick face screen."
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 1, "energy" = 1, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF
@@ -286,7 +288,7 @@
"}
/obj/item/disk/holodisk/lp/retrieval/phazon
- name = "Retrieval Mission Secret Mecha"
+ name = "Retrieval Mission Secret Exosuit"
desc = "A holodisk containing a retrieval mission for the LP."
preset_image_type = /datum/preset_holoimage/commissioner
preset_record_text = {"
diff --git a/code/game/MapData/shuttles/pgf_crying_sun.dm b/code/game/MapData/shuttles/pgf_crying_sun.dm
index 6df40aa0efdd..2851518e669a 100644
--- a/code/game/MapData/shuttles/pgf_crying_sun.dm
+++ b/code/game/MapData/shuttles/pgf_crying_sun.dm
@@ -2,7 +2,7 @@
name = "The UCWLWM"
desc = "It's looks old and worn out."
icon_state = "book3"
- author = "Welds-the-Steel"
+ author = "Senior Engineer Wihlz-Saai"
title = "The Universal Colossal Warship Linear Weapon Mount"
dat = {"
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index f7cbb414bc00..317fd67a67b8 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -85,3 +85,24 @@
/area/ruin/unpowered/crashed_starwalker
name = "Crashed Pirate Ship"
+// Abandoned Listening Post
+
+/area/ruin/unpowered/listening_post
+ name = "Listening Post Lobby"
+ icon_state = "yellow"
+
+/area/ruin/unpowered/listening_post/commons
+ name = "Listening Post Commons"
+ icon_state = "green"
+
+/area/ruin/unpowered/listening_post/canteen
+ name = "Listening Post Canteen"
+ icon_state = "purple"
+
+/area/ruin/unpowered/listening_post/operations
+ name = "Listening Post Operations"
+ icon_state = "hallC"
+
+/area/ruin/unpowered/listening_post/engineering
+ name = "Listening Post Engineering"
+ icon_state = "dk_yellow"
diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm
index 43516a72376a..1b9f89a46ff8 100644
--- a/code/game/area/areas/ruins/rockplanet.dm
+++ b/code/game/area/areas/ruins/rockplanet.dm
@@ -32,3 +32,29 @@
name = "Abandoned Crash Site"
always_unpowered = FALSE
icon_state = "red"
+
+//distillery
+
+/area/ruin/rockplanet/distillery
+ name = "Distillery"
+ icon_state = "red"
+
+/area/ruin/rockplanet/distillery/saloon
+ name = "Saloon"
+ icon_state = "bar"
+
+/area/ruin/rockplanet/distillery/shuttle
+ name = "Frontiersman Pod"
+ icon_state = "shuttle"
+
+/area/ruin/rockplanet/distillery/crew
+ name = "Crew Area"
+ icon_state = "crew_quarters"
+
+/area/ruin/rockplanet/distillery/engineering
+ name = "Engineering"
+ icon_state = "engine"
+
+/area/ruin/rockplanet/distillery/office
+ name = "Office"
+ icon_state = "vacant_office"
diff --git a/code/game/area/areas/ruins/wasteplanet.dm b/code/game/area/areas/ruins/wasteplanet.dm
index 4b1e69b456d2..e80cb364c3ea 100644
--- a/code/game/area/areas/ruins/wasteplanet.dm
+++ b/code/game/area/areas/ruins/wasteplanet.dm
@@ -3,31 +3,31 @@
//Abandoned Mechbay Ruin
/area/ruin/wasteplanet/abandoned_mechbay/mainhall
- name = "Abandoned Mechbay Main Corridor"
+ name = "Abandoned Exosuit Bay Main Corridor"
icon_state = "hallC"
/area/ruin/wasteplanet/abandoned_mechbay/commandcontrol
- name = "Abandoned Mechbay Command and Control"
+ name = "Abandoned Exosuit Bay Command and Control"
icon_state = "bridge"
/area/ruin/wasteplanet/abandoned_mechbay/bay1
- name = "Abandoned Mechbay Upper Hangar"
+ name = "Abandoned Exosuit Bay Upper Hangar"
icon_state = "mechbay"
/area/ruin/wasteplanet/abandoned_mechbay/bay2
- name = "Abandoned Mechbay Lower Hangar"
+ name = "Abandoned Exosuit Bay Lower Hangar"
icon_state = "mechbay"
/area/ruin/wasteplanet/abandoned_mechbay/crewquarters
- name = "Abandoned Mechbay Crew Quarters"
+ name = "Abandoned Exosuit Bay Crew Quarters"
icon_state = "green"
/area/ruin/wasteplanet/abandoned_mechbay/mechlab
- name = "Abandoned Mech Lab"
+ name = "Abandoned Exosuit Lab"
icon_state = "mechbay"
/area/ruin/wasteplanet/abandoned_mechbay/engineering
- name = "Abandoned Mechbay Engineering"
+ name = "Abandoned Exosuit Bay Engineering"
icon_state = "engine"
//Abandoned Waste Site
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7ffa3255ada1..f059ae475640 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -44,6 +44,14 @@
*/
var/list/atom_colours
+ /// Lazylist of all images (hopefully attached to us) to update when we change z levels
+ /// You will need to manage adding/removing from this yourself, but I'll do the updating for you
+ var/list/image/update_on_z
+
+ /// Lazylist of all overlays attached to us to update when we change z levels
+ /// You will need to manage adding/removing from this yourself, but I'll do the updating for you
+ /// Oh and note, if order of addition is important this WILL break that. so mind yourself
+ var/list/image/update_overlays_on_z
/// a very temporary list of overlays to remove
var/list/remove_overlays
@@ -977,7 +985,7 @@
return TRUE
///Get the best place to dump the items contained in the source storage item?
-/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
+/atom/proc/get_dumping_location()
return null
/**
@@ -1265,25 +1273,71 @@
* Must return parent proc ..() in the end if overridden
*/
/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
+ var/signal_result
+
+ var/list/processing_recipes = list() //List of recipes that can be mutated by sending the signal
+ signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, I, processing_recipes)
+ if(processing_recipes.len)
+ process_recipes(user, I, processing_recipes)
+ if(QDELETED(I))
+ return TRUE
switch(tool_type)
if(TOOL_CROWBAR)
- . |= crowbar_act(user, I)
+ . = crowbar_act(user, I)
if(TOOL_MULTITOOL)
- . |= multitool_act(user, I)
+ . = multitool_act(user, I)
if(TOOL_SCREWDRIVER)
- . |= screwdriver_act(user, I)
+ . = screwdriver_act(user, I)
if(TOOL_WRENCH)
- . |= wrench_act(user, I)
+ . = wrench_act(user, I)
if(TOOL_WIRECUTTER)
- . |= wirecutter_act(user, I)
+ . = wirecutter_act(user, I)
if(TOOL_WELDER)
- . |= welder_act(user, I)
+ . = welder_act(user, I)
if(TOOL_ANALYZER)
- . |= analyzer_act(user, I)
- if(. & COMPONENT_BLOCK_TOOL_ATTACK)
+ . = analyzer_act(user, I)
+ if(. || signal_result & COMPONENT_BLOCK_TOOL_ATTACK) //Either the proc or the signal handled the tool's events in some way.
return TRUE
-//! Tool-specific behavior procs. They send signals, so try to call ..()
+/atom/proc/process_recipes(mob/living/user, obj/item/I, list/processing_recipes)
+ //Only one recipe? use the first
+ if(processing_recipes.len == 1)
+ StartProcessingAtom(user, I, processing_recipes[1])
+ return
+ //Otherwise, select one with a radial
+ ShowProcessingGui(user, I, processing_recipes)
+
+///Creates the radial and processes the selected option
+/atom/proc/ShowProcessingGui(mob/living/user, obj/item/I, list/possible_options)
+ var/list/choices_to_options = list() //Dict of object name | dict of object processing settings
+ var/list/choices = list()
+
+ for(var/i in possible_options)
+ var/list/current_option = i
+ var/atom/current_option_type = current_option[TOOL_PROCESSING_RESULT]
+ choices_to_options[initial(current_option_type.name)] = current_option
+ var/image/option_image = image(icon = initial(current_option_type.icon), icon_state = initial(current_option_type.icon_state))
+ choices += list("[initial(current_option_type.name)]" = option_image)
+
+ var/pick = show_radial_menu(user, src, choices, radius = 36, require_near = TRUE)
+
+ StartProcessingAtom(user, I, choices_to_options[pick])
+
+
+/atom/proc/StartProcessingAtom(mob/living/user, obj/item/I, list/chosen_option)
+ to_chat(user, "You start working on [src]")
+ if(I.use_tool(src, user, chosen_option[TOOL_PROCESSING_TIME], volume=50))
+ var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT]
+ for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT])
+ new atom_to_create(loc)
+ to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)] from [src]")
+ qdel(src)
+ return
+
+/atom/proc/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom)
+ return
+
+//! Tool-specific behavior procs.
///
///Crowbar act
@@ -1587,6 +1641,15 @@
if(istype(ship))
var/obj/docking_port/mobile/shuttle = ship.mobile_port
if(shuttle)
+ if(istype(shuttle.docked, /obj/docking_port/stationary))
+ var/obj/docking_port/stationary/shipfinder = shuttle.docked
+ if(shipfinder.owner_ship)
+ for(var/datum/weakref/weakref as anything in shipfinder.owner_ship.gravgen_list)
+ var/obj/machinery/power/ship_gravity/SG = weakref.resolve()
+ if(!SG)
+ shipfinder.owner_ship.gravgen_list -= weakref
+ continue
+ max_grav = max(SG.active,max_grav)
for(var/datum/weakref/weakref as anything in shuttle.gravgen_list)
var/obj/machinery/power/ship_gravity/SG = weakref.resolve()
if(!SG)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index beb7cef2718f..79326ab9e2ad 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -772,6 +772,44 @@
. = movement_type
movement_type = newval
+/**
+ * Called when a movable changes z-levels.
+ *
+ * Arguments:
+ * * old_turf - The previous turf they were on before.
+ * * new_turf - The turf they have now entered.
+ * * same_z_layer - If their old and new z levels are on the same level of plane offsets or not
+ * * notify_contents - Whether or not to notify the movable's contents that their z-level has changed. NOTE, IF YOU SET THIS, YOU NEED TO MANUALLY SET PLANE OF THE CONTENTS LATER
+ */
+/atom/movable/proc/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents = TRUE)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_turf, new_turf, same_z_layer)
+
+ // If our turfs are on different z "layers", recalc our planes
+ if(!same_z_layer && !QDELETED(src))
+ SET_PLANE(src, PLANE_TO_TRUE(src.plane), new_turf)
+ // a TON of overlays use planes, and thus require offsets
+ // so we do this. sucks to suck
+ update_appearance()
+
+ if(update_on_z)
+ // I so much wish this could be somewhere else. alas, no.
+ for(var/image/update in update_on_z)
+ SET_PLANE(update, PLANE_TO_TRUE(update.plane), new_turf)
+ if(update_overlays_on_z)
+ // This EVEN more so
+ cut_overlay(update_overlays_on_z)
+ // This even more so
+ for(var/mutable_appearance/update in update_overlays_on_z)
+ SET_PLANE(update, PLANE_TO_TRUE(update.plane), new_turf)
+ add_overlay(update_overlays_on_z)
+
+ if(!notify_contents)
+ return
+
+ for (var/atom/movable/content as anything in src) // Notify contents of Z-transition.
+ content.on_changed_z_level(old_turf, new_turf, same_z_layer)
+
/**
* Called whenever an object moves and by mobs when they attempt to move themselves through space
* And when an object or action applies a force on src, see [newtonian_move][/atom/movable/proc/newtonian_move]
@@ -784,6 +822,9 @@
* * movement_dir - 0 when stopping or any dir when trying to move
*/
/atom/movable/proc/Process_Spacemove(movement_dir = 0)
+ if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir) & COMSIG_MOVABLE_STOP_SPACEMOVE)
+ return TRUE
+
if(has_gravity(src))
return 1
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 589393479ff5..41760633726e 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -111,6 +111,24 @@
smoothing_groups = list(SMOOTH_GROUP_SANDBAGS)
canSmoothWith = list(SMOOTH_GROUP_SANDBAGS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SECURITY_BARRICADE)
+/obj/structure/barricade/sandbags/MouseDrop(over_object, src_location, over_location)
+ . = ..()
+ if(over_object == usr && Adjacent(usr))
+ if(src.flags_1 & NODECONSTRUCT_1)
+ return
+ if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)))
+ return
+ usr.visible_message(span_notice("[usr] begins pulling apart \the [src.name]..."), span_notice("You begin pulling apart \the [src.name]..."))
+ if(do_after(usr, 30, usr))
+ deconstruct()
+
+/obj/structure/barricade/sandbags/make_debris()
+ new /obj/item/stack/sheet/mineral/sandbags(get_turf(src), 1)
+
+/obj/structure/barricade/sandbags/examine(mob/user)
+ . = ..()
+ . += span_notice("You could probably pull the [src.name] by dragging it onto yourself.")
+
/obj/structure/barricade/security
name = "security barrier"
desc = "A deployable barrier. Provides good cover in fire fights."
diff --git a/code/game/machinery/outpost_electrolyzer.dm b/code/game/machinery/outpost_electrolyzer.dm
index 29a37c4f95e8..b91160c7e1c8 100644
--- a/code/game/machinery/outpost_electrolyzer.dm
+++ b/code/game/machinery/outpost_electrolyzer.dm
@@ -38,16 +38,6 @@
var/obj/machinery/mineral/electrolyzer/linked_electrolyzer
-/obj/machinery/computer/electrolyzer_console/Initialize()
- . = ..()
- find_electrolyzer()
-
-/obj/machinery/computer/electrolyzer_console/proc/find_electrolyzer()
- for(var/obj/machinery/mineral/electrolyzer/potential in oview(3,src))
- if(linked_electrolyzer == null)
- linked_electrolyzer = potential
- potential.linked_console = src
-
/obj/machinery/computer/electrolyzer_console/proc/electrolyze_item(obj/item/I)
var/obj/item/stack/ore/ice/S = I
var/meritval = round(S.get_amount() * MERITS_PER_ICE * OUTPOST_HYDROGEN_CUT,1) // causes a bit of surplus in the "outpost" supply, even if they use all of these merits for hydrogen.
@@ -61,6 +51,7 @@
var/obj/item/multitool/multi = item
if(istype(multi.buffer, /obj/machinery/mineral/electrolyzer))
linked_electrolyzer = multi.buffer
+ linked_electrolyzer.linked_console = src
visible_message("Linked to [linked_electrolyzer]!")
return
return ..()
@@ -88,7 +79,17 @@
)
AddElement(/datum/element/connect_loc, loc_connections)
-/obj/machinery/computer/electrolyzer_console/attackby(item,mob/user)
+/obj/machinery/mineral/electrolyzer/proc/find_electrolyzer()
+ if(linked_console)
+ return TRUE
+ for(var/obj/machinery/computer/electrolyzer_console/potential in oview(3,src))
+ if(linked_console == null)
+ linked_console = potential
+ potential.linked_electrolyzer = src
+ return TRUE
+ return FALSE
+
+/obj/machinery/mineral/electrolyzer/attackby(item,mob/user)
if(istype(item, /obj/item/multitool))
var/obj/item/multitool/multi = item
multi.buffer = src
@@ -108,6 +109,10 @@
INVOKE_ASYNC(src, PROC_REF(electrolyze), AM)
/obj/machinery/mineral/electrolyzer/proc/electrolyze(atom/movable/electrolyze_target, sound=TRUE)
+ if(!find_electrolyzer())
+ visible_message("[src] doesn't have a linked console!")
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE, 1)
+ return
if(istype(electrolyze_target, /obj/effect) || !linked_console || !isturf(electrolyze_target.loc) || (machine_stat & (BROKEN|NOPOWER)))
return
if(!istype(electrolyze_target, /obj/item/stack/ore/ice))
@@ -448,15 +453,15 @@
return ..()
/obj/item/merit/bundle/attack_self(mob/user)
+ if(!Adjacent(user))
+ to_chat(user, "You need to be in arm's reach for that!")
+ return
+
var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
cashamount = round(clamp(cashamount, 0, value))
if(!cashamount)
return
- if(!Adjacent(user))
- to_chat(user, "You need to be in arm's reach for that!")
- return
-
value -= cashamount
if(!value)
user.dropItemToGround(src)
@@ -464,18 +469,20 @@
var/obj/item/merit/bundle/bundle = new (user.loc)
bundle.value = cashamount
+ bundle.update_appearance()
+ user.put_in_hands(bundle)
update_appearance()
/obj/item/merit/bundle/AltClick(mob/living/user)
+ if(!Adjacent(user))
+ to_chat(user, "You need to be in arm's reach for that!")
+ return
+
var/cashamount = input(user, "How many merits do you want to take? (0 to [value])", "Take Merits", 20) as num
cashamount = round(clamp(cashamount, 0, value))
if(!cashamount)
return
- else if(!Adjacent(user))
- to_chat(user, "You need to be in arm's reach for that!")
- return
-
value -= cashamount
if(!value)
user.dropItemToGround(src)
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index 7d0455ab82f0..a3fc7082f1be 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -14,6 +14,7 @@
var/teleporting = FALSE //if it's in the process of teleporting
var/power_efficiency = 1
var/obj/machinery/quantumpad/linked_pad
+ var/restrain_vlevel = TRUE
//mapping
var/static/list/mapped_quantum_pads = list()
@@ -177,7 +178,7 @@
else if(!isobserver(ROI))
continue
- do_teleport(ROI, get_turf(target_pad),null,null,null,null,null,TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
+ do_teleport(ROI, get_turf(target_pad),null,null,null,null,null,TRUE, channel = TELEPORT_CHANNEL_QUANTUM, restrain_vlevel = restrain_vlevel)
CHECK_TICK
/obj/machinery/quantumpad/proc/initMappedLink()
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index df865aee82e5..47db5ce6d0ef 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -418,7 +418,7 @@
active = FALSE
log_game("[src] was deactivated by [key_name(user)] at [AREACOORD(src)]")
else
- user.visible_message(span_notice("[user] turned \the [src] on."), span_notice("ou turn on \the [src]."), span_hear("ou hear heavy droning."))
+ user.visible_message(span_notice("[user] turned \the [src] on."), span_notice("You turn on \the [src]."), span_hear("You hear heavy droning."))
active = ACTIVE_SETUPFIELDS
log_game("[src] was activated by [key_name(user)] at [AREACOORD(src)]")
add_fingerprint(user)
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 2b440f926c32..f8fa1d1ef786 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -5,13 +5,14 @@
//it for the engine.
//-----------------------------------------------
+#define CHLORINE_OXIDATION_VALUE 0.5
#define O2_OXIDATION_VALUE 1
#define NITRYL_OXIDATION_VALUE 1
#define NITROUS_OXIDATION_VALUE 3
+#define HYDROGEN_THRUSTER_VALUE 0.5
#define PLASMA_THRUSTER_VALUE 1
#define TRITRIUM_THRUSTER_VALUE 3
-#define HYDROGEN_THRUSTER_VALUE 0.5
#define NITROUS_COOLING_MULTIPIER 500
#define NITROUS_COOLING_MIN 173
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 107c5656c034..f6be0b0a036e 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -16,6 +16,7 @@
var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
var/obj/item/clothing/mask/mask = null
+ var/obj/item/mod/control/mod = null
var/obj/item/storage = null
// if you add more storage slots, update cook() to clear their radiation too.
@@ -27,6 +28,8 @@
var/mask_type = null
/// What type of additional item the unit starts with when spawned.
var/storage_type = null
+ /// What type of MOD the unit starts with when spawned.
+ var/mod_type = null
state_open = FALSE
/// If the SSU's doors are locked closed. Can be toggled manually via the UI, but is also locked automatically when the UV decontamination sequence is running.
@@ -194,6 +197,8 @@
helmet = new helmet_type(src)
if(mask_type)
mask = new mask_type(src)
+ if(mod_type)
+ mod = new mod_type(src)
if(storage_type)
storage = new storage_type(src)
update_appearance()
@@ -215,6 +220,7 @@
QDEL_NULL(suit)
QDEL_NULL(helmet)
QDEL_NULL(mask)
+ QDEL_NULL(mod)
QDEL_NULL(storage)
return ..()
@@ -225,19 +231,19 @@
. += "[base_icon_state]_panel"
if(state_open)
. += "[base_icon_state]_open"
- if(suit)
+ if(suit || mod)
. += "[base_icon_state]_suit"
if(helmet)
. += "[base_icon_state]_helm"
if(storage)
. += "[base_icon_state]_storage"
- if(uv && uv_super)
- . += "[base_icon_state]_super"
if(!(machine_stat & BROKEN || machine_stat & NOPOWER))
if(state_open)
. += "[base_icon_state]_lights_open"
else
if(uv)
+ if(uv_super)
+ . += "[base_icon_state]_super"
. += "[base_icon_state]_lights_red"
else
. += "[base_icon_state]_lights_closed"
@@ -247,6 +253,8 @@
. += "[base_icon_state]_uvstrong"
else
. += "[base_icon_state]_uv"
+ else if(locked)
+ . += "[base_icon_state]_locked"
else
. += "[base_icon_state]_ready"
@@ -263,6 +271,7 @@
helmet = null
suit = null
mask = null
+ mod = null
storage = null
occupant = null
@@ -289,6 +298,7 @@
"suit" = create_silhouette_of(/obj/item/clothing/suit/space/eva),
"helmet" = create_silhouette_of(/obj/item/clothing/head/helmet/space/eva),
"mask" = create_silhouette_of(/obj/item/clothing/mask/breath),
+ "mod" = create_silhouette_of(/obj/item/mod/control),
"storage" = create_silhouette_of(/obj/item/tank/internals/oxygen),
)
@@ -340,8 +350,10 @@
close_machine()
if ("disinfect")
if (occupant && safeties)
+ say("Alert: safeties triggered, occupant detected!")
return
else if (!helmet && !mask && !suit && !storage && !occupant)
+ to_chat(user, span_notice("There's nothing inside [src] to disinfect!"))
return
else
if (occupant)
@@ -351,6 +363,7 @@
if ("lock", "unlock")
if (!state_open)
locked = !locked
+ update_icon()
else
var/obj/item/item_to_dispense = vars[choice]
if (item_to_dispense)
@@ -397,7 +410,7 @@
if(!is_operational)
to_chat(user, span_warning("The unit is not operational!"))
return
- if(occupant || helmet || suit || storage)
+ if(occupant || helmet || suit || mod || storage)
to_chat(user, span_warning("It's too cluttered inside to fit in!"))
return
@@ -407,7 +420,7 @@
target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!"))
if(do_after(user, 30, target))
- if(occupant || helmet || suit || storage)
+ if(occupant || helmet || suit || mod || storage)
return
if(target == user)
user.visible_message(span_warning("[user] slips into [src] and closes the door behind [user.p_them()]!"), span_notice("You slip into [src]'s cramped space and shut its door."))
@@ -452,6 +465,8 @@
qdel(suit) // Delete everything but the occupant.
mask = null
qdel(mask)
+ mod = null
+ qdel(mod)
storage = null
qdel(storage)
// The wires get damaged too.
@@ -479,6 +494,9 @@
if(mask)
things_to_clear += mask
things_to_clear += mask.GetAllContents()
+ if(mod)
+ things_to_clear += mod
+ things_to_clear += mod.GetAllContents()
if(storage)
things_to_clear += storage
things_to_clear += storage.GetAllContents()
@@ -565,6 +583,13 @@
if(!user.transferItemToLoc(I, src))
return
mask = I
+ else if(istype(I, /obj/item/mod/control))
+ if(mod)
+ to_chat(user, span_warning("The unit already contains a MOD!"))
+ return
+ if(!user.transferItemToLoc(I, src))
+ return
+ mod = I
else
if(storage)
to_chat(user, span_warning("The auxiliary storage compartment is full!"))
@@ -631,6 +656,9 @@
else if(istype(AM, /obj/item/clothing/mask) && !mask)
AM.forceMove(src)
mask = AM
+ else if(istype(AM, /obj/item/mod/control) && !storage)
+ AM.forceMove(src)
+ mod = AM
else if(istype(AM, /obj/item) && !storage)
AM.forceMove(src)
storage = AM
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index cf89811d5f09..67d47ede3277 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -12,6 +12,7 @@
force = 40
wreckage = /obj/structure/mecha_wreckage/durand
var/obj/durand_shield/shield
+ var/shield_passive_drain = 300
/obj/mecha/combat/durand/clip
@@ -46,7 +47,7 @@
/obj/mecha/combat/durand/process()
. = ..()
- if(defense_mode && !use_power(100))
+ if(defense_mode && !use_power(max(0, shield_passive_drain - (scanmod.rating * 10))))
defense_action.Activate(forced_state = TRUE)
/obj/mecha/combat/durand/domove(direction)
@@ -226,7 +227,7 @@ the shield is disabled by means other than the action button (like running out o
return
. = ..()
flick("shield_impact", src)
- if(!chassis.use_power((max_integrity - obj_integrity) * 100))
+ if(!chassis.use_power(max(1, (max_integrity - obj_integrity + 15) * (10 - chassis.capacitor.rating))))
chassis.cell?.charge = 0
chassis.defense_action.Activate(forced_state = TRUE)
obj_integrity = 10000
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 5774716fca71..5fe5d9350c14 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -14,7 +14,7 @@
wreckage = /obj/structure/mecha_wreckage/gygax
internal_damage_threshold = 35
max_equip = 3
- step_energy_drain = 3
+ base_step_energy_drain = 8
/obj/mecha/combat/gygax/mechturn(direction)
. = ..()
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index 95b60eba68d8..f1c48e8cc307 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -4,7 +4,7 @@
icon_state = "phazon"
step_in = 2
dir_in = 2 //Facing South.
- step_energy_drain = 3
+ base_step_energy_drain = 8
max_integrity = 200
deflect_chance = 30
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 50, "fire" = 100, "acid" = 100)
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index 0d11859352d8..b63487ca17a5 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -14,7 +14,7 @@
add_req_access = 0
internal_damage_threshold = 25
max_equip = 2
- step_energy_drain = 3
+ base_step_energy_drain = 8
color = "#87878715"
stepsound = null
turnsound = null
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 63d308f69558..b7f225306b01 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -2,7 +2,7 @@
//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit.
/obj/item/mecha_parts/mecha_equipment
- name = "mecha equipment"
+ name = "exosuit equipment"
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_equip"
force = 5
diff --git a/code/game/mecha/equipment/tools/weapon_bay.dm b/code/game/mecha/equipment/tools/weapon_bay.dm
index 5fe3e14880f4..bd8497e9774e 100644
--- a/code/game/mecha/equipment/tools/weapon_bay.dm
+++ b/code/game/mecha/equipment/tools/weapon_bay.dm
@@ -1,6 +1,6 @@
/obj/item/mecha_parts/concealed_weapon_bay
name = "concealed weapon bay"
- desc = "A compartment that allows a non-combat mecha to equip one weapon while hiding the weapon from plain sight."
+ desc = "A compartment that allows a civilian exosuit to equip one weapon while hiding the weapon from plain sight."
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_weapon_bay"
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 95e7b2f07224..ee8481255f2d 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -493,8 +493,8 @@
//Dunno where else to put this so shrug
/obj/item/mecha_parts/mecha_equipment/conversion_kit
- name = "Mecha Conversion Kit"
- desc = "A perfectly generic conversion kit for a perfectly generic mecha. How did you even get this?"
+ name = "Exosuit Conversion Kit"
+ desc = "A perfectly generic conversion kit for a perfectly generic exosuit. How did you even get this?"
icon_state = "ripleyupgrade"
var/source_mech = list(null) //must be a list due to the mining ripley existing
var/result_mech = null
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index b0b40ea0877e..f09c529b45a1 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -1,5 +1,5 @@
/obj/item/mecha_parts/mecha_equipment/weapon
- name = "mecha weapon"
+ name = "exosuit weapon"
range = MECHA_RANGED
destroy_sound = 'sound/mecha/weapdestr.ogg'
var/projectile
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index ca24240b4f2e..04a2ef75bc40 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -1,6 +1,6 @@
/turf/open/floor/mech_bay_recharge_floor // Whos idea it was
- name = "mech bay recharge station" // Recharging turfs
- desc = "Parking a mech on this station will recharge its internal power cell."
+ name = "exosuit bay recharge station" // Recharging turfs
+ desc = "Parking an exosuit on this station will recharge its internal power cell."
icon = 'icons/turf/floors.dmi' // That are set in stone to check the west turf for recharge port
icon_state = "recharge_floor" // Some people just want to watch the world burn i guess
@@ -12,8 +12,8 @@
initial_gas_mix = AIRLESS_ATMOS
/obj/machinery/mech_bay_recharge_port
- name = "mech bay power port"
- desc = "This port recharges a mech's internal power cell."
+ name = "exosuit bay power port"
+ desc = "This port recharges an exosuit's internal power cell."
density = TRUE
dir = EAST
icon = 'icons/mecha/mech_bay.dmi'
@@ -81,8 +81,8 @@
return ..()
/obj/machinery/computer/mech_bay_power_console
- name = "mech bay power control console"
- desc = "Displays the status of mechs connected to the recharge station."
+ name = "exosuit bay power control console"
+ desc = "Displays the status of exosuits connected to the recharge station."
icon_screen = "recharge_comp"
icon_keyboard = "rd_key"
circuit = /obj/item/circuitboard/computer/mech_bay_power_console
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 48cc0388b508..b903564c88d6 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1,5 +1,5 @@
/obj/mecha
- name = "mecha"
+ name = "exosuit"
desc = "Exosuit"
icon = 'icons/mecha/mecha.dmi'
density = TRUE //Dense. To raise the heat.
@@ -18,8 +18,8 @@
var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
- var/normal_step_energy_drain = 10 //How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain.
- var/step_energy_drain = 10
+ var/base_step_energy_drain = 15 //The base amount of energy the mech should consume each time it moves. This variable is a backup for when leg actuators affect the energy drain.
+ var/step_energy_drain // How much energy the mech actually consumes when moving after modifiers (Eg, stock parts, leg actuators)
var/melee_energy_drain = 15
var/overload_step_energy_drain_min = 100
max_integrity = 300 //max_integrity is base health
@@ -147,6 +147,7 @@
diag_hud_set_mechcell()
diag_hud_set_mechstat()
become_hearing_sensitive(ROUNDSTART_TRAIT)
+ update_part_values()
/obj/mecha/update_icon_state()
if(silicon_pilot && silicon_icon_state)
@@ -225,11 +226,9 @@
/obj/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted.
if(scanmod)
- normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
- step_energy_drain = normal_step_energy_drain
+ step_energy_drain = max(1, base_step_energy_drain - (5 * scanmod.rating)) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best
else
- normal_step_energy_drain = 500
- step_energy_drain = normal_step_energy_drain
+ step_energy_drain = 500
if(capacitor)
armor = armor.modifyRating(energy = (capacitor.rating * 5)) //Each level of capacitor protects the mech against emp by 5%
else //because we can still be hit without a cap, even if we can't move
@@ -404,13 +403,13 @@
var/integrity = obj_integrity/max_integrity*100
switch(integrity)
if(30 to 45)
- occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1)
+ occupant.throw_alert("exosuit damage", /atom/movable/screen/alert/low_mech_integrity, 1)
if(15 to 35)
- occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2)
+ occupant.throw_alert("exosuit damage", /atom/movable/screen/alert/low_mech_integrity, 2)
if(-INFINITY to 15)
- occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3)
+ occupant.throw_alert("exosuit damage", /atom/movable/screen/alert/low_mech_integrity, 3)
else
- occupant.clear_alert("mech damage")
+ occupant.clear_alert("exosuit damage")
var/atom/checking = occupant.loc
// recursive check to handle all cases regarding very nested occupants,
// such as brainmob inside brainitem inside MMI inside mecha
@@ -419,7 +418,7 @@
// hit a turf before hitting the mecha, seems like they have
// been moved out
occupant.clear_alert("charge")
- occupant.clear_alert("mech damage")
+ occupant.clear_alert("exosuit damage")
RemoveActions(occupant, human_occupant=1)
occupant = null
break
@@ -1024,10 +1023,10 @@
final_exit_delay = exit_delay/2
if(do_after(occupant, has_gravity() ? final_exit_delay : 0 , target = src))
- to_chat(occupant, "You exit the mech.")
+ to_chat(occupant, "You exit the exosuit.")
go_out()
else
- to_chat(occupant, "You stop exiting the mech. Weapons are enabled again.")
+ to_chat(occupant, "You stop exiting the exosuit. Weapons are enabled again.")
is_currently_ejecting = FALSE
/obj/mecha/Exited(atom/movable/M, atom/newloc)
@@ -1052,7 +1051,7 @@
return
var/atom/movable/mob_container
occupant.clear_alert("charge")
- occupant.clear_alert("mech damage")
+ occupant.clear_alert("exosuit damage")
if(ishuman(occupant))
mob_container = occupant
RemoveActions(occupant, human_occupant=1)
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index 58fa675ac062..6d860558a652 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -36,7 +36,7 @@
return ..()
/datum/action/innate/mecha/mech_eject
- name = "Eject From Mech"
+ name = "Eject From Exosuit"
button_icon_state = "mech_eject"
/datum/action/innate/mecha/mech_eject/Activate()
@@ -179,7 +179,7 @@
else
chassis.leg_overload_mode = 0
chassis.step_in = initial(chassis.step_in)
- chassis.step_energy_drain = chassis.normal_step_energy_drain
+ chassis.update_part_values()
chassis.occupant_message("You disable leg actuators overload.")
UpdateButtonIcon()
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 50652434c6f6..b2dab79ce5e1 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -253,7 +253,7 @@
clearInternalDamage(MECHA_INT_SHORT_CIRCUIT)
to_chat(user, "You replace the fused wires.")
else
- to_chat(user, "You need two lengths of cable to fix this mech!")
+ to_chat(user, "You need two lengths of cable to fix this exosuit!")
return
if(istype(W, /obj/item/mecha_parts))
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 55d477f1817c..5a0e457e42c9 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -3,7 +3,7 @@
/////////////////////////
/obj/item/mecha_parts
- name = "mecha part"
+ name = "exosuit part"
icon = 'icons/mecha/mech_construct.dmi'
icon_state = "blank"
w_class = WEIGHT_CLASS_GIGANTIC
@@ -20,7 +20,7 @@
return
/obj/item/mecha_parts/chassis
- name = "Mecha Chassis"
+ name = "Exosuit Chassis"
icon_state = "backbone"
interaction_flags_item = NONE //Don't pick us up!!
var/construct_type
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 27e139c84ab6..4874ab142647 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -8,7 +8,7 @@
wreckage = /obj/structure/mecha_wreckage/odysseus
internal_damage_threshold = 35
deflect_chance = 15
- step_energy_drain = 6
+ base_step_energy_drain = 11
/obj/mecha/medical/odysseus/moved_inside(mob/living/carbon/human/H)
. = ..()
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 40783ecbb204..9f360011df86 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -107,7 +107,7 @@
light_range = 7
light_power = 1
wreckage = /obj/structure/mecha_wreckage/ripley/deathripley
- step_energy_drain = 0
+ base_step_energy_drain = 0
enclosed = TRUE
enter_delay = 40
silicon_icon_state = null
@@ -167,11 +167,11 @@
scanner.attach(src)
/obj/mecha/working/ripley/clip
- desc = "An APLU utility mech, refitted with a lightweight pressurized cockpit and more powerful servos by the CLIP. While it preserves the Mk. I's speed, the overdriven motors tend to strain its power supply."
+ desc = "An APLU utility exosuit, refitted with a lightweight pressurized cockpit and more powerful servos by the CLIP. While it preserves the Mk. I's speed, the overdriven motors tend to strain its power supply."
name = "\improper CLIP APLU Mk-IV \"Rogue\""
icon_state = "clipripley"
base_icon_state = "clipripley"
- step_energy_drain = 15 //overdriven servos are less efficient
+ base_step_energy_drain = 20 //overdriven servos are less efficient
wreckage = /obj/structure/mecha_wreckage/ripley/clip
enclosed = TRUE
enter_delay = 20 //slower than a mk. I, faster than the armored Ripleys
diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm
index 3f2b6ecaf94e..efa1de11103f 100644
--- a/code/game/objects/effects/effect_system/effects_other.dm
+++ b/code/game/objects/effects/effect_system/effects_other.dm
@@ -81,6 +81,9 @@
/datum/effect_system/trail_follow/proc/set_dir(obj/effect/particle_effect/ion_trails/I)
I.setDir(holder.dir)
+/datum/effect_system/trail_follow/ion/grav_allowed
+ nograv_required = FALSE
+
//Reagent-based explosion effect
/datum/effect_system/reagents_explosion
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index cfd5b8ba34b9..f285aa2058f3 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -31,6 +31,7 @@
var/innate_accuracy_penalty = 0
var/last_effect = 0
var/force_teleport = FALSE
+ var/restrain_vlevel = TRUE
/obj/effect/portal/anom
name = "wormhole"
@@ -156,7 +157,7 @@
no_effect = TRUE
else
last_effect = world.time
- if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport))
+ if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport, restrain_vlevel = restrain_vlevel))
if(istype(M, /obj/projectile))
var/obj/projectile/P = M
P.ignore_source_check = TRUE
@@ -183,6 +184,7 @@
desc = "An unwavering portal that will never fade."
hardlinked = FALSE // dont qdel my portal nerd
force_teleport = TRUE // force teleports because they're a mapmaker tool
+ restrain_vlevel = FALSE
var/id // var edit or set id in map editor
/obj/effect/portal/permanent/proc/set_linked()
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index db99d0c4e4d8..8eadf9c62a2c 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -468,7 +468,7 @@
)
/obj/effect/spawner/lootdrop/ripley
- name = "25% mech 75% wreckage ripley spawner"
+ name = "25% exosuit 75% wreckage ripley spawner"
loot = list(/obj/mecha/working/ripley/mining = 1,
/obj/structure/mecha_wreckage/ripley = 5)
lootdoubles = FALSE
@@ -1031,7 +1031,7 @@
)
/obj/effect/spawner/lootdrop/waste/mechwreck
- name = "wasteplanet mech wreckage"
+ name = "wasteplanet exosuit wreckage"
loot = list(
/obj/structure/mecha_wreckage/ripley = 15,
/obj/structure/mecha_wreckage/ripley/firefighter = 9,
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 4913f9b835ce..d36c427d5b22 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -469,6 +469,11 @@
duration = 12
shrink = FALSE
+/obj/effect/temp_visual/light_ash
+ icon_state = "light_ash"
+ icon = 'icons/effects/weather_effects.dmi'
+ duration = 3.2 SECONDS
+
/obj/effect/temp_visual/warp_cube
duration = 5
var/outgoing = TRUE
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 033307e5472f..6a47415140fe 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -240,6 +240,51 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
qdel(X)
return ..()
+/// Called when an action associated with our item is deleted
+/obj/item/proc/on_action_deleted(datum/source)
+ SIGNAL_HANDLER
+
+ if(!(source in actions))
+ CRASH("An action ([source.type]) was deleted that was associated with an item ([src]), but was not found in the item's actions list.")
+
+ LAZYREMOVE(actions, source)
+
+
+/// Adds an item action to our list of item actions.
+/// Item actions are actions linked to our item, that are granted to mobs who equip us.
+/// This also ensures that the actions are properly tracked in the actions list and removed if they're deleted.
+/// Can be be passed a typepath of an action or an instance of an action.
+/obj/item/proc/add_item_action(action_or_action_type)
+
+ var/datum/action/action
+ if(ispath(action_or_action_type, /datum/action))
+ action = new action_or_action_type(src)
+ else if(istype(action_or_action_type, /datum/action))
+ action = action_or_action_type
+ else
+ CRASH("item add_item_action got a type or instance of something that wasn't an action.")
+
+ LAZYADD(actions, action)
+ RegisterSignal(action, COMSIG_PARENT_QDELETING, PROC_REF(on_action_deleted))
+ grant_action_to_bearer(action)
+ return action
+
+/// Grant the action to anyone who has this item equipped to an appropriate slot
+/obj/item/proc/grant_action_to_bearer(datum/action/action)
+ if(!ismob(loc))
+ return
+ var/mob/holder = loc
+ give_item_action(action, holder, holder.get_slot_by_item(src))
+
+/// Removes an instance of an action from our list of item actions.
+/obj/item/proc/remove_item_action(datum/action/action)
+ if(!action)
+ return
+
+ UnregisterSignal(action, COMSIG_PARENT_QDELETING)
+ LAZYREMOVE(actions, action)
+ qdel(action)
+
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
if(((src in target) && !target_self) || (!isturf(target.loc) && !isturf(target) && not_inside))
return 0
@@ -535,9 +580,21 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE)
user.update_equipment_speed_mods()
-///sometimes we only want to grant the item's action if it's equipped in a specific slot.
-/obj/item/proc/item_action_slot_check(slot, mob/user)
- if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there
+/// Gives one of our item actions to a mob, when equipped to a certain slot
+/obj/item/proc/give_item_action(datum/action/action, mob/to_who, slot)
+ // Some items only give their actions buttons when in a specific slot.
+ if(!item_action_slot_check(slot, to_who))
+ // There is a chance we still have our item action currently,
+ // and are moving it from a "valid slot" to an "invalid slot".
+ // So call Remove() here regardless, even if excessive.
+ action.Remove(to_who)
+ return
+
+ action.Grant(to_who)
+
+/// Sometimes we only want to grant the item's action if it's equipped in a specific slot.
+/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/action)
+ if(slot & (ITEM_SLOT_BACKPACK|ITEM_SLOT_LEGCUFFED)) //these aren't true slots, so avoid granting actions there
return FALSE
return TRUE
@@ -817,7 +874,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
..()
/obj/item/proc/microwave_act(obj/machinery/microwave/M)
- SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M)
+ if(SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) & COMPONENT_SUCCESFUL_MICROWAVE)
+ return
if(istype(M) && M.dirty < 100)
M.dirty++
@@ -1126,3 +1184,98 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
*/
/obj/item/proc/get_writing_implement_details()
return null
+
+/// Whether or not this item can be put into a storage item through attackby
+/obj/item/proc/attackby_storage_insert(datum/storage, atom/storage_holder, mob/user)
+ return TRUE
+/// How many different types of mats will be counted in a bite?
+#define MAX_MATS_PER_BITE 2
+
+/*
+ * On accidental consumption: when you somehow end up eating an item accidentally (currently, this is used for when items are hidden in food like bread or cake)
+ *
+ * The base proc will check if the item is sharp and has a decent force.
+ * Then, it checks the item's mat datums for the effects it applies afterwards.
+ * Then, it checks tiny items.
+ * After all that, it returns TRUE if the item is set to be discovered. Otherwise, it returns FALSE.
+ *
+ * This works similarily to /suicide_act: if you want an item to have a unique interaction, go to that item
+ * and give it an /on_accidental_consumption proc override. For a simple example of this, check out the nuke disk.
+ *
+ * Arguments
+ * * M - the mob accidentally consuming the item
+ * * user - the mob feeding M the item - usually, it's the same as M
+ * * source_item - the item that held the item being consumed - bread, cake, etc
+ * * discover_after - if the item will be discovered after being chomped (FALSE will usually mean it was swallowed, TRUE will usually mean it was bitten into and discovered)
+ */
+/obj/item/proc/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE)
+ if(get_sharpness() && force >= 5) //if we've got something sharp with a decent force (ie, not plastic)
+ INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, emote), "scream")
+ victim.visible_message("[victim] looks like [victim.p_theyve()] just bit something they shouldn't have!", \
+ "OH GOD! Was that a crunch? That didn't feel good at all!!")
+
+ victim.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD)
+ victim.losebreath += 2
+ if(tryEmbed(victim.get_bodypart(BODY_ZONE_CHEST), forced = TRUE)) //and if it embeds successfully in their chest, cause a lot of pain
+ victim.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST)
+ victim.losebreath += 6
+ discover_after = FALSE
+ if(QDELETED(src)) // in case trying to embed it caused its deletion (say, if it's DROPDEL)
+ return
+ source_item?.reagents?.add_reagent(/datum/reagent/blood, 2)
+
+ else if(custom_materials?.len) //if we've got materials, lets see whats in it
+ /// How many mats have we found? You can only be affected by two material datums by default
+ var/found_mats = 0
+ /// How much of each material is in it? Used to determine if the glass should break
+ var/total_material_amount = 0
+
+ for(var/mats in custom_materials)
+ total_material_amount += custom_materials[mats]
+ if(found_mats >= MAX_MATS_PER_BITE)
+ continue //continue instead of break so we can finish adding up all the mats to the total
+
+ var/datum/material/discovered_mat = mats
+ if(discovered_mat.on_accidental_mat_consumption(victim, source_item))
+ found_mats++
+
+ //if there's glass in it and the glass is more than 60% of the item, then we can shatter it
+ if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)] >= total_material_amount * 0.60)
+ if(prob(66)) //66% chance to break it
+ /// The glass shard that is spawned into the source item
+ var/obj/item/shard/broken_glass = new /obj/item/shard(loc)
+ broken_glass.name = "broken [name]"
+ broken_glass.desc = "This used to be \a [name], but it sure isn't anymore."
+ playsound(victim, "shatter", 25, TRUE)
+ qdel(src)
+ if(QDELETED(source_item))
+ broken_glass.on_accidental_consumption(victim, user)
+ else //33% chance to just "crack" it (play a sound) and leave it in the bread
+ playsound(victim, "shatter", 15, TRUE)
+ discover_after = FALSE
+
+ victim.adjust_disgust(33)
+ victim.visible_message(
+ "[victim] looks like [victim.p_theyve()] just bitten into something hard.", \
+ "Eugh! Did I just bite into something?")
+
+ else if(w_class == WEIGHT_CLASS_TINY) //small items like soap or toys that don't have mat datums
+ /// victim's chest (for cavity implanting the item)
+ var/obj/item/bodypart/chest/victim_cavity = victim.get_bodypart(BODY_ZONE_CHEST)
+ if(victim_cavity.cavity_item)
+ victim.vomit(5, FALSE, FALSE, distance = 0)
+ forceMove(drop_location())
+ to_chat(victim, "You vomit up a [name]! [source_item? "Was that in \the [source_item]?" : ""]")
+ else
+ victim.transferItemToLoc(src, victim, TRUE)
+ victim.losebreath += 2
+ victim_cavity.cavity_item = src
+ to_chat(victim, "You swallow hard. [source_item? "Something small was in \the [source_item]..." : ""]")
+ discover_after = FALSE
+
+ else
+ to_chat(victim, "[source_item? "Something strange was in the \the [source_item]..." : "I just bit something strange..."] ")
+
+ return discover_after
+
+#undef MAX_MATS_PER_BITE
diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm
index a6c25ec8cdf3..dbb7a111355e 100644
--- a/code/game/objects/items/attachments/_attachment.dm
+++ b/code/game/objects/items/attachments/_attachment.dm
@@ -3,6 +3,7 @@
name = "broken attachment"
desc = "alert coders"
icon = 'icons/obj/guns/attachments.dmi'
+ w_class = WEIGHT_CLASS_SMALL
//Slot the attachment goes on, also used in descriptions so should be player readable
var/slot = ATTACHMENT_SLOT_RAIL
diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm
index 1fe286c14296..98ecbf18eaa8 100644
--- a/code/game/objects/items/attachments/stock.dm
+++ b/code/game/objects/items/attachments/stock.dm
@@ -38,3 +38,7 @@
/obj/item/attachment/foldable_stock/inteq
icon_state = "skm-inteqsmg-stock"
+
+/obj/item/attachment/foldable_stock/spitter
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ icon_state = "spitter_stock"
diff --git a/code/game/objects/items/cash.dm b/code/game/objects/items/cash.dm
index 12c9a0b99f0c..553da0a3e478 100644
--- a/code/game/objects/items/cash.dm
+++ b/code/game/objects/items/cash.dm
@@ -57,8 +57,9 @@
var/mob/living/carbon/human/H = user
H.dropItemToGround(src)
H.dropItemToGround(bundle)
+ H.put_in_hands(src)
H.put_in_hands(bundle)
- to_chat(user, "You add [value] credits worth of money to the bundle. It now holds [bundle.value] credits.")
+ to_chat(user, "You add [value] credits worth of money to the bundle. It now holds [bundle.value + value] credits.")
bundle.transfer_value(bundle.value, src)
/obj/item/spacecash/Destroy()
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 54dcfb36c131..9aece73946cc 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -272,7 +272,7 @@
build_path = /obj/machinery/computer/launchpad
/obj/item/circuitboard/computer/mech_bay_power_console
- name = "Mech Bay Power Control Console (Computer Board)"
+ name = "Exosuit Bay Power Control Console (Computer Board)"
icon_state = "science"
build_path = /obj/machinery/computer/mech_bay_power_console
@@ -362,7 +362,7 @@
build_path = /obj/machinery/computer/bounty
/obj/item/circuitboard/computer/cargo
- name = "Supply Console (Computer Board)"
+ name = "Outpost Comms Console (Computer Board)"
icon_state = "supply"
build_path = /obj/machinery/computer/cargo
var/contraband = FALSE
@@ -381,16 +381,6 @@
obj_flags |= EMAGGED
to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")
-/obj/item/circuitboard/computer/cargo/express
- name = "Outpost Comms Console (Computer Board)"
- build_path = /obj/machinery/computer/cargo/express
-
-/obj/item/circuitboard/computer/cargo/express/multitool_act(mob/living/user)
- return
-
-/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user)
- return
-
/obj/item/circuitboard/computer/mining
name = "Outpost Status Display (Computer Board)"
icon_state = "supply"
diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm
index 0a3a6f14d097..a74ed8c81b27 100644
--- a/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -957,7 +957,7 @@
/obj/item/stock_parts/micro_laser = 2)
/obj/item/circuitboard/machine/mech_recharger
- name = "Mechbay Recharger (Machine Board)"
+ name = "Exosuit Bay Recharger (Machine Board)"
icon_state = "science"
build_path = /obj/machinery/mech_bay_recharge_port
req_components = list(
diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm
new file mode 100644
index 000000000000..b8233e0ecc76
--- /dev/null
+++ b/code/game/objects/items/food/_food.dm
@@ -0,0 +1,67 @@
+///Abstract class to allow us to easily create all the generic "normal" food without too much copy pasta of adding more components
+/obj/item/food
+ name = "food"
+ desc = "you eat this"
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_SMALL
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = null
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
+ ///List of reagents this food gets on creation
+ var/list/food_reagents
+ ///Extra flags for things such as if the food is in a container or not
+ var/food_flags
+ ///Bitflag of the types of food this food is
+ var/foodtypes
+ ///Amount of volume the food can contain
+ var/max_volume
+ ///How long it will take to eat this food without any other modifiers
+ var/eat_time
+ ///Tastes to describe this food
+ var/list/tastes
+ ///Verbs used when eating this food in the to_chat messages
+ var/list/eatverbs
+ ///How much reagents per bite
+ var/bite_consumption
+ ///What you get if you microwave the food, this should be replaced once I fully re-work cooking.
+ var/microwaved_type
+ ///Type of atom thats spawned after eating this item
+ var/trash_type
+
+/obj/item/food/Initialize()
+ . = ..()
+ if(food_reagents)
+ food_reagents = string_assoc_list(food_reagents)
+ if(tastes)
+ tastes = string_assoc_list(tastes)
+ if(eatverbs)
+ eatverbs = string_list(eatverbs)
+ make_edible()
+ make_processable()
+ make_leave_trash()
+
+///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks.
+/obj/item/food/proc/make_edible()
+ AddComponent(/datum/component/edible,\
+ initial_reagents = food_reagents,\
+ food_flags = food_flags,\
+ foodtypes = foodtypes,\
+ volume = max_volume,\
+ eat_time = eat_time,\
+ tastes = tastes,\
+ eatverbs = eatverbs,\
+ bite_consumption = bite_consumption,\
+ microwaved_type = microwaved_type,\
+ )
+
+
+///This proc handles processable elements, overwrite this if you want to add behavior such as slicing, forking, spooning, whatever, to turn the item into something else
+/obj/item/food/proc/make_processable()
+ return
+
+///This proc handles trash components, overwrite this if you want the object to spawn trash
+/obj/item/food/proc/make_leave_trash()
+ if(trash_type)
+ AddElement(/datum/element/food_trash, trash_type)
+ return
diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm
new file mode 100644
index 000000000000..609315a9ea12
--- /dev/null
+++ b/code/game/objects/items/food/bread.dm
@@ -0,0 +1,378 @@
+
+/obj/item/food/bread
+ name = "bread?"
+ desc = "This shouldn't exist, report to codermonkeys"
+ icon = 'icons/obj/food/burgerbread.dmi'
+ max_volume = 80
+ tastes = list("bread" = 10)
+ foodtypes = GRAIN
+ eat_time = 3 SECONDS
+ /// type is spawned 5 at a time and replaces this bread loaf when processed by cutting tool
+ var/obj/item/food/breadslice/slice_type
+ /// so that the yield can change if it isnt 5
+ var/yield = 5
+
+/obj/item/food/bread/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/dunkable, 10)
+ AddComponent(/datum/component/food_storage)
+
+/obj/item/food/bread/make_processable()
+ if (slice_type)
+ AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE)
+ AddElement(/datum/element/processable, TOOL_SAW, slice_type, yield, 4 SECONDS, table_required = TRUE)
+
+/obj/item/food/breadslice
+ name = "breadslice?"
+ desc = "This shouldn't exist, report to codermonkeys"
+ icon = 'icons/obj/food/burgerbread.dmi'
+ foodtypes = GRAIN
+ food_flags = FOOD_FINGER_FOOD
+ eat_time = 0.5 SECONDS
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/breadslice/Initialize()
+ . = ..()
+ AddElement(/datum/element/dunkable, 10)
+
+/obj/item/food/bread/plain
+ name = "bread"
+ desc = "Some plain old earthen bread."
+ icon_state = "bread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 10
+ )
+ tastes = list("bread" = 10)
+ foodtypes = GRAIN
+ w_class = WEIGHT_CLASS_SMALL
+ slice_type = /obj/item/food/breadslice/plain
+
+/obj/item/food/breadslice/plain
+ name = "bread slice"
+ desc = "A slice of home."
+ icon_state = "breadslice"
+ foodtypes = GRAIN
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 2
+ )
+
+/obj/item/food/breadslice/moldy
+ name = "moldy bread slice"
+ desc = "Entire stations have been ripped apart over arguing whether this is still good to eat."
+ icon_state = "moldybreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 2,
+ /datum/reagent/consumable/mold = 10,
+ )
+ tastes = list("decaying fungus" = 1)
+ foodtypes = GROSS
+
+/obj/item/food/bread/meat
+ name = "meatbread loaf"
+ desc = "The culinary base of every self-respecting eloquen/tg/entleman."
+ icon_state = "meatbread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "meat" = 10)
+ foodtypes = GRAIN | MEAT
+ slice_type = /obj/item/food/breadslice/meat
+
+/obj/item/food/breadslice/meat
+ name = "meatbread slice"
+ desc = "A slice of delicious meatbread."
+ icon_state = "meatbreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 2
+ )
+ tastes = list("bread" = 1, "meat" = 1)
+ foodtypes = GRAIN | MEAT
+
+/obj/item/food/bread/xenomeat
+ name = "xenomeatbread loaf"
+ desc = "Extra Heretical."
+ icon_state = "xenomeatbread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "acid" = 10)
+ foodtypes = GRAIN | MEAT
+ slice_type = /obj/item/food/breadslice/xenomeat
+
+/obj/item/food/breadslice/xenomeat
+ name = "xenomeatbread slice"
+ desc = "A slice of delicious meatbread. Extra Heretical."
+ icon_state = "xenobreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 2
+ )
+ tastes = list("bread" = 10, "acid" = 10)
+ foodtypes = GRAIN | MEAT
+
+/obj/item/food/bread/spidermeat
+ name = "spider meat loaf"
+ desc = "Reassuringly green meatloaf made from spider meat."
+ icon_state = "spidermeatbread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/toxin = 15,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "cobwebs" = 5)
+ foodtypes = GRAIN | MEAT | TOXIC
+ slice_type = /obj/item/food/breadslice/spidermeat
+
+/obj/item/food/breadslice/spidermeat
+ name = "spider meat bread slice"
+ desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
+ icon_state = "xenobreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 3,
+ /datum/reagent/toxin = 3,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("bread" = 10, "cobwebs" = 5)
+ foodtypes = GRAIN | MEAT | TOXIC
+
+/obj/item/food/bread/banana
+ name = "banana-nut bread"
+ desc = "A heavenly and filling treat."
+ icon_state = "bananabread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/banana = 20
+ )
+ tastes = list("bread" = 10) // bananjuice will also flavour
+ foodtypes = GRAIN | FRUIT
+ slice_type = /obj/item/food/breadslice/banana
+
+/obj/item/food/breadslice/banana
+ name = "banana-nut bread slice"
+ desc = "A slice of delicious banana bread."
+ icon_state = "bananabreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/banana = 4
+ )
+ tastes = list("bread" = 10)
+ foodtypes = GRAIN | FRUIT
+
+/obj/item/food/bread/tofu
+ name = "Tofubread"
+ desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
+ icon_state = "tofubread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "tofu" = 10)
+ foodtypes = GRAIN | VEGETABLES
+ slice_type = /obj/item/food/breadslice/tofu
+
+/obj/item/food/breadslice/tofu
+ name = "tofubread slice"
+ desc = "A slice of delicious tofubread."
+ icon_state = "tofubreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 2
+ )
+ tastes = list("bread" = 10, "tofu" = 10)
+ foodtypes = GRAIN | VEGETABLES
+
+/obj/item/food/bread/creamcheese
+ name = "cream cheese bread"
+ desc = "Just a schmear."
+ icon_state = "creamcheesebread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "cheese" = 10)
+ foodtypes = GRAIN | DAIRY
+ slice_type = /obj/item/food/breadslice/creamcheese
+
+/obj/item/food/breadslice/creamcheese
+ name = "cream cheese bread slice"
+ desc = "A slice of Brotherly love!"
+ icon_state = "creamcheesebreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 3,
+ /datum/reagent/consumable/nutriment/vitamin = 2
+ )
+ tastes = list("bread" = 10, "cheese" = 10)
+ foodtypes = GRAIN | DAIRY
+
+/obj/item/food/bread/mimana
+ name = "mimana bread"
+ desc = "Best eaten in silence."
+ icon_state = "mimanabread"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/toxin/mutetoxin = 10,
+ /datum/reagent/consumable/nothing = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("bread" = 10, "silence" = 10)
+ foodtypes = GRAIN | FRUIT
+ slice_type = /obj/item/food/breadslice/mimana
+
+/obj/item/food/breadslice/mimana
+ name = "mimana bread slice"
+ desc = "A slice of silence!"
+ icon_state = "mimanabreadslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/toxin/mutetoxin = 2,
+ /datum/reagent/consumable/nothing = 2,
+ /datum/reagent/consumable/nutriment/vitamin = 2
+ )
+ foodtypes = GRAIN | FRUIT
+
+/obj/item/food/breadslice/custom
+ name = "bread slice"
+ icon_state = "tofubreadslice"
+ foodtypes = GRAIN
+
+/obj/item/food/baguette
+ name = "baguette"
+ desc = "Bon appetit!"
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "baguette"
+ item_state = null
+ mob_overlay_state = "baguette"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 8,
+ /datum/reagent/consumable/nutriment/vitamin = 3
+ )
+ bite_consumption = 3
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
+ attack_verb = list("touche")
+ tastes = list("bread" = 1)
+ foodtypes = GRAIN
+
+/obj/item/food/garlicbread
+ name = "garlic bread"
+ desc = "Alas, it is limited."
+ icon = 'icons/obj/food/burgerbread.dmi'
+ icon_state = "garlicbread"
+ item_state = null
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 6,
+ /datum/reagent/consumable/garlic = 2
+ )
+ bite_consumption = 3
+ tastes = list("bread" = 1, "garlic" = 1, "butter" = 1)
+ foodtypes = GRAIN
+
+/obj/item/food/deepfryholder
+ name = "Deep Fried Foods Holder Obj"
+ desc = "If you can see this description the code for the deep fryer fucked up."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = ""
+ bite_consumption = 2
+
+/obj/item/food/deepfryholder/make_edible()
+ AddComponent(/datum/component/edible,\
+ initial_reagents = food_reagents,\
+ food_flags = food_flags,\
+ foodtypes = foodtypes,\
+ volume = max_volume,\
+ eat_time = eat_time,\
+ tastes = tastes,\
+ eatverbs = eatverbs,\
+ bite_consumption = bite_consumption,\
+ on_consume = CALLBACK(src, PROC_REF(On_Consume)))
+
+
+/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried)
+ . = ..()
+ name = fried.name //We'll determine the other stuff when it's actually removed
+ appearance = fried.appearance
+ layer = initial(layer)
+ plane = initial(plane)
+ lefthand_file = fried.lefthand_file
+ righthand_file = fried.righthand_file
+ mob_overlay_state = fried.mob_overlay_state
+ desc = fried.desc
+ w_class = fried.w_class
+ slowdown = fried.slowdown
+ equip_delay_self = fried.equip_delay_self
+ equip_delay_other = fried.equip_delay_other
+ strip_delay = fried.strip_delay
+ species_exception = fried.species_exception
+ item_flags = fried.item_flags
+ obj_flags = fried.obj_flags
+ inhand_x_dimension = fried.inhand_x_dimension
+ inhand_y_dimension = fried.inhand_y_dimension
+
+ if(!(SEND_SIGNAL(fried, COMSIG_ITEM_FRIED, src) & COMSIG_FRYING_HANDLED)) //If frying is handled by signal don't do the defaault behavior.
+ fried.forceMove(src)
+
+
+/obj/item/food/deepfryholder/Destroy()
+ if(contents)
+ QDEL_LIST(contents)
+ return ..()
+
+/obj/item/food/deepfryholder/proc/On_Consume(eater, feeder)
+ if(contents)
+ QDEL_LIST(contents)
+
+
+/obj/item/food/deepfryholder/proc/fry(cook_time = 30)
+ switch(cook_time)
+ if(0 to 15)
+ add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
+ name = "lightly-fried [name]"
+ desc = "[desc] It's been lightly fried in a deep fryer."
+ if(16 to 49)
+ add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
+ name = "fried [name]"
+ desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
+ if(50 to 59)
+ add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
+ name = "deep-fried [name]"
+ desc = "[desc] Deep-fried to perfection."
+ if(60 to INFINITY)
+ add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
+ name = "\proper the physical manifestation of the very concept of fried foods"
+ desc = "A heavily-fried... something. Who can tell anymore?"
+ foodtypes |= FRIED
+
+/obj/item/food/butterbiscuit
+ name = "butter biscuit"
+ desc = "Well butter my biscuit!"
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butterbiscuit"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 6,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("butter" = 1, "biscuit" = 1)
+ foodtypes = GRAIN | BREAKFAST
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/butterdog
+ name = "butterdog"
+ desc = "Made from exotic butters."
+ icon = 'icons/obj/food/food.dmi'
+ icon_state = "butterdog"
+ bite_consumption = 1
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 6,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("butter" = 1, "exotic butter" = 1)
+ foodtypes = GRAIN | DAIRY
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/butterdog/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/slippery, 8 SECONDS)
diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm
new file mode 100644
index 000000000000..d6299a24d524
--- /dev/null
+++ b/code/game/objects/items/food/cake.dm
@@ -0,0 +1,538 @@
+/obj/item/food/cake
+ icon = 'icons/obj/food/piecake.dmi'
+ bite_consumption = 3
+ max_volume = 80
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5
+ )
+ tastes = list("cake" = 1)
+ foodtypes = GRAIN | DAIRY
+ /// type is spawned 5 at a time and replaces this cake when processed by cutting tool
+ var/obj/item/food/cakeslice/slice_type
+ /// changes yield of sliced cake, default for cake is 5
+ var/yield = 5
+
+/obj/item/food/cake/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/food_storage)
+
+/obj/item/food/cake/make_processable()
+ if (slice_type)
+ AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE)
+
+/obj/item/food/cakeslice
+ icon = 'icons/obj/food/piecake.dmi'
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("cake" = 1)
+ foodtypes = GRAIN | DAIRY
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/food/cake/plain
+ name = "plain cake"
+ desc = "A plain cake, not a lie." //Many of the cakes seem to follow this desc scheme, so I am going to try and put either a hint about its contents, or a fun fact. Lets try to follow this.
+ icon_state = "plaincake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 30,
+ /datum/reagent/consumable/nutriment/vitamin = 7
+ )
+ tastes = list("sweetness" = 2, "cake" = 5)
+ foodtypes = GRAIN | DAIRY | SUGAR
+ slice_type = /obj/item/food/cakeslice/plain
+
+/obj/item/food/cakeslice/plain
+ name = "plain cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "plaincake_slice"
+ tastes = list("sweetness" = 2,"cake" = 5)
+ foodtypes = GRAIN | DAIRY | SUGAR
+
+/obj/item/food/cake/carrot
+ name = "carrot cake"
+ desc = "Scientifically proven to improve eyesight! Not a lie."
+ icon_state = "carrotcake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/medicine/oculine = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 5
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
+ slice_type = /obj/item/food/cakeslice/carrot
+
+/obj/item/food/cakeslice/carrot
+ name = "carrot cake slice"
+ desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
+ icon_state = "carrotcake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/medicine/oculine = 2,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
+ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/food/cake/brain
+ name = "brain cake"
+ desc = "Yeah... its actually made out of brain. I wish it were a lie."
+ icon_state = "braincake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 15,
+ /datum/reagent/medicine/mannitol = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 5
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+ slice_type = /obj/item/food/cakeslice/brain
+
+/obj/item/food/cakeslice/brain
+ name = "brain cake slice"
+ desc = "Lemme tell you something about prions. THEY'RE DELICIOUS. A terrifying not-lie."
+ icon_state = "braincakeslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/medicine/mannitol = 2,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
+ foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR
+
+/obj/item/food/cake/cheese
+ name = "cheese cake"
+ desc = "DANGEROUSLY cheesy."
+ icon_state = "cheesecake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 8
+ )
+ tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtypes = GRAIN | DAIRY
+ slice_type = /obj/item/food/cakeslice/cheese
+
+/obj/item/food/cakeslice/cheese
+ name = "cheese cake slice"
+ desc = "Slice of pure cheestisfaction."
+ icon_state = "cheesecake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1.3
+ )
+ tastes = list("cake" = 4, "cream cheese" = 3)
+ foodtypes = GRAIN | DAIRY
+
+/obj/item/food/cake/orange
+ name = "orange cake"
+ desc = "A cake with added orange."
+ icon_state = "orangecake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/orange
+
+/obj/item/food/cakeslice/orange
+ name = "orange cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "orangecake_slice"
+ tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/lime
+ name = "lime cake"
+ desc = "A cake with added lime."
+ icon_state = "limecake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/lime
+
+/obj/item/food/cakeslice/lime
+ name = "lime cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "limecake_slice"
+ tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/lemon
+ name = "lemon cake"
+ desc = "A cake with added lemon."
+ icon_state = "lemoncake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 3, "sourness" = 1) //lemon cake is never as sour as it is sweet, have you ever actually eaten it?
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/lemon
+
+/obj/item/food/cakeslice/lemon
+ name = "lemon cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "lemoncake_slice"
+ tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/chocolate
+ name = "chocolate cake"
+ desc = "A cake with added chocolate."
+ icon_state = "chocolatecake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+ slice_type = /obj/item/food/cakeslice/chocolate
+
+/obj/item/food/cakeslice/chocolate
+ name = "chocolate cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "chocolatecake_slice"
+ tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/food/cake/birthday
+ name = "birthday cake"
+ desc = "Happy Birthday little clown..."
+ icon_state = "birthdaycake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/sprinkles = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 5
+ )
+ tastes = list("cake" = 5, "sweetness" = 1)
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+ slice_type = /obj/item/food/cakeslice/birthday
+
+/obj/item/food/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club
+ new /obj/item/clothing/head/hardhat/cakehat(get_turf(src))
+ qdel(src)
+
+/obj/item/food/cakeslice/birthday
+ name = "birthday cake slice"
+ desc = "A slice of your birthday."
+ icon_state = "birthdaycakeslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/sprinkles = 2,
+ /datum/reagent/consumable/nutriment/vitamin = 1
+ )
+ tastes = list("cake" = 5, "sweetness" = 1)
+ foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR
+
+/obj/item/food/cake/birthday/energy
+ name = "energy cake"
+ desc = "Just enough calories for a whole nuclear operative squad."
+ icon_state = "energycake"
+ force = 5
+ hitsound = 'sound/weapons/blade1.ogg'
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 10,
+ /datum/reagent/consumable/sprinkles = 10,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/consumable/pacfuel = 10,
+ /datum/reagent/consumable/liquidelectricity = 10
+ )
+ tastes = list("cake" = 3, "a Vlad's Salad" = 1)
+ slice_type = /obj/item/food/cakeslice/birthday/energy
+
+/obj/item/food/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club
+ new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src))
+ qdel(src)
+
+/obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user)
+ to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!")
+ user.apply_damage(30, BURN, BODY_ZONE_HEAD) // ITs an ENERGY sword, so it burns, duh
+ playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
+
+/obj/item/food/cake/birthday/energy/attack(mob/living/target_mob, mob/living/user)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly
+ return
+ energy_bite(target_mob, user)
+
+/obj/item/food/cakeslice/birthday/energy
+ name = "energy cake slice"
+ desc = "For the traitor on the go."
+ icon_state = "energycakeslice"
+ force = 2
+ hitsound = 'sound/weapons/blade1.ogg'
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/sprinkles = 2,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/consumable/pacfuel = 2,
+ /datum/reagent/consumable/liquidelectricity = 2
+ )
+ tastes = list("cake" = 3, "a Vlad's Salad" = 1)
+
+/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
+ to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!")
+ user.apply_damage(18, BURN, BODY_ZONE_HEAD)
+ playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
+
+/obj/item/food/cakeslice/birthday/energy/attack(mob/living/target_mob, mob/living/user)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly
+ return
+ energy_bite(target_mob, user)
+
+/obj/item/food/cake/apple
+ name = "apple cake"
+ desc = "A cake centred with Apple."
+ icon_state = "applecake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/apple
+
+/obj/item/food/cakeslice/apple
+ name = "apple cake slice"
+ desc = "A slice of heavenly cake."
+ icon_state = "applecakeslice"
+ tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/slimecake
+ name = "Slime cake"
+ desc = "A cake made of slimes. Probably not electrified."
+ icon_state = "slimecake"
+ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR
+ slice_type = /obj/item/food/cakeslice/slimecake
+
+/obj/item/food/cakeslice/slimecake
+ name = "slime cake slice"
+ desc = "A slice of slime cake."
+ icon_state = "slimecake_slice"
+ tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR
+
+/obj/item/food/cake/pumpkinspice
+ name = "pumpkin spice cake"
+ desc = "A hollow cake with real pumpkin."
+ icon_state = "pumpkinspicecake"
+ tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
+ slice_type = /obj/item/food/cakeslice/pumpkinspice
+
+/obj/item/food/cakeslice/pumpkinspice
+ name = "pumpkin spice cake slice"
+ desc = "A spicy slice of pumpkin goodness."
+ icon_state = "pumpkinspicecakeslice"
+ tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
+ foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR
+
+/obj/item/food/cake/bsvc // blackberry strawberries vanilla cake
+ name = "blackberry and strawberry vanilla cake"
+ desc = "A plain cake, filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_vanilla_cake"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/bsvc
+
+/obj/item/food/cakeslice/bsvc
+ name = "blackberry and strawberry vanilla cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_vanilla_slice"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/bscc // blackbarry strawberries chocolate cake
+ name = "blackberry and strawberry chocolate cake"
+ desc = "A chocolate cake, filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_coco_cake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/consumable/coco = 5
+ )
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/bscc
+
+/obj/item/food/cakeslice/bscc
+ name = "blackberry and strawberry chocolate cake slice"
+ desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
+ icon_state = "blackbarry_strawberries_cake_coco_slice"
+ tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/holy_cake
+ name = "angel food cake"
+ desc = "A cake made for angels and chaplains alike! Contains holy water."
+ icon_state = "holy_cake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 1,
+ /datum/reagent/consumable/nutriment/vitamin = 3,
+ /datum/reagent/water/holywater = 10
+ )
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR
+ slice_type = /obj/item/food/cakeslice/holy_cake_slice
+
+/obj/item/food/cakeslice/holy_cake_slice
+ name = "angel food cake slice"
+ desc = "A slice of heavenly cake."
+ icon_state = "holy_cake_slice"
+ tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR
+
+/obj/item/food/cake/pound_cake
+ name = "pound cake"
+ desc = "A condensed cake made for filling people up quickly."
+ icon_state = "pound_cake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 60,
+ /datum/reagent/consumable/nutriment/vitamin = 5
+ )
+ tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD
+ slice_type = /obj/item/food/cakeslice/pound_cake_slice
+ yield = 10 //cause its so damn THICC (seriously these things are fucking huge a pound of each ingredient are you kidding)
+
+/obj/item/food/cakeslice/pound_cake_slice
+ name = "pound cake slice"
+ desc = "A slice of condensed cake made for filling people up quickly."
+ icon_state = "pound_cake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 9,
+ /datum/reagent/consumable/nutriment/vitamin = 0.5
+ )
+ tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD
+
+/obj/item/food/cake/hardware_cake
+ name = "hardware cake"
+ desc = "A quote on quote cake that is made with electronic boards and leaks acid..."
+ icon_state = "hardware_cake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/toxin/acid = 15,
+ /datum/reagent/fuel/oil = 15
+ )
+ tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
+ foodtypes = GRAIN | GROSS
+ slice_type = /obj/item/food/cakeslice/hardware_cake_slice
+
+/obj/item/food/cakeslice/hardware_cake_slice
+ name = "hardware cake slice"
+ desc = "A slice of electronic boards and some acid."
+ icon_state = "hardware_cake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/toxin/acid = 3,
+ /datum/reagent/fuel/oil = 3
+ )
+ tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
+ foodtypes = GRAIN | GROSS
+
+/obj/item/food/cake/vanilla_cake
+ name = "vanilla cake"
+ desc = "A vanilla frosted cake."
+ icon_state = "vanillacake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/consumable/sugar = 15,
+ /datum/reagent/consumable/vanilla = 15
+ )
+ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtypes = GRAIN | SUGAR | DAIRY
+ slice_type = /obj/item/food/cakeslice/vanilla_slice
+
+/obj/item/food/cakeslice/vanilla_slice
+ name = "vanilla cake slice"
+ desc = "A slice of vanilla frosted cake."
+ icon_state = "vanillacake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/consumable/sugar = 3,
+ /datum/reagent/consumable/vanilla = 3
+ )
+ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtypes = GRAIN | SUGAR | DAIRY
+
+/obj/item/food/cake/clown_cake
+ name = "clown cake"
+ desc = "A funny cake with a clown face on it."
+ icon_state = "clowncake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/consumable/banana = 15
+ )
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtypes = GRAIN | SUGAR | DAIRY
+ slice_type = /obj/item/food/cakeslice/clown_slice
+
+/obj/item/food/cakeslice/clown_slice
+ name = "clown cake slice"
+ desc = "A slice of bad jokes, and silly props."
+ icon_state = "clowncake_slice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/consumable/banana = 3
+ )
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtypes = GRAIN | SUGAR | DAIRY
+
+/obj/item/food/cake/trumpet
+ name = "spaceman's cake"
+ desc = "A spaceman's trumpet frosted cake."
+ icon_state = "trumpetcake"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 20,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/medicine/polypyr = 15,
+ /datum/reagent/consumable/cream = 5,
+ /datum/reagent/consumable/nutriment/vitamin = 5,
+ /datum/reagent/consumable/berryjuice = 5
+ )
+ tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+ slice_type = /obj/item/food/cakeslice/trumpet
+
+/obj/item/food/cakeslice/trumpet
+ name = "spaceman's cake"
+ desc = "A spaceman's trumpet frosted cake."
+ icon_state = "trumpetcakeslice"
+ food_reagents = list(
+ /datum/reagent/consumable/nutriment = 4,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/medicine/polypyr = 3,
+ /datum/reagent/consumable/cream = 1,
+ /datum/reagent/consumable/nutriment/vitamin = 1,
+ /datum/reagent/consumable/berryjuice = 1
+ )
+ tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
+ foodtypes = GRAIN | DAIRY | FRUIT | SUGAR
+
+/obj/item/food/cake/brioche
+ name = "brioche cake"
+ desc = "A ring of sweet, glazed buns."
+ icon_state = "briochecake"
+ tastes = list("cake" = 4, "butter" = 2, "cream" = 1)
+ foodtypes = GRAIN | DAIRY | SUGAR
+ slice_type = /obj/item/food/cakeslice/brioche
+ yield = 6
+
+/obj/item/food/cakeslice/brioche
+ name = "brioche cake slice"
+ desc = "Delicious sweet-bread. Who needs anything else?"
+ icon_state = "briochecake_slice"
diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm
new file mode 100644
index 000000000000..a6c5394e0647
--- /dev/null
+++ b/code/game/objects/items/food/spaghetti.dm
@@ -0,0 +1,98 @@
+
+/obj/item/food/spaghetti
+ icon = 'icons/obj/food/pizzaspaghetti.dmi'
+ food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ foodtypes = GRAIN
+
+/obj/item/food/spaghetti/Initialize()
+ . = ..()
+ if(!microwaved_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket?
+ var/list/display_message = list(
+ "Something wet falls out of their pocket and hits the ground. Is that... [name]?",
+ "Oh shit! All your pocket [name] fell out!")
+ AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg')
+
+/obj/item/food/spaghetti/raw
+ name = "spaghetti"
+ desc = "Now that's a nic'e pasta!"
+ icon_state = "spaghetti"
+ tastes = list("pasta" = 1)
+ microwaved_type = /obj/item/food/spaghetti/boiledspaghetti
+
+/obj/item/food/spaghetti/boiledspaghetti
+ name = "boiled spaghetti"
+ desc = "A plain dish of noodles, this needs more ingredients."
+ icon_state = "spaghettiboiled"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
+ microwaved_type = null
+
+/obj/item/food/spaghetti/pastatomato
+ name = "spaghetti"
+ desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
+ icon_state = "pastatomato"
+ trash_type = /obj/item/trash/plate
+ bite_consumption = 4
+ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
+ microwaved_type = null
+ tastes = list("pasta" = 1, "tomato" = 1)
+ foodtypes = GRAIN | VEGETABLES
+
+/obj/item/food/spaghetti/copypasta
+ name = "copypasta"
+ desc = "You probably shouldn't try this, you always hear people talking about how bad it is..."
+ icon_state = "copypasta"
+ trash_type = /obj/item/trash/plate
+ bite_consumption = 4
+ food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8)
+ microwaved_type = null
+ tastes = list("pasta" = 1, "tomato" = 1)
+ foodtypes = GRAIN | VEGETABLES
+
+/obj/item/food/spaghetti/meatballspaghetti
+ name = "spaghetti and meatballs"
+ desc = "Now that's a nic'e meatball!"
+ icon_state = "meatballspaghetti"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2)
+ microwaved_type = null
+ tastes = list("pasta" = 1, "meat" = 1)
+ foodtypes = GRAIN | MEAT
+
+/obj/item/food/spaghetti/spesslaw
+ name = "spesslaw"
+ desc = "A lawyers favourite."
+ icon_state = "spesslaw"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 3)
+ microwaved_type = null
+ tastes = list("pasta" = 1, "meat" = 1)
+
+/obj/item/food/spaghetti/chowmein
+ name = "chow mein"
+ desc = "A nice mix of noodles and fried vegetables."
+ icon_state = "chowmein"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6)
+ microwaved_type = null
+ tastes = list("noodle" = 1, "tomato" = 1)
+
+/obj/item/food/spaghetti/beefnoodle
+ name = "beef noodle"
+ desc = "Nutritious, beefy and noodly."
+ icon_state = "beefnoodle"
+ trash_type = /obj/item/reagent_containers/glass/bowl
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
+ microwaved_type = null
+ tastes = list("noodle" = 1, "meat" = 1)
+ foodtypes = GRAIN | MEAT
+
+/obj/item/food/spaghetti/butternoodles
+ name = "butter noodles"
+ desc = "Noodles covered in savory butter. Simple and slippery, but delicious."
+ icon_state = "butternoodles"
+ trash_type = /obj/item/trash/plate
+ food_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 2)
+ microwaved_type = null
+ tastes = list("noodle" = 1, "butter" = 1)
+ foodtypes = GRAIN | DAIRY
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 0affcd107af0..5b91f6b7bd87 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -96,7 +96,7 @@
var/shield_icon = "shield-red"
/obj/item/nullrod/staff/worn_overlays(isinhands)
- . = list()
+ . = ..()
if(isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 9e90329404f0..4186e500ab98 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -88,6 +88,7 @@
item_flags = EYE_STAB
var/bayonet = FALSE //Can this be attached to a gun?
custom_price = 250
+ tool_behaviour = TOOL_KNIFE
/obj/item/kitchen/knife/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm
index 05af8fcadbad..2b4aec09ac87 100644
--- a/code/game/objects/items/manuals.dm
+++ b/code/game/objects/items/manuals.dm
@@ -107,7 +107,7 @@
A firesuit must be connected to the Firefighter chassis for heat shielding.
Internal armor is plasteel for additional strength.
External armor must be installed in 2 parts, totaling 10 sheets.
-
Completed mech is more resiliant against fire, and is a bit more durable overall
+
Completed exosuit is more resiliant against fire, and is a bit more durable overall
Nanotrasen is determined to the safety of its investments employees.
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index 0f5d79f13b37..619ebf3eb0e9 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -13,11 +13,10 @@
attack_verb = list("warned", "cautioned", "smashed")
/obj/item/choice_beacon
- name = "choice beacon"
- desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence."
- icon = 'icons/obj/device.dmi'
- icon_state = "gangtool-blue"
- item_state = "radio"
+ name = "choice box"
+ desc = "A box containing items to choose."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "deliverypackage3"
var/uses = 1
/obj/item/choice_beacon/attack_self(mob/user)
@@ -31,41 +30,31 @@
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return TRUE
else
- playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE)
return FALSE
/obj/item/choice_beacon/proc/generate_options(mob/living/M)
var/list/display_names = generate_display_names()
if(!display_names.len)
return
- var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in sortList(display_names)
+ var/choice = input(M,"Which item would you like to pick?","Select an Item") as null|anything in sortList(display_names)
if(!choice || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
spawn_option(display_names[choice],M)
uses--
if(!uses)
+ new /obj/effect/decal/cleanable/wrapping(get_turf(M))
qdel(src)
else
to_chat(M, "[uses] use[uses > 1 ? "s" : ""] remaining on the [src].")
/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
- var/obj/new_item = new choice()
- var/obj/structure/closet/supplypod/bluespacepod/pod = new()
- pod.explosionSize = list(0,0,0,0)
- new_item.forceMove(pod)
- var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!"
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(istype(H.ears, /obj/item/radio/headset))
- msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: Item request received. Your package is inbound, please stand back from the landing site. Message ends.\""
- to_chat(M, msg)
-
- new /obj/effect/pod_landingzone(get_turf(src), pod)
+ new choice(get_turf(M))
+ playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, TRUE)
/obj/item/choice_beacon/hero
- name = "heroic beacon"
- desc = "To summon heroes from the past to protect the future."
+ name = "heroic box"
+ desc = "To become heroes from the past to protect the future."
/obj/item/choice_beacon/hero/generate_display_names()
var/static/list/hero_item_list
@@ -137,8 +126,8 @@
new /obj/item/grenade/chem_grenade/ghostbuster(src)
/obj/item/choice_beacon/augments
- name = "augment beacon"
- desc = "Summons augmentations. Can be used 3 times!"
+ name = "augment box"
+ desc = "Contains augmentations. Can be used 3 times!"
uses = 3
/obj/item/choice_beacon/augments/generate_display_names()
@@ -157,10 +146,6 @@
augment_list[initial(A.name)] = A
return augment_list
-/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
- new choice(get_turf(M))
- to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")
-
/obj/item/skub
desc = "It's skub."
name = "skub"
@@ -217,8 +202,10 @@
#undef NICKNAME_CAP
/obj/item/choice_beacon/ouija
- name = "spirit board delivery beacon"
+ name = "spirit board box"
desc = "Ghost communication on demand! It is unclear how this thing is still operational."
+ icon_state = "deliverybox"
+ w_class = WEIGHT_CLASS_BULKY
/obj/item/choice_beacon/ouija/generate_display_names()
var/static/list/ouija_spaghetti_list
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index a6ef402ecad4..63e4ffc5e6c3 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -863,3 +863,43 @@
var/mutable_appearance/base_overlay_among = mutable_appearance(icon, "plushie_among_visor")
base_overlay_among.appearance_flags = RESET_COLOR
add_overlay(base_overlay_among)
+
+/obj/effect/spawner/lootdrop/plushie
+ loot = list (
+ /obj/item/toy/plush/beeplushie,
+ /obj/item/toy/plush/blahaj,
+ /obj/item/toy/plush/carpplushie,
+ /obj/item/toy/plush/flushed,
+ /obj/item/toy/plush/kari,
+ /obj/item/toy/plush/lizardplushie,
+ /obj/item/toy/plush/mora,
+ /obj/item/toy/plush/realgoat,
+ /obj/item/toy/plush/rilena,
+ /obj/item/toy/plush/sharai,
+ /obj/item/toy/plush/slimeplushie,
+ /obj/item/toy/plush/snakeplushie,
+ /obj/item/toy/plush/spider,
+ /obj/item/toy/plush/tali,
+ /obj/item/toy/plush/xader,
+ /obj/effect/spawner/lootdrop/plushie/moth // fair chances
+ )
+
+/obj/effect/spawner/lootdrop/plushie/moth
+ loot = list (
+ /obj/item/toy/plush/moth,
+ /obj/item/toy/plush/moth/monarch,
+ /obj/item/toy/plush/moth/luna,
+ /obj/item/toy/plush/moth/atlas,
+ /obj/item/toy/plush/moth/redish,
+ /obj/item/toy/plush/moth/royal,
+ /obj/item/toy/plush/moth/gothic,
+ /obj/item/toy/plush/moth/lovers,
+ /obj/item/toy/plush/moth/whitefly,
+ /obj/item/toy/plush/moth/punished,
+ /obj/item/toy/plush/moth/firewatch,
+ /obj/item/toy/plush/moth/deadhead,
+ /obj/item/toy/plush/moth/poison,
+ /obj/item/toy/plush/moth/ragged,
+ /obj/item/toy/plush/moth/snow,
+ /obj/item/toy/plush/moth/moonfly
+ )
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 2904745f25aa..fbe1bbc73131 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -287,7 +287,7 @@
/obj/item/ammo_box/a858, //oh boy stripper clips too
/obj/item/ammo_box/vickland_a308,
/obj/item/ammo_box/a300,
- /obj/item/ammo_box/aac_300blk_stripper,
+ /obj/item/ammo_box/a762_stripper,
/obj/item/ammo_box/amagpellet_claris, //that's the last of the clips
/obj/item/reagent_containers/food/snacks/donut,
/obj/item/kitchen/knife/combat,
@@ -520,7 +520,7 @@
/obj/item/reagent_containers/food/snacks/cheesynachos,
/obj/item/reagent_containers/food/snacks/cubannachos,
/obj/item/reagent_containers/food/snacks/nugget,
- /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato,
+ /obj/item/food/spaghetti/pastatomato,
/obj/item/reagent_containers/food/snacks/rofflewaffles,
/obj/item/reagent_containers/food/snacks/donkpocket,
/obj/item/reagent_containers/food/drinks/soda_cans/cola,
diff --git a/code/game/objects/items/storage/guncases.dm b/code/game/objects/items/storage/guncases.dm
index 9cda5ac27a39..77f6fe0ed651 100644
--- a/code/game/objects/items/storage/guncases.dm
+++ b/code/game/objects/items/storage/guncases.dm
@@ -58,7 +58,6 @@
new /obj/item/ammo_box/magazine/smgm45/empty(src)
new /obj/item/ammo_box/magazine/smgm45/empty(src)
-
/obj/item/storage/guncase/hellfire
/obj/item/storage/guncase/hellfire/PopulateContents()
new /obj/item/gun/ballistic/shotgun/hellfire/no_mag(src)
@@ -163,7 +162,6 @@
new /obj/item/ammo_box/a44roum_speedloader/empty(src)
new /obj/item/ammo_box/a44roum_speedloader/empty(src)
-
/obj/item/storage/pistolcase/disposable
/obj/item/storage/pistolcase/disposable/PopulateContents()
new /obj/item/gun/ballistic/automatic/pistol/disposable(src)
@@ -176,7 +174,7 @@
/obj/item/storage/pistolcase/egun
/obj/item/storage/pistolcase/egun/PopulateContents()
- new /obj/item/gun/energy/laser/empty_cell(src)
+ new /obj/item/gun/energy/e_gun/empty_cell(src)
new /obj/item/stock_parts/cell/gun(src)
/obj/item/storage/pistolcase/kalixpistol
@@ -191,7 +189,7 @@
/obj/item/storage/pistolcase/miniegun
/obj/item/storage/pistolcase/miniegun/PopulateContents()
- new /obj/item/gun/energy/e_gun/empty_cell(src)
+ new /obj/item/gun/energy/e_gun/mini/empty_cell(src)
new /obj/item/stock_parts/cell/gun/mini(src)
/obj/item/storage/pistolcase/iongun
diff --git a/code/game/objects/items/storage/ration.dm b/code/game/objects/items/storage/ration.dm
index 482ba202a73e..b016cc339260 100644
--- a/code/game/objects/items/storage/ration.dm
+++ b/code/game/objects/items/storage/ration.dm
@@ -9,10 +9,20 @@
resistance_flags = FLAMMABLE
drop_sound = 'sound/items/handling/cardboardbox_drop.ogg'
pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg'
+ var/emblem_icon_state = "null"
+ var/ration_overlay = "null"
/obj/item/storage/ration/Initialize(mapload)
. = ..()
update_icon()
+ update_overlays()
+
+/obj/item/storage/ration/update_overlays()
+ . = ..()
+ var/mutable_appearance/ration_overlay
+ if(emblem_icon_state)
+ ration_overlay = mutable_appearance(icon, emblem_icon_state)
+ add_overlay(ration_overlay)
/obj/item/storage/ration/ComponentInitialize()
. = ..()
@@ -38,7 +48,7 @@
/obj/item/storage/ration/vegan_chili
name = "vegan chili with beans ration"
desc = "A complete meal package containing a hearty vegan chili with beans, complemented by vegetable crackers, savory cornbread, flavorful pizza crackers, and more. A perfect choice for plant-based nourishment."
-
+ emblem_icon_state = "emblem_vegan_chili"
/obj/item/storage/ration/vegan_chili/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/vegan_chili = 1,
@@ -54,7 +64,7 @@
/obj/item/storage/ration/shredded_beef
name = "shredded beef in barbecue sauce ration"
desc = "Enjoy the rich and savory flavors of shredded beef in smoky barbecue sauce with this satisfying ration. Accompanied by a fruit puree, jerky wrap, cinnamon bun, and additional condiments, this ration is perfect for meat lovers."
-
+ emblem_icon_state = "emblem_shredded_beef"
/obj/item/storage/ration/shredded_beef/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/shredded_beef = 1,
@@ -70,7 +80,7 @@
/obj/item/storage/ration/pork_spaghetti
name = "spaghetti with pork and sauce ration"
desc = "Indulge in a comforting meal of spaghetti with tender pork and savory sauce with this ration. Complemented by a toaster pastry, seasoned bread sticks, dried raisins, and other accompaniments, this ration offers a flavorful experience."
-
+ emblem_icon_state = "emblem_pork_spaghetti"
/obj/item/storage/ration/pork_spaghetti/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/pork_spaghetti = 1,
@@ -86,7 +96,7 @@
/obj/item/storage/ration/fried_fish
name = "fried fish chunks ration"
desc = "Experience the crispy delight of fried fish chunks with this ration. Accompanied by an energy bar, tortillas, toasted corn kernels, and more, this ration provides a satisfying combination of flavors and textures."
-
+ emblem_icon_state = "emblem_fried_fish"
/obj/item/storage/ration/fried_fish/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/fried_fish = 1,
@@ -103,7 +113,7 @@
/obj/item/storage/ration/beef_strips
name = "beef strips in tomato sauce ration"
desc = "Savor the deliciousness of tender beef strips in a flavorful tomato sauce with this ration. Enjoy a chocolate pudding, white wheat snack bread, blackberry preserves, and peppermint candy rings as delightful accompaniments."
-
+ emblem_icon_state = "emblem_beef_strips"
/obj/item/storage/ration/beef_strips/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/beef_strips = 1,
@@ -120,7 +130,7 @@
/obj/item/storage/ration/chili_macaroni
name = "chili and macaroni ration"
desc = "Indulge in the comforting combination of chili and macaroni in this flavorful ration. Satisfy your taste buds with a mix of sweet and savory treats."
-
+ emblem_icon_state = "emblem_chili_macaroni"
/obj/item/storage/ration/chili_macaroni/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/chili_macaroni = 1,
@@ -137,7 +147,7 @@
/obj/item/storage/ration/chicken_wings_hot_sauce
name = "chicken wings in hot sauce ration"
desc = "Experience the bold and spicy flavors of chicken wings drenched in hot sauce. This ration also includes a mix of delightful snacks for a well-rounded meal."
-
+ emblem_icon_state = "emblem_chicken_wings_hot_sauce"
/obj/item/storage/ration/chicken_wings_hot_sauce/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/chicken_wings_hot_sauce = 1,
@@ -153,7 +163,7 @@
/obj/item/storage/ration/fish_stew
name = "fish stew ration"
desc = "Dive into the depths of flavor with this fish stew ration. Enjoy a hearty blend of seafood and vegetables, complemented by a selection of tasty accompaniments."
-
+ emblem_icon_state = "emblem_fish_stew"
/obj/item/storage/ration/fish_stew/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/fish_stew = 1,
@@ -170,7 +180,7 @@
/obj/item/storage/ration/lemon_pepper_chicken
name = "lemon pepper chicken ration"
desc = "A tasty Lemon Pepper Chicken ration that combines the flavors of fruit and meat. Perfect for a satisfying meal."
-
+ emblem_icon_state = "emblem_lemon_pepper_chicken"
/obj/item/storage/ration/lemon_pepper_chicken/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/lemon_pepper_chicken = 1,
@@ -186,7 +196,7 @@
/obj/item/storage/ration/sausage_peppers_onions
name = "sausage, peppers and onions ration"
desc = "Indulge in the delightful combination of juicy sausage, peppers, and onions in this hearty ration."
-
+ emblem_icon_state = "emblem_sausage_peppers_onions"
/obj/item/storage/ration/sausage_peppers_onions/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/sausage_peppers_onions = 1,
@@ -202,7 +212,7 @@
/obj/item/storage/ration/pork_dumplings_chili_sauce
name = "pork dumplings in chili sauce ration"
desc = "Savor the rich flavors of pork dumplings in a spicy chili sauce, accompanied by a variety of complementary snacks."
-
+ emblem_icon_state = "emblem_pork_dumplings_chili_sauce"
/obj/item/storage/ration/pork_dumplings_chili_sauce/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/dumplings_chili_sauce = 1,
@@ -218,7 +228,7 @@
/obj/item/storage/ration/battered_fish_sticks
name = "battered fish sticks ration"
desc = "Enjoy the crispy goodness of battered fish sticks, along with a selection of sides and a delectable dessert."
-
+ emblem_icon_state = "emblem_battered_fish_sticks"
/obj/item/storage/ration/battered_fish_sticks/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/battered_fish_sticks = 1,
@@ -234,7 +244,7 @@
/obj/item/storage/ration/assorted_salted_offal
name = "assorted salted offal ration"
desc = "An adventurous choice, this ration offers an assortment of salted offal, providing a unique culinary experience."
-
+ emblem_icon_state = "emblem_assorted_salted_offal"
/obj/item/storage/ration/assorted_salted_offal/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/assorted_salted_offal = 1,
@@ -250,7 +260,7 @@
/obj/item/storage/ration/maple_pork_sausage_patty
name = "maple pork sausage patty ration"
desc = "Start your day with a satisfying breakfast featuring a maple-infused pork sausage patty and a variety of treats."
-
+ emblem_icon_state = "emblem_maple_pork_sausage_patty"
/obj/item/storage/ration/maple_pork_sausage_patty/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/maple_pork_sausage_patty = 1,
@@ -267,7 +277,7 @@
/obj/item/storage/ration/pepper_jack_beef_patty
name = "jalapeno pepper jack beef patty ration"
desc = "Experience a flavorful fusion of jalapeno, pepper jack cheese, and beef in this grilled beef patty ration."
-
+ emblem_icon_state = "emblem_pepper_jack_beef_patty"
/obj/item/storage/ration/pepper_jack_beef_patty/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/pepper_jack_beef_patty = 1,
@@ -284,7 +294,7 @@
/obj/item/storage/ration/beef_goulash
name = "beef goulash ration"
desc = "Delight in the rich flavors of beef goulash, accompanied by a selection of sides and a sweet treat."
-
+ emblem_icon_state = "emblem_beef_goulash"
/obj/item/storage/ration/beef_goulash/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/beef_goulash = 1,
@@ -301,7 +311,7 @@
/obj/item/storage/ration/pepperoni_pizza_slice
name = "pepperoni pizza slice ration"
desc = "Indulge in the classic taste of pepperoni pizza with this ration, complete with sides and a refreshing beverage."
-
+ emblem_icon_state = "emblem_pepperoni_pizza_slice"
/obj/item/storage/ration/pepperoni_pizza_slice/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/pepperoni_pizza_slice = 1,
@@ -317,7 +327,7 @@
/obj/item/storage/ration/blackened_calamari
name = "blackened calamari in red sauce ration"
desc = "Enjoy the savory delight of blackened calamari served in a rich red sauce."
-
+ emblem_icon_state = "emblem_blackened_calamari"
/obj/item/storage/ration/blackened_calamari/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/blackened_calamari = 1,
@@ -334,7 +344,7 @@
/obj/item/storage/ration/elbow_macaroni
name = "elbow macaroni in tomato sauce ration"
desc = "Savor the comforting taste of elbow macaroni in a delicious tomato sauce."
-
+ emblem_icon_state = "emblem_elbow_macaroni"
/obj/item/storage/ration/elbow_macaroni/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/elbow_macaroni = 1,
@@ -351,7 +361,7 @@
/obj/item/storage/ration/cheese_pizza_slice
name = "cheese pizza slice ration"
desc = "Experience the timeless flavor of a classic cheese pizza slice."
-
+ emblem_icon_state = "emblem_cheese_pizza_slice"
/obj/item/storage/ration/cheese_pizza_slice/PopulateContents()
var/static/items_inside = list(
/obj/item/reagent_containers/food/snacks/ration/entree/cheese_pizza_slice = 1,
@@ -368,7 +378,7 @@
/obj/item/storage/ration/crayons
name = "military grade crayon ration"
desc = "Proven to increase kill count by atleast 1."
-
+ emblem_icon_state = "emblem_crayons"
/obj/item/storage/ration/crayons/PopulateContents()
var/static/items_inside = list(
/obj/item/toy/crayon/red = 1,
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 002b72633294..2c8fda3ec5d7 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -19,26 +19,21 @@
/obj/item/spacecash/bundle,
/obj/item/holochip,
/obj/item/card,
- /obj/item/clothing/mask/cigarette,
/obj/item/flashlight/pen,
/obj/item/seeds,
- /obj/item/stack/medical,
/obj/item/toy/crayon,
/obj/item/coin,
/obj/item/dice,
/obj/item/disk,
- /obj/item/implanter,
/obj/item/lighter,
+ /obj/item/key/ship,
+ /obj/item/gun/ballistic/derringer,
/obj/item/lipstick,
/obj/item/match,
/obj/item/paper,
/obj/item/pen,
/obj/item/photo,
- /obj/item/reagent_containers/dropper,
- /obj/item/reagent_containers/syringe,
- /obj/item/screwdriver,
- /obj/item/stamp),
- list(/obj/item/screwdriver/power))
+ /obj/item/stamp))
/obj/item/storage/wallet/Exited(atom/movable/AM)
. = ..()
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 4095d159ea82..50f709dcd65f 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -377,7 +377,7 @@
//Todo : cache these.
/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE) //apply chemcolor and level
- . = list()
+ . = ..()
//inhands + reagent_filling
if(!isinhands && reagents.total_volume)
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10")
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 3e4ab0d15de1..7c35ddd67d62 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -53,7 +53,7 @@
. += base_overlay
/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file)
- . = list()
+ . = ..()
if(isinhands && random_color)
var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head")
M.appearance_flags = RESET_COLOR
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index a76334a0b7ea..89eb9b0019e4 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -366,7 +366,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/cane
name = "cane"
- desc = "A cane used by a true gentleman. Or a clown."
+ desc = "A cane used by a true gentleman."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "cane"
item_state = "stick"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index d57e31ce9514..1a89195c646a 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -132,7 +132,7 @@ LINEN BINS
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
icon_state = "sheetrd"
item_state = "sheetrd"
- dream_messages = list("authority", "a silvery ID", "a bomb", "a mech", "a facehugger", "maniacal laughter", "the research director")
+ dream_messages = list("authority", "a silvery ID", "a bomb", "an exosuit", "a facehugger", "maniacal laughter", "the research director")
/obj/item/bedsheet/medical
name = "medical blanket"
@@ -353,7 +353,7 @@ LINEN BINS
name = "double research director's bedsheet"
icon_state = "double_sheetrd"
item_state = "sheetrd"
- dream_messages = list("authority", "a silvery ID", "a bomb", "a mech", "a facehugger", "maniacal laughter", "the research director")
+ dream_messages = list("authority", "a silvery ID", "a bomb", "an exosuit", "a facehugger", "maniacal laughter", "the research director")
desc = "It appears to have a beaker emblem, and is made out of fire-resistant material, although it probably won't protect you in the event of fires you're familiar with every day."
/obj/item/bedsheet/double/solgov
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 6a53024a81a0..32d6f02721c5 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -258,3 +258,13 @@
/obj/structure/fluff/hedge/opaque //useful for mazes and such
opacity = TRUE
+
+/obj/structure/fluff/glowshroom
+ name = "glowshroom"
+ desc = "Mycena bregprox, a species of mushroom that glows in the dark."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "glowshroom"
+ layer = ABOVE_NORMAL_TURF_LAYER
+ light_color = "#C3E381"
+ light_range = 2
+ light_power = 1
diff --git a/code/game/objects/structures/plaques/static_plaques.dm b/code/game/objects/structures/plaques/static_plaques.dm
index 1ac3ec7546da..00944c197415 100644
--- a/code/game/objects/structures/plaques/static_plaques.dm
+++ b/code/game/objects/structures/plaques/static_plaques.dm
@@ -47,3 +47,11 @@
name = "\improper Mr. Deempisi portrait"
desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
icon_state = "monkey_painting"
+
+/obj/structure/plaque/listeningpost
+ name = "Listening Post Commemoration Plaque"
+ engraved = TRUE
+
+/obj/structure/plaque/listeningpost/Initialize()
+ . = ..()
+ desc = "Cybersun Virtual Solutions - Field Listening Post #[rand(107,356)]. Proudly built in [rand(478, 497)]."
diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm
index ebefc58e5c01..d373f8eb94a9 100644
--- a/code/game/objects/structures/salvaging.dm
+++ b/code/game/objects/structures/salvaging.dm
@@ -673,7 +673,7 @@
/obj/effect/spawner/lootdrop/random_computer_circuit_rare
loot = list(
- /obj/item/circuitboard/computer/cargo/express = 5,
+ /obj/item/circuitboard/computer/cargo = 5,
/obj/item/circuitboard/computer/communications = 5,
/obj/item/circuitboard/computer/shuttle/helm = 5,
/obj/item/circuitboard/computer/med_data = 5,
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 475f2e00bcbc..5165e9ed649f 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -69,14 +69,14 @@
icon_state = "showcase_7"
/obj/structure/showcase/mecha/marauder
- name = "combat mech exhibit"
- desc = "A stand with an empty old Nanotrasen Corporation combat mech bolted to it. It is described as the premier unit used to defend corporate interests and employees."
+ name = "combat exosuit exhibit"
+ desc = "A stand with an empty old Nanotrasen Corporation combat exosuit bolted to it. It is described as the premier unit used to defend corporate interests and employees."
icon = 'icons/mecha/mecha.dmi'
icon_state = "marauder"
/obj/structure/showcase/mecha/ripley
- name = "construction mech exhibit"
- desc = "A stand with a retired construction mech bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart."
+ name = "construction exosuit exhibit"
+ desc = "A stand with a retired construction exosuit bolted to it. The clamps are rated at 9300PSI. It seems to be falling apart."
icon = 'icons/mecha/mecha.dmi'
icon_state = "firefighter"
diff --git a/code/game/objects/structures/table_flipped.dm b/code/game/objects/structures/table_flipped.dm
index c006695a7df0..28af5d0b63bd 100644
--- a/code/game/objects/structures/table_flipped.dm
+++ b/code/game/objects/structures/table_flipped.dm
@@ -17,10 +17,22 @@
AddElement(/datum/element/connect_loc, loc_connections)
+/obj/structure/flippedtable/examine(mob/user)
+ . = ..()
+ . += span_notice("You could right the [name] by control shift-clicking it.")
+
+/obj/structure/flippedtable/proc/check_dir()
+ if(dir == NORTHEAST || dir == SOUTHEAST)
+ return EAST
+ if(dir == NORTHWEST || dir == SOUTHWEST)
+ return WEST
+ return dir
+
/obj/structure/flippedtable/CanAllowThrough(atom/movable/mover, turf/target)
. = ..()
- var/attempted_dir = get_dir(loc, target)
- if(table_type == /obj/structure/table/glass) //Glass table, jolly ranchers pass
+ var/table_dir = check_dir()
+ var/attempted_dir = get_dir(loc, mover)
+ if(table_type == /obj/structure/table/glass) //Glass table, lasers can pass
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return TRUE
if(istype(mover, /obj/projectile))
@@ -29,20 +41,20 @@
if(proj_obj.trajectory && angle2dir_cardinal(proj_obj.trajectory.angle) == dir)
return TRUE
return FALSE
- return attempted_dir != dir
+ return attempted_dir != table_dir
/obj/structure/flippedtable/proc/on_exit(datum/source, atom/movable/exiter, direction)
SIGNAL_HANDLER
-
+ var/table_dir = check_dir()
if(exiter == src)
return // Let's not block ourselves.
- if(table_type == /obj/structure/table/glass) //Glass table, jolly ranchers pass
+ if(table_type == /obj/structure/table/glass) //Glass table, lasers pass
if(istype(exiter) && (exiter.pass_flags & PASSGLASS))
return
if(istype(exiter, /obj/projectile))
return
- if(direction == dir)
+ if(direction == table_dir)
exiter.Bump(src)
return COMPONENT_ATOM_BLOCK_EXIT
return
@@ -51,10 +63,10 @@
. = ..()
if(!istype(user) || !user.can_interact_with(src))
return FALSE
- user.visible_message("[user] starts flipping [src]!", "You start flipping over the [src]!")
+ user.visible_message(span_danger("[user] starts flipping [src]!"), span_notice("You start flipping over the [src]!"))
if(do_after(user, max_integrity/4))
var/obj/structure/table/table_unflip = new table_type(src.loc)
table_unflip.obj_integrity = obj_integrity
- user.visible_message("[user] flips over the [src]!", "You flip over the [src]!")
+ user.visible_message(span_danger("[user] flips over the [src]!"), span_notice("You flip over the [src]!"))
playsound(src, 'sound/items/trayhit2.ogg', 100)
qdel(src)
diff --git a/code/game/turfs/open/acid.dm b/code/game/turfs/open/acid.dm
index 50c7ee7bf98c..86260871c522 100644
--- a/code/game/turfs/open/acid.dm
+++ b/code/game/turfs/open/acid.dm
@@ -1,8 +1,8 @@
-/turf/open/acid
+/turf/open/water/acid
name = "acid lake"
+ desc = "A lake of acid."
icon_state = "acid"
- gender = PLURAL
- baseturfs = /turf/open/acid
+ baseturfs = /turf/open/water/acid
slowdown = 2
light_range = 2
@@ -10,90 +10,77 @@
light_color = LIGHT_COLOR_SLIME_LAMP
bullet_bounce_sound = 'sound/items/welder2.ogg'
+ planetary_atmos = FALSE
footstep = FOOTSTEP_LAVA
barefootstep = FOOTSTEP_LAVA
clawfootstep = FOOTSTEP_LAVA
heavyfootstep = FOOTSTEP_LAVA
-/turf/open/acid/CanAllowThrough(atom/movable/passing_atom, turf/target)
+ reagent_to_extract = /datum/reagent/toxin/acid
+ extracted_reagent_visible_name = "acid"
+
+/turf/open/water/acid/CanAllowThrough(atom/movable/passing_atom, turf/target)
if(ishostile(passing_atom))
return FALSE
return ..()
-/turf/open/acid/ex_act(severity, target)
+/turf/open/water/acid/ex_act(severity, target)
contents_explosion(severity, target)
-/turf/open/acid/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent)
- return
-
-/turf/open/acid/Melt()
+/turf/open/water/acid/Melt()
to_be_destroyed = FALSE
return src
-/turf/open/acid/acid_act(acidpwr, acid_volume)
+/turf/open/water/acid/acid_act(acidpwr, acid_volume)
return
-/turf/open/acid/MakeDry(wet_setting = TURF_WET_WATER)
+/turf/open/water/acid/MakeDry(wet_setting = TURF_WET_WATER)
return
-/turf/open/acid/airless
+/turf/open/water/acid/airless
initial_gas_mix = AIRLESS_ATMOS
-/turf/open/acid/Entered(atom/movable/AM)
+/turf/open/water/acid/Entered(atom/movable/AM)
. = ..()
if(melt_stuff(AM))
START_PROCESSING(SSobj, src)
-/turf/open/acid/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+/turf/open/water/acid/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
if(melt_stuff(AM))
START_PROCESSING(SSobj, src)
-/turf/open/acid/process()
+/turf/open/water/acid/process()
if(!melt_stuff())
STOP_PROCESSING(SSobj, src)
-/turf/open/acid/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
- switch(the_rcd.mode)
- if(RCD_FLOORWALL)
- return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3)
- return FALSE
-
-/turf/open/acid/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
- switch(passed_mode)
- if(RCD_FLOORWALL)
- to_chat(user, "You build a floor.")
- PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
- return TRUE
- return FALSE
-
-/turf/open/acid/singularity_act()
+/turf/open/water/acid/singularity_act()
return
-/turf/open/acid/singularity_pull(S, current_size)
+/turf/open/water/acid/singularity_pull(S, current_size)
return
-/turf/open/acid/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+/turf/open/water/acid/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
underlay_appearance.icon = 'icons/turf/floors.dmi'
underlay_appearance.icon_state = "basalt"
return TRUE
-/turf/open/acid/attackby(obj/item/C, mob/user, params)
+/turf/open/water/acid/attackby(obj/item/_item, mob/user, params)
..()
- if(istype(C, /obj/item/stack/rods))
- var/obj/item/stack/rods/R = C
+ if(istype(_item, /obj/item/stack/rods))
+ var/obj/item/stack/rods/R = _item
var/obj/structure/lattice/H = locate(/obj/structure/lattice, src)
if(H)
- to_chat(user, "There is already a lattice here!")
+ to_chat(user, span_warning("There is already a lattice here!"))
return
if(R.use(2))
- to_chat(user, "You construct a catwalk.")
+ to_chat(user, span_notice("You construct a catwalk."))
playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE)
new /obj/structure/lattice/catwalk(locate(x, y, z))
else
- to_chat(user, "You need one rod to build a lattice.")
+ to_chat(user, span_warning("You need one rod to build a lattice."))
return
-/turf/open/acid/proc/is_safe_to_cross()
+/turf/open/water/acid/proc/is_safe_to_cross()
//if anything matching this typecache is found in the lava, we don't burn things
var/static/list/acid_safeties_typecache = typecacheof(list(/obj/structure/catwalk, /obj/structure/stone_tile, /obj/structure/lattice/))
var/list/found_safeties = typecache_filter_list(contents, acid_safeties_typecache)
@@ -103,7 +90,7 @@
return LAZYLEN(found_safeties)
-/turf/open/acid/proc/melt_stuff(thing_to_melt)
+/turf/open/water/acid/proc/melt_stuff(thing_to_melt)
if(is_safe_to_cross())
return FALSE
. = FALSE
@@ -156,6 +143,6 @@
if(L) //mobs turning into object corpses could get deleted here.
L.acid_act(50, 100)
-/turf/open/acid/whitesands
+/turf/open/water/acid/whitesands
planetary_atmos = TRUE
initial_gas_mix = WHITESANDS_ATMOS
diff --git a/code/game/turfs/open/floor/plating/rockplanet.dm b/code/game/turfs/open/floor/plating/rockplanet.dm
index eb0caa6485b1..b6324ebbb3d8 100644
--- a/code/game/turfs/open/floor/plating/rockplanet.dm
+++ b/code/game/turfs/open/floor/plating/rockplanet.dm
@@ -65,15 +65,63 @@
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior plating"
+/turf/open/floor/plating/rockplanet/lit
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_VERY_LIGHT_GRAY
/turf/open/floor/plasteel/stairs/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior stairs"
-
/turf/open/floor/engine/hull/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
/turf/open/floor/plasteel/rockplanet
initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
name = "exterior floor"
+
+/turf/open/floor/plasteel/patterned/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/plasteel/patterned/rockplanet/lit
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_VERY_LIGHT_GRAY
+ name = "exterior floor"
+
+/turf/open/floor/plasteel/patterned/brushed/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/plasteel/patterned/brushed/rockplanet/lit
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_VERY_LIGHT_GRAY
+ name = "exterior floor"
+
+/turf/open/floor/plasteel/patterned/ridged/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/plasteel/patterned/ridged/rockplanet/lit
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_VERY_LIGHT_GRAY
+ name = "exterior floor"
+
+/turf/open/floor/plating/rust/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/plating/rust/rockplanet/lit
+ light_range = 2
+ light_power = 0.6
+ light_color = COLOR_VERY_LIGHT_GRAY
+ name = "exterior plating"
+
+/turf/open/floor/wood/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/pod/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
+
+/turf/open/floor/engine/hull/reinforced/rockplanet
+ initial_gas_mix = ROCKPLANET_DEFAULT_ATMOS
diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm
index 9128844e1a2f..f94db41d4713 100644
--- a/code/game/turfs/open/water.dm
+++ b/code/game/turfs/open/water.dm
@@ -18,27 +18,33 @@
var/datum/reagent/reagent_to_extract = /datum/reagent/water
var/extracted_reagent_visible_name = "water"
-/*
-/turf/open/water/attackby(obj/item/tool, mob/user, params)
+/turf/open/water/examine(mob/user)
+ . = ..()
+ if(reagent_to_extract)
+ . += span_notice("You could probably scoop some of the [extracted_reagent_visible_name] if you had a beaker...")
+
+/turf/open/water/attackby(obj/item/_item, mob/user, params)
+ if(istype(_item, /obj/item/fish))
+ to_chat(user, span_notice("You toss the [_item.name] into the [name]."))
+ playsound(_item, "sound/effects/bigsplash.ogg", 90)
+ qdel(_item)
+ if(istype(_item, /obj/item/reagent_containers/glass))
+ extract_reagents(_item,user,params)
+
+ . = ..()
+
+/turf/open/water/proc/extract_reagents(obj/item/reagent_containers/glass/container, mob/user, params)
if(!reagent_to_extract)
- return ..()
- var/obj/item/reagent_containers/glass/container = tool
- if(!istype(tool, /obj/item/reagent_containers))
- return ..()
+ return FALSE
+ if(!container.is_refillable())
+ to_chat(user, span_danger("\The [container]'s cap is on! Take it off first."))
+ return FALSE
if(container.reagents.total_volume >= container.volume)
- to_chat(user, "[container] is full.")
- return
+ to_chat(user, span_danger("\The [container] is full."))
+ return FALSE
container.reagents.add_reagent(reagent_to_extract, rand(5, 10))
- user.visible_message("[user] scoops [extracted_reagent_visible_name] from the [src] with \the [container].", "You scoop out [extracted_reagent_visible_name] from the [src] using \the [container].")
+ user.visible_message(span_notice("[user] scoops [extracted_reagent_visible_name] from the [src] with \the [container]."), span_notice("You scoop out [extracted_reagent_visible_name] from the [src] using \the [container]."))
return TRUE
-*/
-
-/turf/open/water/attackby(obj/item/fish, mob/user, params)
- . = ..()
- if(istype(fish, /obj/item/fish))
- to_chat(user, "You toss the [fish.name] into the water.")
- playsound(fish, "sound/effects/bigsplash.ogg", 90)
- qdel(fish)
/turf/open/water/can_have_cabling()
return FALSE
@@ -52,7 +58,7 @@
/turf/open/water/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
switch(passed_mode)
if(RCD_FLOORWALL)
- to_chat(user, "You build a floor.")
+ to_chat(user, span_notice("You build a floor."))
PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
return TRUE
return FALSE
@@ -85,7 +91,7 @@
/turf/open/water/tar
name = "tar pit"
- desc = "Shallow tar. Will slow you down significantly. You could use a beaker to scoop some out..."
+ desc = "Shallow tar. Will slow you down significantly."
color = "#473a3a"
light_range = 0
slowdown = 2
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 9c4f15b9d460..42193738319e 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -103,6 +103,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/cmd_admin_gib_self,
/client/proc/cmd_change_command_name,
/client/proc/cmd_admin_create_centcom_report,
+ /client/proc/cmd_admin_distress_signal,
/client/proc/drop_bomb,
/client/proc/set_dynex_scale,
/client/proc/drop_dynex_bomb,
@@ -254,6 +255,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cinematic,
/client/proc/cmd_admin_add_freeform_ai_law,
/client/proc/cmd_admin_create_centcom_report,
+ /client/proc/cmd_admin_distress_signal,
/client/proc/cmd_change_command_name,
/client/proc/object_say,
/client/proc/toggle_random_events,
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index f189fdf6106d..853d33e1b61b 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -360,6 +360,21 @@
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
+/client/proc/cmd_admin_distress_signal()
+ set category = "Event"
+ set name = "Create Distress Signal"
+
+ var/datum/overmap/ship/ship = SSshuttle.get_ship(usr)
+ if(!ship)
+ return
+ var/confirm = alert(src, "Do you want to create a distress signal for [ship.name]", "Distress Signal", "Yes", "Cancel")
+
+ switch(confirm)
+ if("Yes")
+ create_distress_beacon(ship)
+ if("Cancel")
+ return
+
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
set category = "Debug"
set name = "Delete"
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 53d17bf325aa..69c9248d6fb9 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -423,7 +423,7 @@
return 0
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
- . = list()
+ . = ..()
if(!isinhands && current_charges)
. += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01)
diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm
index fb0d7026a6d1..662b88046956 100644
--- a/code/modules/atmospherics/auxgm/gas_types.dm
+++ b/code/modules/atmospherics/auxgm/gas_types.dm
@@ -165,5 +165,30 @@
color = "#ffe"
fusion_power = 0
fire_products = list(GAS_H2O = 1)
+ enthalpy = FIRE_HYDROGEN_ENERGY_RELEASED
fire_burn_rate = 2
fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50
+
+/datum/gas/chlorine
+ id = GAS_CHLORINE
+ specific_heat = 20
+ name = "Chlorine"
+ flags = GAS_FLAG_DANGEROUS
+ moles_visible = MOLES_GAS_VISIBLE * 5
+ gas_overlay = "nitrous_oxide"
+ color = "#FFFB89"
+ fusion_power = 0
+
+/datum/gas/hydrogen_chloride
+ id = GAS_HYDROGEN_CHLORIDE
+ specific_heat = 40
+ name = "Hydrogen Chloride"
+ flags = GAS_FLAG_DANGEROUS
+ moles_visible = MOLES_GAS_VISIBLE * 2
+ gas_overlay = "nitrous_oxide"
+ color = "#5bfd45"
+ fusion_power = 0
+ fire_products = list(GAS_CHLORINE = 1, GAS_H2O = 0.5)
+ enthalpy = 63000
+ fire_burn_rate = 1
+ fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm
index b3a81dbb0e9c..e774d1060ec3 100644
--- a/code/modules/atmospherics/gasmixtures/auxgm.dm
+++ b/code/modules/atmospherics/gasmixtures/auxgm.dm
@@ -1,5 +1,5 @@
GLOBAL_LIST_INIT(hardcoded_gases, list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLASMA)) //the main four gases, which were at one time hardcoded
-GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLUOXIUM, GAS_STIMULUM, GAS_NITRYL))) //unable to react amongst themselves
+GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLUOXIUM, GAS_STIMULUM, GAS_NITRYL, GAS_CHLORINE, GAS_HYDROGEN_CHLORIDE))) //unable to react amongst themselves
// Auxgm
// It's a send-up of XGM, like what baystation got.
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 00ca2d22f76c..b824c1d78d61 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -825,3 +825,32 @@
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
air.set_temperature(clamp((air.return_temperature()*old_heat_capacity + energy_released)/new_heat_capacity,TCMB,INFINITY))
return REACTING
+
+/datum/gas_reaction/hydrogen_chloride_formation
+ priority = 11
+ name = "Hydrogen Chloride formation"
+ id = "hydrogenchlorideformation"
+
+/datum/gas_reaction/hydrogen_chloride_formation/init_reqs()
+ min_requirements = list(
+ GAS_CHLORINE = 5,
+ GAS_HYDROGEN = 5,
+ "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST
+ )
+
+/datum/gas_reaction/hydrogen_chloride_formation/react(datum/gas_mixture/air)
+ var/temperature = air.return_temperature()
+ var/old_heat_capacity = air.heat_capacity()
+ var/reaction_efficency = min((temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*10)),air.get_moles(GAS_CHLORINE),air.get_moles(GAS_HYDROGEN))
+ var/energy_released = reaction_efficency*185000
+ if ((air.get_moles(GAS_CHLORINE) - reaction_efficency < 0)|| (air.get_moles(GAS_HYDROGEN) - (reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
+ return NO_REACTION
+ air.adjust_moles(GAS_HYDROGEN_CHLORIDE, reaction_efficency)
+ air.adjust_moles(GAS_HYDROGEN, -reaction_efficency)
+ air.adjust_moles(GAS_CHLORINE, -reaction_efficency)
+
+ if(energy_released > 0)
+ var/new_heat_capacity = air.heat_capacity()
+ if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
+ air.set_temperature(max(((temperature*old_heat_capacity + energy_released)/new_heat_capacity),TCMB))
+ return REACTING
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index e5a1be0294d6..236c7b040d99 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -106,6 +106,11 @@
var/alarm_frequency = FREQ_ATMOS_ALARMS
var/datum/radio_frequency/radio_connection
+ //anything outright hazardous (flammable, toxic, generally Weird)
+ var/list/filter_basic = list(GAS_CO2, GAS_PLASMA, GAS_NITROUS, GAS_BZ, GAS_TRITIUM, GAS_NITRYL, GAS_FREON, GAS_HYDROGEN, GAS_CHLORINE, GAS_HYDROGEN_CHLORIDE)
+ //anything that isn't o2 or n2.
+ var/list/filter_extra = list(GAS_CO2, GAS_PLASMA, GAS_NITROUS, GAS_BZ, GAS_TRITIUM, GAS_NITRYL, GAS_FREON, GAS_HYDROGEN, GAS_CHLORINE, GAS_HYDROGEN_CHLORIDE, GAS_H2O, GAS_HYPERNOB, GAS_STIMULUM, GAS_PLUOXIUM)
+
var/list/TLV = list( // Breathable air.
"pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), // kPa. Values are min2, min1, max1, max2
"temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66),
@@ -122,7 +127,9 @@
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
GAS_FREON = new/datum/tlv/dangerous,
- GAS_HYDROGEN = new/datum/tlv/dangerous
+ GAS_HYDROGEN = new/datum/tlv/dangerous,
+ GAS_CHLORINE = new/datum/tlv/dangerous,
+ GAS_HYDROGEN_CHLORIDE = new/datum/tlv/dangerous
)
/obj/machinery/airalarm/server // No checks here.
@@ -142,7 +149,9 @@
GAS_NITRYL = new/datum/tlv/no_checks,
GAS_PLUOXIUM = new/datum/tlv/no_checks,
GAS_FREON = new/datum/tlv/no_checks,
- GAS_HYDROGEN = new/datum/tlv/no_checks
+ GAS_HYDROGEN = new/datum/tlv/no_checks,
+ GAS_CHLORINE = new/datum/tlv/dangerous,
+ GAS_HYDROGEN_CHLORIDE = new/datum/tlv/dangerous
)
heating_manage = FALSE
@@ -163,7 +172,9 @@
GAS_NITRYL = new/datum/tlv/dangerous,
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
GAS_FREON = new/datum/tlv/dangerous,
- GAS_HYDROGEN = new/datum/tlv/dangerous
+ GAS_HYDROGEN = new/datum/tlv/dangerous,
+ GAS_CHLORINE = new/datum/tlv/dangerous,
+ GAS_HYDROGEN_CHLORIDE = new/datum/tlv/dangerous
)
heating_manage = FALSE
@@ -542,7 +553,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
for(var/device_id in A.air_scrub_names)
send_signal(device_id, list(
"power" = 1,
- "set_filters" = list(GAS_CO2, GAS_BZ),
+ "set_filters" = filter_basic,
"scrubbing" = 1,
"widenet" = 0
), signal_source)
@@ -556,20 +567,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
for(var/device_id in A.air_scrub_names)
send_signal(device_id, list(
"power" = 1,
- "set_filters" = list(
- GAS_CO2,
- GAS_PLASMA,
- GAS_H2O,
- GAS_HYPERNOB,
- GAS_NITROUS,
- GAS_NITRYL,
- GAS_TRITIUM,
- GAS_BZ,
- GAS_STIMULUM,
- GAS_PLUOXIUM,
- GAS_FREON,
- GAS_HYDROGEN
- ),
+ "set_filters" = filter_extra,
"scrubbing" = 1,
"widenet" = 1
), signal_source)
@@ -596,7 +594,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27)
for(var/device_id in A.air_scrub_names)
send_signal(device_id, list(
"power" = 1,
- "set_filters" = list(GAS_CO2, GAS_BZ),
+ "set_filters" = filter_basic,
"scrubbing" = 1,
"widenet" = 0
), signal_source)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index f2e563c07b5e..cb6a1b9b0bb0 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -54,7 +54,9 @@
"caution" = /obj/machinery/portable_atmospherics/canister,
"freon" = /obj/machinery/portable_atmospherics/canister/freon,
"hydrogen" = /obj/machinery/portable_atmospherics/canister/hydrogen,
- "fuel mix" = /obj/machinery/portable_atmospherics/canister/fuel
+ "fuel mix" = /obj/machinery/portable_atmospherics/canister/fuel,
+ "cl2" = /obj/machinery/portable_atmospherics/canister/chlorine,
+ "hcl" =/obj/machinery/portable_atmospherics/canister/hydrogen_chloride,
)
/obj/machinery/portable_atmospherics/canister/interact(mob/user)
@@ -170,6 +172,20 @@
air_contents.set_moles(GAS_HYDROGEN, 1000)
air_contents.set_temperature(T20C)
+/obj/machinery/portable_atmospherics/canister/chlorine
+ name = "chlorine canister"
+ desc = "chlorine"
+ icon_state = "greenys"
+ gas_type = GAS_CHLORINE
+ filled = 1
+
+/obj/machinery/portable_atmospherics/canister/hydrogen_chloride
+ name = "hydrogen chloride canister"
+ desc = "awful"
+ icon_state = "greenyshaz"
+ gas_type = GAS_HYDROGEN_CHLORIDE
+ filled = 1
+
/obj/machinery/portable_atmospherics/canister/fusion_test
name = "fusion test canister"
desc = "Don't be a badmin."
diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm
index b7ab7c454d98..abaaceefd604 100644
--- a/code/modules/awaymissions/mission_code/caves.dm
+++ b/code/modules/awaymissions/mission_code/caves.dm
@@ -58,4 +58,4 @@
/obj/item/paper/fluff/awaymissions/caves/mech_notice
name = "NOTICE!! paper"
- default_raw_text = "
NOTICE!!
Although you may seem indestructible in a mech, remember, THIS SHIT ISN'T LAVA PROOF!! The boys have already had to deal with loosing the last two to salvage because the dumbass thought he could just wade through the lower lakes like it was nothing. The fact he even managed to get back without being fused with what was left of the mech is a miracle in itself. They're built to be resistant against extreme heat, not heat PROOF!
Robotics Team"
+ default_raw_text = "
NOTICE!!
Although you may seem indestructible in an exosuit, remember, THIS SHIT ISN'T LAVA PROOF!! The boys have already had to deal with loosing the last two to salvage because the dumbass thought he could just wade through the lower lakes like it was nothing. The fact he even managed to get back without being fused with what was left of the exosuit is a miracle in itself. They're built to be resistant against extreme heat, not heat PROOF!
Robotics Team"
diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm
index d0e946ba2a6e..969a41601fbb 100644
--- a/code/modules/cargo/bounties/chef.dm
+++ b/code/modules/cargo/bounties/chef.dm
@@ -2,7 +2,7 @@
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 4000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
+ wanted_types = list(/obj/item/food/cake/birthday, /obj/item/food/cakeslice/birthday)
/datum/bounty/item/chef/soup
name = "Soup"
@@ -43,7 +43,7 @@
name = "Bread"
description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions."
reward = 1000
- wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
+ wanted_types = list(/obj/item/food/bread, /obj/item/food/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
/datum/bounty/item/chef/pie
name = "Pie"
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 143480b2bc71..82fd2c11d01a 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -1,42 +1,57 @@
+#define BEACON_COST 500
+#define SP_LINKED 1
+#define SP_READY 2
+#define SP_LAUNCH 3
+#define SP_UNLINK 4
+#define SP_UNREADY 5
+
/obj/machinery/computer/cargo
- name = "supply console"
- desc = "Used to order supplies, approve requests, and control the shuttle."
- icon_screen = "supply"
+ name = "outpost communications console"
+ desc = "This console allows the user to communicate with a nearby outpost to \
+ purchase supplies and manage missions. Purchases are delivered near-instantly."
+ icon_screen = "supply_express"
circuit = /obj/item/circuitboard/computer/cargo
light_color = COLOR_BRIGHT_ORANGE
- var/requestonly = FALSE
var/contraband = FALSE
var/self_paid = FALSE
var/safety_warning = "For safety reasons, the automated supply shuttle \
cannot transport live organisms, human remains, classified nuclear weaponry, \
homing beacons or machinery housing any form of artificial intelligence."
- var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible."
- /// radio used by the console to send messages on supply channel
- var/obj/item/radio/headset/radio
/// var that tracks message cooldown
var/message_cooldown
-
-/obj/machinery/computer/cargo/request
- name = "supply request console"
- desc = "Used to request supplies from cargo."
- icon_screen = "request"
- circuit = /obj/item/circuitboard/computer/cargo/request
- requestonly = TRUE
+ var/blockade_warning = "Bluespace instability detected. Delivery impossible."
+ var/message
+ /// Number of beacons printed. Used to determine beacon names.
+ var/printed_beacons = 0
+ var/list/supply_pack_data
+ /// The currently linked supplypod beacon
+ var/obj/item/supplypod_beacon/beacon
+ /// Area instance that cargo pods are sent to
+ var/area/landingzone
+ /// The pod type used to deliver orders
+ var/podType = /obj/structure/closet/supplypod/centcompod
+ /// Cooldown to prevent printing supplypod beacon spam
+ var/cooldown = 0
+ /// Is the console in beacon mode? exists to let beacon know when a pod may come in
+ var/use_beacon = FALSE
+ /// The account to charge purchases to, defaults to the cargo budget
+ var/datum/bank_account/charge_account
/obj/machinery/computer/cargo/Initialize()
. = ..()
- radio = new /obj/item/radio/headset/headset_cargo(src)
var/obj/item/circuitboard/computer/cargo/board = circuit
contraband = board.contraband
if (board.obj_flags & EMAGGED)
obj_flags |= EMAGGED
else
obj_flags &= ~EMAGGED
+ generate_pack_data()
/obj/machinery/computer/cargo/Destroy()
- QDEL_NULL(radio)
+ if(beacon)
+ beacon.unlink_console()
return ..()
/obj/machinery/computer/cargo/proc/get_export_categories()
@@ -65,49 +80,68 @@
/obj/machinery/computer/cargo/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "Cargo", name)
+ ui = new(user, src, "OutpostCommunications", name)
ui.open()
+ if(!charge_account)
+ reconnect()
-/obj/machinery/computer/cargo/ui_data()
+/obj/machinery/computer/cargo/ui_data(mob/user)
+ var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
var/list/data = list()
- data["location"] = SSshuttle.supply.getStatusText()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
+
+ // not a big fan of get_containing_shuttle
+ var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
+ var/datum/overmap/ship/controlled/ship
+ var/outpost_docked = FALSE
if(D)
- data["points"] = D.account_balance
- data["away"] = SSshuttle.supply.get_docked() == SSshuttle.supply_away_port
- data["self_paid"] = self_paid
- data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
- var/message = "Remember to stamp and send back the supply manifests."
- if(SSshuttle.centcom_message)
- message = SSshuttle.centcom_message
+ ship = D.current_ship
+ outpost_docked = istype(ship.docked_to, /datum/overmap/outpost)
+
+ data["onShip"] = !isnull(ship)
+ data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0
+ data["maxMissions"] = ship ? ship.max_missions : 0
+ data["outpostDocked"] = outpost_docked
+ data["points"] = charge_account ? charge_account.account_balance : 0
+ data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user)
+ data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
+ data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay?
+ data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
+ data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE
+ data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
+ data["hasBeacon"] = beacon != null//is there a linked beacon?
+ data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
+ data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
+ data["supplies"] = list()
+ message = "Sales are near-instantaneous - please choose carefully."
if(SSshuttle.supplyBlocked)
message = blockade_warning
+ if(use_beacon && !beacon)
+ message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
+ else if (use_beacon && !canBeacon)
+ message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
data["message"] = message
- data["cart"] = list()
- for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
- data["cart"] += list(list(
- "object" = SO.pack.name,
- "cost" = SO.pack.cost,
- "id" = SO.id,
- "orderer" = SO.orderer,
- "paid" = !isnull(SO.paying_account) //paid by requester
- ))
+ if(!supply_pack_data)
+ generate_pack_data()
+ stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
+ data["supplies"] = supply_pack_data
+ if (cooldown > 0)//cooldown used for printing beacons
+ cooldown--
- data["requests"] = list()
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- data["requests"] += list(list(
- "object" = SO.pack.name,
- "cost" = SO.pack.cost,
- "orderer" = SO.orderer,
- "reason" = SO.reason,
- "id" = SO.id
- ))
+ data["shipMissions"] = list()
+ data["outpostMissions"] = list()
+
+ if(ship)
+ for(var/datum/mission/M as anything in ship.missions)
+ data["shipMissions"] += list(M.get_tgui_info())
+ if(outpost_docked)
+ var/datum/overmap/outpost/out = ship.docked_to
+ for(var/datum/mission/M as anything in out.missions)
+ data["outpostMissions"] += list(M.get_tgui_info())
return data
/obj/machinery/computer/cargo/ui_static_data(mob/user)
var/list/data = list()
- data["requestonly"] = requestonly
data["supplies"] = list()
for(var/pack in SSshuttle.supply_packs)
var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
@@ -116,7 +150,7 @@
"name" = P.group,
"packs" = list()
)
- if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)
+ if(P.hidden && !(obj_flags & EMAGGED))
continue
data["supplies"][P.group]["packs"] += list(list(
"name" = P.name,
@@ -124,7 +158,6 @@
"id" = pack,
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
"small_item" = P.small_item,
- "access" = P.access
))
return data
@@ -133,115 +166,154 @@
if(.)
return
switch(action)
- if("send")
- if(!SSshuttle.supply.canMove())
- say(safety_warning)
+ if("withdrawCash")
+ var/val = text2num(params["value"])
+ // no giving yourself money
+ if(!charge_account || !val || val <= 0)
return
- if(SSshuttle.supplyBlocked)
- say(blockade_warning)
- return
- if(SSshuttle.supply.get_docked() == SSshuttle.supply_home_port)
- SSshuttle.supply.export_categories = get_export_categories()
- SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_away_port, TRUE)
- say("The supply shuttle is departing.")
- investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO)
- else
- investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO)
- say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.")
- SSshuttle.moveShuttle(SSshuttle.supply, SSshuttle.supply_home_port, TRUE)
- . = TRUE
+ if(charge_account.adjust_money(-val))
+ var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val)
+ if(ishuman(usr))
+ var/mob/living/carbon/human/user = usr
+ user.put_in_hands(cash_chip)
+ playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE)
+ src.visible_message("[src] dispenses a holochip.")
+ return TRUE
+
+ if("LZCargo")
+ use_beacon = FALSE
+ if (beacon)
+ beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
+ if("LZBeacon")
+ use_beacon = TRUE
+ if (beacon)
+ beacon.update_status(SP_READY) //turns on the beacon's ready light
+ if("printBeacon")
+ if(charge_account?.adjust_money(-BEACON_COST))
+ cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
+ var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
+ C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
+ printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
+ beacon.name = "Supply Pod Beacon #[printed_beacons]"
if("add")
- if(istype(src, /obj/machinery/computer/cargo/express))
- return
- var/id = text2path(params["id"])
- var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
- if(!istype(pack))
- return
- if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly)
+ var/area/ship/current_area = get_area(src)
+ var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])]
+ if( \
+ !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \
+ !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \
+ )
return
- var/name = "*None Provided*"
- var/rank = "*None Provided*"
- var/ckey = usr.ckey
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- name = H.get_authentification_name()
- rank = H.get_assignment(hand_first = TRUE)
- else if(issilicon(usr))
- name = usr.real_name
- rank = "Silicon"
-
- var/datum/bank_account/account
- if(self_paid && ishuman(usr))
- var/mob/living/carbon/human/H = usr
- var/obj/item/card/id/id_card = H.get_idcard(TRUE)
- if(!istype(id_card))
- say("No ID card detected.")
- return
- account = id_card.registered_account
- if(!istype(account))
- say("Invalid bank account.")
- return
+ var/turf/landing_turf
+ if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay
+ landing_turf = get_turf(beacon)
+ beacon.update_status(SP_LAUNCH)
+ else if(!use_beacon)// find a suitable supplypod landing zone in cargobay
+ var/list/empty_turfs = list()
+ if(!landingzone)
+ reconnect()
+ if(!landingzone)
+ WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.")
+ landingzone = get_area(src)
+ for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
+ if(T.is_blocked_turf())
+ continue
+ empty_turfs += T
+ CHECK_TICK
+ landing_turf = pick(empty_turfs)
+
+ // note that, because of CHECK_TICK above, we aren't sure if we can
+ // afford the pack, even though we checked earlier. luckily adjust_money
+ // returns false if the account can't afford the price
+ if(landing_turf && charge_account.adjust_money(-pack.cost))
+ var/name = "*None Provided*"
+ var/rank = "*None Provided*"
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ name = H.get_authentification_name()
+ rank = H.get_assignment(hand_first = TRUE)
+ else if(issilicon(usr))
+ name = usr.real_name
+ rank = "Silicon"
+ var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "")
+ new /obj/effect/pod_landingzone(landing_turf, podType, SO)
+ update_appearance() // ??????????????????
+ return TRUE
- var/reason = ""
- if(requestonly && !self_paid)
- reason = stripped_input("Reason:", name, "")
- if(isnull(reason) || ..())
+ if("mission-act")
+ var/datum/mission/mission = locate(params["ref"])
+ var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
+ var/datum/overmap/ship/controlled/ship = D.current_ship
+ var/datum/overmap/outpost/outpost = ship.docked_to
+ if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery
+ return
+ if(!mission.accepted)
+ if(LAZYLEN(ship.missions) >= ship.max_missions)
return
+ mission.accept(ship, loc)
+ return TRUE
+ else if(mission.servant == ship)
+ if(mission.can_complete())
+ mission.turn_in()
+ else
+ mission.give_up()
+ return TRUE
- var/turf/T = get_turf(src)
- var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
- SO.generateRequisition(T)
- if(requestonly && !self_paid)
- SSshuttle.requestlist += SO
- else
- SSshuttle.shoppinglist += SO
- if(self_paid)
- say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.")
- if(requestonly && message_cooldown < world.time)
- radio.talk_into(src, "A new order has been requested.", RADIO_CHANNEL_COMMAND)
- message_cooldown = world.time + 30 SECONDS
- . = TRUE
- if("remove")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
- if(SO.id == id)
- SSshuttle.shoppinglist -= SO
- . = TRUE
- break
- if("clear")
- SSshuttle.shoppinglist.Cut()
- . = TRUE
- if("approve")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- if(SO.id == id)
- SSshuttle.requestlist -= SO
- SSshuttle.shoppinglist += SO
- . = TRUE
- break
- if("deny")
- var/id = text2num(params["id"])
- for(var/datum/supply_order/SO in SSshuttle.requestlist)
- if(SO.id == id)
- SSshuttle.requestlist -= SO
- . = TRUE
- break
- if("denyall")
- SSshuttle.requestlist.Cut()
- . = TRUE
- if("toggleprivate")
- self_paid = !self_paid
- . = TRUE
- if(.)
- post_signal("supply")
+/obj/machinery/computer/cargo/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
+ . = ..()
+ reconnect(port)
-/obj/machinery/computer/cargo/proc/post_signal(command)
+/obj/machinery/computer/cargo/proc/reconnect(obj/docking_port/mobile/port)
+ if(!port)
+ var/area/ship/current_area = get_area(src)
+ if(!istype(current_area))
+ return
+ port = current_area.mobile_port
+ if(!port)
+ return
+ charge_account = port.current_ship.ship_account
+ landingzone = locate(/area/ship/cargo) in port.shuttle_areas
- var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
+/obj/machinery/computer/cargo/attackby(obj/item/W, mob/living/user, params)
+ var/value = W.get_item_credit_value()
+ if(value && charge_account)
+ charge_account.adjust_money(value)
+ to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.")
+ qdel(W)
+ return TRUE
+ else if(istype(W, /obj/item/supplypod_beacon))
+ var/obj/item/supplypod_beacon/sb = W
+ if (sb.cargo_console != src)
+ sb.link_console(src, user)
+ return TRUE
+ else
+ to_chat(user, "[src] is already linked to [sb].")
+ ..()
- if(!frequency)
- return
+/obj/machinery/computer/cargo/proc/generate_pack_data()
+ supply_pack_data = list()
+ for(var/pack in SSshuttle.supply_packs)
+ var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
+ if(!supply_pack_data[P.group])
+ supply_pack_data[P.group] = list(
+ "name" = P.group,
+ "packs" = list()
+ )
+ if((P.hidden))
+ continue
+ supply_pack_data[P.group]["packs"] += list(list(
+ "name" = P.name,
+ "cost" = P.cost,
+ "id" = pack,
+ "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
+ ))
+
+/obj/machinery/computer/cargo/retro
+ icon = 'icons/obj/machines/retro_computer.dmi'
+ icon_state = "computer-retro"
+ deconpath = /obj/structure/frame/computer/retro
- var/datum/signal/status_signal = new(list("command" = command))
- frequency.post_signal(src, status_signal)
+/obj/machinery/computer/cargo/solgov
+ icon = 'icons/obj/machines/retro_computer.dmi'
+ icon_state = "computer-solgov"
+ deconpath = /obj/structure/frame/computer/solgov
diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm
deleted file mode 100644
index 81409d63d031..000000000000
--- a/code/modules/cargo/expressconsole.dm
+++ /dev/null
@@ -1,262 +0,0 @@
-#define BEACON_COST 500
-#define SP_LINKED 1
-#define SP_READY 2
-#define SP_LAUNCH 3
-#define SP_UNLINK 4
-#define SP_UNREADY 5
-
-/obj/machinery/computer/cargo/express
- name = "outpost communications console"
- desc = "This console allows the user to communicate with a nearby outpost to \
- purchase supplies and manage missions. Purchases are delivered near-instantly."
- icon_screen = "supply_express"
- circuit = /obj/item/circuitboard/computer/cargo/express
- var/blockade_warning = "Bluespace instability detected. Delivery impossible."
-
- var/message
- /// Number of beacons printed. Used to determine beacon names.
- var/printed_beacons = 0
- var/list/meme_pack_data
- /// The currently linked supplypod beacon
- var/obj/item/supplypod_beacon/beacon
- /// Area instance that cargo pods are sent to
- var/area/landingzone
- /// The pod type used to deliver orders
- var/podType = /obj/structure/closet/supplypod/centcompod
- /// Cooldown to prevent printing supplypod beacon spam
- var/cooldown = 0
- /// Is the console in beacon mode? exists to let beacon know when a pod may come in
- var/use_beacon = FALSE
- /// The account to charge purchases to, defaults to the cargo budget
- var/datum/bank_account/charge_account
-
-/obj/machinery/computer/cargo/express/retro
- icon = 'icons/obj/machines/retro_computer.dmi'
- icon_state = "computer-retro"
- deconpath = /obj/structure/frame/computer/retro
-
-/obj/machinery/computer/cargo/express/solgov
- icon = 'icons/obj/machines/retro_computer.dmi'
- icon_state = "computer-solgov"
- deconpath = /obj/structure/frame/computer/solgov
-
-/obj/machinery/computer/cargo/express/Initialize()
- . = ..()
- packin_up()
-
-/obj/machinery/computer/cargo/express/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
- . = ..()
- reconnect(port)
-
-/obj/machinery/computer/cargo/express/proc/reconnect(obj/docking_port/mobile/port)
- if(!port)
- var/area/ship/current_area = get_area(src)
- if(!istype(current_area))
- return
- port = current_area.mobile_port
- if(!port)
- return
- charge_account = port.current_ship.ship_account
- landingzone = locate(/area/ship/cargo) in port.shuttle_areas
-
-/obj/machinery/computer/cargo/express/Destroy()
- if(beacon)
- beacon.unlink_console()
- return ..()
-
-/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params)
- var/value = W.get_item_credit_value()
- if(value && charge_account)
- charge_account.adjust_money(value)
- to_chat(user, "You deposit [W]. The Vessel Budget is now [charge_account.account_balance] cr.")
- qdel(W)
- return TRUE
- else if(istype(W, /obj/item/supplypod_beacon))
- var/obj/item/supplypod_beacon/sb = W
- if (sb.express_console != src)
- sb.link_console(src, user)
- return TRUE
- else
- to_chat(user, "[src] is already linked to [sb].")
- ..()
-
-/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
- meme_pack_data = list() // sorry for what?
- for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs
- var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all
- if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice
- meme_pack_data[P.group] = list( // it gets cheaper when I return it
- "name" = P.group, // mmhm
- "packs" = list() // sometimes, I return it so much, I rip the manifest
- ) // see, my quartermaster taught me a few things too
- if((P.hidden)) // like, how not to rip the manifest
- continue// by using someone else's crate
- meme_pack_data[P.group]["packs"] += list(list(
- "name" = P.name,
- "cost" = P.cost,
- "id" = pack,
- "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
- ))
-
-/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "OutpostCommunications", name)
- ui.open()
- if(!charge_account)
- reconnect()
-
-/obj/machinery/computer/cargo/express/ui_data(mob/user)
- var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
- var/list/data = list()
-
- // not a big fan of get_containing_shuttle
- var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
- var/datum/overmap/ship/controlled/ship
- var/outpost_docked = FALSE
- if(D)
- ship = D.current_ship
- outpost_docked = istype(ship.docked_to, /datum/overmap/outpost)
-
- data["onShip"] = !isnull(ship)
- data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0
- data["maxMissions"] = ship ? ship.max_missions : 0
- data["outpostDocked"] = outpost_docked
- data["points"] = charge_account ? charge_account.account_balance : 0
- data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user)
- data["beaconZone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
- data["usingBeacon"] = use_beacon //is the mode set to deliver to the beacon or the cargobay?
- data["canBeacon"] = !use_beacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
- data["canBuyBeacon"] = charge_account ? (cooldown <= 0 && charge_account.account_balance >= BEACON_COST) : FALSE
- data["beaconError"] = use_beacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
- data["hasBeacon"] = beacon != null//is there a linked beacon?
- data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
- data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
- data["supplies"] = list()
- message = "Sales are near-instantaneous - please choose carefully."
- if(SSshuttle.supplyBlocked)
- message = blockade_warning
- if(use_beacon && !beacon)
- message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
- else if (use_beacon && !canBeacon)
- message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
- data["message"] = message
- if(!meme_pack_data)
- packin_up()
- stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
- data["supplies"] = meme_pack_data
- if (cooldown > 0)//cooldown used for printing beacons
- cooldown--
-
- data["shipMissions"] = list()
- data["outpostMissions"] = list()
-
- if(ship)
- for(var/datum/mission/M as anything in ship.missions)
- data["shipMissions"] += list(M.get_tgui_info())
- if(outpost_docked)
- var/datum/overmap/outpost/out = ship.docked_to
- for(var/datum/mission/M as anything in out.missions)
- data["outpostMissions"] += list(M.get_tgui_info())
-
- return data
-
-/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
- . = ..()
- if(.)
- return
-
- switch(action)
- if("withdrawCash")
- var/val = text2num(params["value"])
- // no giving yourself money
- if(!charge_account || !val || val <= 0)
- return
- if(charge_account.adjust_money(-val))
- var/obj/item/holochip/cash_chip = new /obj/item/holochip(drop_location(), val)
- if(ishuman(usr))
- var/mob/living/carbon/human/user = usr
- user.put_in_hands(cash_chip)
- playsound(src, 'sound/machines/twobeep_high.ogg', 50, TRUE)
- src.visible_message("[src] dispenses a holochip.")
- return TRUE
-
- if("LZCargo")
- use_beacon = FALSE
- if (beacon)
- beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
- if("LZBeacon")
- use_beacon = TRUE
- if (beacon)
- beacon.update_status(SP_READY) //turns on the beacon's ready light
- if("printBeacon")
- if(charge_account?.adjust_money(-BEACON_COST))
- cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
- var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
- C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
- printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
- beacon.name = "Supply Pod Beacon #[printed_beacons]"
-
- if("add")
- var/area/ship/current_area = get_area(src)
- var/datum/supply_pack/pack = SSshuttle.supply_packs[text2path(params["id"])]
- if( \
- !pack || !charge_account?.has_money(pack.cost) || !istype(current_area) || \
- !istype(current_area.mobile_port.current_ship.docked_to, /datum/overmap/outpost) \
- )
- return
-
- var/turf/landing_turf
- if(!isnull(beacon) && use_beacon) // prioritize beacons over landing in cargobay
- landing_turf = get_turf(beacon)
- beacon.update_status(SP_LAUNCH)
- else if(!use_beacon)// find a suitable supplypod landing zone in cargobay
- var/list/empty_turfs = list()
- if(!landingzone)
- reconnect()
- if(!landingzone)
- WARNING("[src] couldnt find a Ship/Cargo (aka cargobay) area on a ship, and as such it has set the supplypod landingzone to the area it resides in.")
- landingzone = get_area(src)
- for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
- if(T.is_blocked_turf())
- continue
- empty_turfs += T
- CHECK_TICK
- landing_turf = pick(empty_turfs)
-
- // note that, because of CHECK_TICK above, we aren't sure if we can
- // afford the pack, even though we checked earlier. luckily adjust_money
- // returns false if the account can't afford the price
- if(landing_turf && charge_account.adjust_money(-pack.cost))
- var/name = "*None Provided*"
- var/rank = "*None Provided*"
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- name = H.get_authentification_name()
- rank = H.get_assignment(hand_first = TRUE)
- else if(issilicon(usr))
- name = usr.real_name
- rank = "Silicon"
- var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "")
- new /obj/effect/pod_landingzone(landing_turf, podType, SO)
- update_appearance() // ??????????????????
- return TRUE
-
- if("mission-act")
- var/datum/mission/mission = locate(params["ref"])
- var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src)
- var/datum/overmap/ship/controlled/ship = D.current_ship
- var/datum/overmap/outpost/outpost = ship.docked_to
- if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery
- return
- if(!mission.accepted)
- if(LAZYLEN(ship.missions) >= ship.max_missions)
- return
- mission.accept(ship, loc)
- return TRUE
- else if(mission.servant == ship)
- if(mission.can_complete())
- mission.turn_in()
- else
- mission.give_up()
- return TRUE
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index a04d62059792..d790cbbdf650 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -81,7 +81,7 @@
*/
/datum/supply_pack/ammo/winchester_ammo
- name = "Flaming Arrow and Detective Special .38 Ammo Boxes"
+ name = ".38 Ammo Boxes Crate"
desc = "Contains two 50 round ammo boxes for refilling .38 weapons."
cost = 250
contains = list(/obj/item/ammo_box/c38_box,
@@ -134,7 +134,7 @@
/datum/supply_pack/ammo/gal308_ammo
name = "CM-GAL .308 Magazine Crate"
desc = "Contains a .308 CM-GAL magazine for the CM-GAL rifle, containing ten rounds."
- contains = list(/obj/item/ammo_box/magazine/gal)
+ contains = list(/obj/item/ammo_box/magazine/f4_308)
cost = 1000
/datum/supply_pack/ammo/gar_ammo
@@ -149,12 +149,6 @@
contains = list(/obj/item/ammo_box/amagpellet_claris)
cost = 1000
-/datum/supply_pack/ammo/a300
- name = ".300 Magnum Stripper Clip Crate"
- desc = "Contains a five round .300 Magnum stripper clip for sniper rifles such as the HP Scout."
- contains = list(/obj/item/ammo_box/a300)
- cost = 750
-
/datum/supply_pack/ammo/ebr_ammo
name = "M514 EBR .308 Magazine Crate"
desc = "Contains a .308 magazine for the M514 EBR rifle, containing ten rounds."
@@ -173,18 +167,18 @@
contains = list(/obj/item/ammo_box/magazine/p16)
cost = 1000
-/datum/supply_pack/ammo/a850r_ammo
- name = "8x50mmR En Bloc Clip Crate"
- desc = "Contains a 8x50mmR en bloc clip for rifles like the illestren rifle, containing five rounds."
- contains = list(/obj/item/ammo_box/magazine/illestren_a850r)
- cost = 250
-
/datum/supply_pack/ammo/a762_ammo_box
name = "7.62x40mm CLIP Ammo Box Crate"
- desc = "Contains a eighty-round 7.62x40mm CLIP box for the SKM rifles."
+ desc = "Contains a one hundred and twenty-round 7.62x40mm CLIP box for the SKM rifles."
contains = list(/obj/item/ammo_box/a762_40)
cost = 500
+/datum/supply_pack/ammo/a556_ammo_box
+ name = "5.56x39mm CLIP Ammo Box Crate"
+ desc = "Contains a one hundred and twenty-round 5.56x39mm CLIP box for most newer rifles."
+ contains = list(/obj/item/ammo_box/a556_39)
+ cost = 450
+
/datum/supply_pack/ammo/a357_ammo_box
name = ".357 Ammo Box Crate"
desc = "Contains a fifty-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand."
diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm
index fa63529b7955..ed06391dfe98 100644
--- a/code/modules/cargo/packs/costumes_toys.dm
+++ b/code/modules/cargo/packs/costumes_toys.dm
@@ -118,13 +118,13 @@
new /obj/item/kitchen/knife/switchblade(C)
/datum/supply_pack/costumes_toys/mech_suits
- name = "Mech Pilot's Suit Crate"
+ name = "Exosuit Pilot's Suit Crate"
desc = "Suits for piloting big robots. Contains all three colors!"
cost = 1500 //state-of-the-art technology doesn't come cheap
contains = list(/obj/item/clothing/under/costume/mech_suit,
/obj/item/clothing/under/costume/mech_suit/white,
/obj/item/clothing/under/costume/mech_suit/blue)
- crate_name = "mech pilot's suit crate"
+ crate_name = "exosuit pilot's suit crate"
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/costumes_toys/wizard
diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm
index 3627633bcb77..3759dc6d8d11 100644
--- a/code/modules/cargo/packs/emergency.dm
+++ b/code/modules/cargo/packs/emergency.dm
@@ -8,25 +8,25 @@
/datum/supply_pack/emergency/internals
name = "Internals Crate"
- desc = "Two gas masks, two breathing masks, and four empty oxygen tanks of varying size. Oxygen canister sold separately."
- cost = 500
- contains = list(/obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
+ desc = "Contains four breathing masks, three advanced emergency oxygen tanks and one large oxygen tank. Oxygen canister sold separately."
+ cost = 100
+ contains = list(/obj/item/clothing/mask/breath,
+ /obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,
- /obj/item/tank/internals/emergency_oxygen/empty,
- /obj/item/tank/internals/emergency_oxygen/empty,
- /obj/item/tank/internals/oxygen/empty,
- /obj/item/tank/internals/oxygen/empty)
+ /obj/item/tank/internals/emergency_oxygen/engi,
+ /obj/item/tank/internals/emergency_oxygen/engi,
+ /obj/item/tank/internals/emergency_oxygen/engi,
+ /obj/item/tank/internals/oxygen)
crate_name = "internals crate"
/datum/supply_pack/emergency/plasmaman_tank
- name = "Plasmaman Tank Kit"
- desc = "Contains two empty plasmaman belt tanks, for when you just can't bear to refill a normal tank with plasma. Plasma canisters sold separately. Warranty void if filled with flammable gas."
- cost = 500
- contains = list(/obj/item/tank/internals/plasmaman/belt/empty,
- /obj/item/tank/internals/plasmaman/belt/empty)
- crate_name = "plasmaman tank kit"
+ name = "Plasmaman Internals Crate"
+ desc = "Contains two plasmaman belt tanks, for when you just can't bear to refill a normal tank with plasma. Plasma canisters sold separately."
+ cost = 100
+ contains = list(/obj/item/tank/internals/plasmaman/belt,
+ /obj/item/tank/internals/plasmaman/belt)
+ crate_name = "plasmaman internals crate"
/datum/supply_pack/emergency/plasmaman_suit
name = "Plasmaman Suit Kit"
diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm
index c7d8b77f46a5..6bf438f22867 100644
--- a/code/modules/cargo/packs/food.dm
+++ b/code/modules/cargo/packs/food.dm
@@ -8,7 +8,7 @@
/datum/supply_pack/food/donkpockets
name = "Donk Pocket Variety Crate"
desc = "Featuring a line up of Donk Co.'s most popular pastry!"
- cost = 2000
+ cost = 500
contains = list(/obj/item/storage/box/donkpockets/donkpocketspicy,
/obj/item/storage/box/donkpockets/donkpocketteriyaki,
/obj/item/storage/box/donkpockets/donkpocketpizza,
@@ -25,7 +25,7 @@
/datum/supply_pack/food/pizza
name = "Pizza Crate"
desc = "Best prices on this side of the galaxy. All deliveries are guaranteed to be 99.5% anomaly-free!"
- cost = 3000// Best prices this side of the galaxy.
+ cost = 750// Best prices this side of the galaxy.
contains = list(/obj/item/pizzabox/margherita,
/obj/item/pizzabox/mushroom,
/obj/item/pizzabox/meat,
@@ -42,6 +42,19 @@
fourfiveeight.boxtag = P.boxtag
qdel(P)
+/datum/supply_pack/food/ration
+ name = "Ration Crate"
+ desc = "6 standerd issue rations."
+ cost = 500
+ contains = list(/obj/effect/spawner/lootdrop/ration,
+ /obj/effect/spawner/lootdrop/ration,
+ /obj/effect/spawner/lootdrop/ration,
+ /obj/effect/spawner/lootdrop/ration,
+ /obj/effect/spawner/lootdrop/ration,
+ /obj/effect/spawner/lootdrop/ration)
+ crate_name = "ration crate"
+ crate_type = /obj/structure/closet/crate
+
/*
Ingredients
*/
@@ -49,7 +62,7 @@
/datum/supply_pack/food/ingredients_basic
name = "Basic Ingredients Crate"
desc = "Get things cooking with this crate full of useful ingredients! Contains a dozen eggs, two slabs of meat, some flour, some rice, a bottle of milk, a bottle of soymilk, and a bag of sugar."
- cost = 1000
+ cost = 300
contains = list(/obj/item/reagent_containers/food/condiment/flour,
/obj/item/reagent_containers/food/condiment/flour,
/obj/item/reagent_containers/food/condiment/rice,
@@ -63,16 +76,17 @@
crate_name = "food crate"
crate_type = /obj/structure/closet/crate/freezer
-/datum/supply_pack/food/ingredients_specialized
- name = "Advanced Cooking Crate"
- desc = "For the discerning chef. Contains a bottle of enzyme, a salt shaker, a pepper mill, a bottle of ketchup, a bottle of hot sauce, and a bottle of cream."
- cost = 2000
+/datum/supply_pack/food/ingredients_condiments
+ name = "Condiments Crate"
+ desc = "A variety of garnishes for topping off your dish with a little extra pizzaz. Contains a bottle of enzyme, a salt shaker, a pepper mill, a bottle of ketchup, a bottle of hot sauce, a bottle of BBQ sauce, and a bottle of cream."
+ cost = 250
contains = list(/obj/item/reagent_containers/food/condiment/enzyme,
/obj/item/reagent_containers/food/condiment/saltshaker,
/obj/item/reagent_containers/food/condiment/peppermill,
/obj/item/reagent_containers/food/condiment/ketchup,
/obj/item/reagent_containers/food/condiment/hotsauce,
- /obj/item/reagent_containers/food/drinks/bottle/cream
+ /obj/item/reagent_containers/food/drinks/bottle/cream,
+ /obj/item/reagent_containers/food/condiment/bbqsauce
)
crate_name = "condiments crate"
crate_type = /obj/structure/closet/crate/freezer
@@ -80,7 +94,7 @@
/datum/supply_pack/food/ingredients_randomized
name = "Exotic Meat Crate"
desc = "The best cuts in the whole galaxy. Probably."
- cost = 1000
+ cost = 500
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime,
/obj/item/reagent_containers/food/snacks/meat/slab/killertomato,
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
@@ -103,7 +117,7 @@
/datum/supply_pack/food/ingredients_randomized/meat
name = "Standard Meat Crate"
desc = "Less interesting cuts of meat, but filling nonetheless."
- cost = 1500
+ cost = 300
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab,
/obj/item/reagent_containers/food/snacks/meat/slab/chicken,
/obj/item/reagent_containers/food/snacks/meat/slab/synthmeat,
@@ -116,7 +130,7 @@
/datum/supply_pack/food/ingredients_randomized/vegetables
name = "Vegetables Crate"
desc = "Grown in vats."
- cost = 1300
+ cost = 250
contains = list(/obj/item/reagent_containers/food/snacks/grown/chili,
/obj/item/reagent_containers/food/snacks/grown/corn,
/obj/item/reagent_containers/food/snacks/grown/tomato,
@@ -132,7 +146,7 @@
/datum/supply_pack/food/ingredients_randomized/fruits
name = "Fruit Crate"
desc = "Rich of vitamins, may contain oranges."
- cost = 1500
+ cost = 250
contains = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
@@ -147,7 +161,7 @@
/datum/supply_pack/food/ingredients_randomized/grains
name = "Grains Crate"
desc = "A crate full of various grains. How interesting."
- cost = 1000
+ cost = 250
contains = list(/obj/item/reagent_containers/food/snacks/grown/wheat,
/obj/item/reagent_containers/food/snacks/grown/wheat,
/obj/item/reagent_containers/food/snacks/grown/wheat, //Weighted to be more common
@@ -162,11 +176,11 @@
/datum/supply_pack/food/ingredients_randomized/bread
name = "Bread Crate"
desc = "A crate full of various breads. Bready to either be eaten or made into delicious meals."
- cost = 1000
- contains = list(/obj/item/reagent_containers/food/snacks/store/bread/plain,
- /obj/item/reagent_containers/food/snacks/breadslice/plain,
- /obj/item/reagent_containers/food/snacks/breadslice/plain,
- /obj/item/reagent_containers/food/snacks/breadslice/plain, //Weighted to be more common
+ cost = 300
+ contains = list(/obj/item/food/bread/plain,
+ /obj/item/food/breadslice/plain,
+ /obj/item/food/breadslice/plain,
+ /obj/item/food/breadslice/plain, //Weighted to be more common
/obj/item/reagent_containers/food/snacks/bun,
/obj/item/reagent_containers/food/snacks/tortilla,
/obj/item/reagent_containers/food/snacks/pizzabread
@@ -181,17 +195,16 @@
/datum/supply_pack/food/grill
name = "Grilling Starter Kit"
desc = "Sometimes the stresses of the world are too much to bear. Some times, for God's sake, you just want to grill. This crate is for those times."
- cost = 5000
+ cost = 1000
contains = list(/obj/item/stack/sheet/mineral/coal/five,
- /obj/machinery/grill/unwrenched,
- /obj/item/reagent_containers/food/drinks/soda_cans/xeno_energy)
+ /obj/machinery/grill/unwrenched)
crate_name = "grilling starter kit crate"
crate_type = /obj/structure/closet/crate/large
/datum/supply_pack/food/grillfuel
name = "Grilling Fuel Kit"
desc = "Contains propane and propane accessories. (Note: doesn't contain any actual propane.)"
- cost = 2000
+ cost = 250
contains = list(/obj/item/stack/sheet/mineral/coal/ten)
crate_name = "grilling fuel kit crate"
@@ -202,7 +215,7 @@
/datum/supply_pack/food/hydrotank
name = "Hydroponics Backpack Crate"
desc = "Bring on the flood with this high-capacity backpack crate. Contains 500 units of life-giving H2O."
- cost = 1000
+ cost = 750
contains = list(/obj/item/watertank)
crate_name = "hydroponics backpack crate"
crate_type = /obj/structure/closet/crate/hydroponics
@@ -210,7 +223,7 @@
/datum/supply_pack/food/gardening
name = "Gardening Crate"
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, as well as a pair of leather gloves and a botanist's apron."
- cost = 1500
+ cost = 500
contains = list(/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/glass/bottle/ammonia,
@@ -227,7 +240,7 @@
/datum/supply_pack/food/weedcontrol
name = "Weed Control Crate"
desc = "Contains a scythe, gasmask, and two anti-weed defoliant grenades, for when your garden grows out of control."
- cost = 1500
+ cost = 750
contains = list(/obj/item/scythe,
/obj/item/clothing/mask/gas,
/obj/item/grenade/chem_grenade/antiweed,
@@ -238,7 +251,7 @@
/datum/supply_pack/food/seeds
name = "Seeds Crate"
desc = "Big things have small beginnings. Contains fourteen different seeds."
- cost = 2000
+ cost = 750
contains = list(/obj/item/seeds/chili,
/obj/item/seeds/cotton,
/obj/item/seeds/berry,
@@ -259,7 +272,7 @@
/datum/supply_pack/food/exoticseeds
name = "Exotic Seeds Crate"
desc = "Any entrepreneuring botanist's dream. Contains eleven different seeds, including two mystery seeds!"
- cost = 3000
+ cost = 1000
contains = list(/obj/item/seeds/nettle,
/obj/item/seeds/plump,
/obj/item/seeds/liberty,
@@ -281,7 +294,7 @@
/datum/supply_pack/food/beekeeping_suits
name = "Beekeeper Suit Crate"
desc = "Bee business booming? Better be benevolent and boost botany by bestowing bi-Beekeeper-suits! Contains two beekeeper suits and matching headwear."
- cost = 2000
+ cost = 1000
contains = list(/obj/item/clothing/head/beekeeper_head,
/obj/item/clothing/suit/beekeeper_suit,
/obj/item/clothing/head/beekeeper_head,
@@ -292,7 +305,7 @@
/datum/supply_pack/food/beekeeping_fullkit
name = "Beekeeping Starter Crate"
desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
- cost = 3000
+ cost = 2000
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
@@ -304,16 +317,5 @@
crate_name = "beekeeping starter crate"
crate_type = /obj/structure/closet/crate/hydroponics
-/datum/supply_pack/food/ration
- name = "Ration Crate"
- desc = "6 standerd issue rations."
- cost = 2000
- contains = list(/obj/effect/spawner/lootdrop/ration,
- /obj/effect/spawner/lootdrop/ration,
- /obj/effect/spawner/lootdrop/ration,
- /obj/effect/spawner/lootdrop/ration,
- /obj/effect/spawner/lootdrop/ration,
- /obj/effect/spawner/lootdrop/ration)
- crate_name = "ration crate"
- crate_type = /obj/structure/closet/crate
+
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index 7ac296f09398..8a9bd51ccbc5 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -149,7 +149,7 @@
crate_name = "rifle crate"
/datum/supply_pack/gun/beacon
- name = "Contender Break Action Rifle Crate"
+ name = "Beacon Break Action Rifle Crate"
desc = "Contains a single shot break action rifle to hunt wildlife that annoys you in particular. Chambered in devastating .45-70 rounds. Warranty voided if sawed off."
cost = 2250
contains = list(/obj/item/storage/guncase/beacon)
diff --git a/code/modules/cargo/packs/mechs.dm b/code/modules/cargo/packs/mechs.dm
index 937126a86361..fd978f99749e 100644
--- a/code/modules/cargo/packs/mechs.dm
+++ b/code/modules/cargo/packs/mechs.dm
@@ -1,5 +1,5 @@
/datum/supply_pack/mech
- group = "Mech and Exosuit Construction"
+ group = "Exosuit Construction"
crate_type = /obj/structure/closet/crate/large
@@ -97,12 +97,12 @@ Mech Equipment
*/
/datum/supply_pack/mech/equipment
- name = "Mech equipment crate"
+ name = "Exosuit equipment crate"
crate_type = /obj/structure/closet/crate/secure/gear
- crate_name = "mech equipment"
+ crate_name = "exosuit equipment"
/datum/supply_pack/mech/equipment/drill
- name = "Mech drill kit"
+ name = "Exosuit drill kit"
desc = "Contains one mechanized drill for heavy duty digging."
cost = 500
contains = list(
@@ -110,7 +110,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/diamond_drill
- name = "Mech diamond drill kit"
+ name = "Exosuit diamond drill kit"
desc = "Contains mechanized diamond drill, for the enterprising prospector!"
cost = 750
contains = list(
@@ -118,31 +118,31 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/scanner
- name = "Mech scanner kit"
- desc = "An electronic mining scanner, graded to interface with a mech."
+ name = "Exosuit scanner kit"
+ desc = "An electronic mining scanner, graded to interface with an exosuit."
cost = 350
contains = list(
/obj/item/mecha_parts/mecha_equipment/mining_scanner
)
/datum/supply_pack/mech/equipment/plasma_gen
- name = "Mech generator kit"
- desc = "A plasma-fueled generator for a mech, ideal for long operations."
+ name = "Exosuit generator kit"
+ desc = "A plasma-fueled generator for an exosuit, ideal for long operations."
cost = 1000
contains = list(
/obj/item/mecha_parts/mecha_equipment/generator
)
/datum/supply_pack/mech/equipment/nuclear_gen
- name = "Mech nuclear generator kit"
- desc = "Contains a uranium-fueled generator for a mech, ideal for polluting the environment."
+ name = "Exosuit nuclear generator kit"
+ desc = "Contains a uranium-fueled generator for an exosuit, ideal for polluting the environment."
cost = 1250
contains = list(
/obj/item/mecha_parts/mecha_equipment/generator/nuclear
)
/datum/supply_pack/mech/equipment/tesla_energy_relay
- name = "Mech tesla relay kit"
+ name = "Exosuit tesla relay kit"
desc = "Contains an advanced exosuit module which draws power from nearby APCs."
cost = 1750
contains = list(
@@ -150,7 +150,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/clamp
- name = "Mech clamp kit"
+ name = "Exosuit clamp kit"
desc = "Contains a clamp designed for mechanized freight hauling."
cost = 350
contains = list(
@@ -158,7 +158,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/extinguisher
- name = "Mech extinguisher kit"
+ name = "Exosuit extinguisher kit"
desc = "Contains a heavy duty fire extinguisher, for heavy duty firefighting."
cost = 250
contains = list(
@@ -166,7 +166,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/cable_layer
- name = "Mech RCL Kit"
+ name = "Exosuit RCL Kit"
desc = "Contains a \"rapid cable layer\" for laying down long lengths of wire."
cost = 250
contains = list(
@@ -174,7 +174,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/mech_sleeper
- name = "Mech Mounted Sleeper Kit"
+ name = "Exosuit Mounted Sleeper Kit"
desc = "Contains a mounted sleeper device, used for retrieving and stabilizing patients."
cost = 1000
contains = list(
@@ -182,14 +182,14 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/beam_gun
- name = "Mech Beam Gun Kit"
+ name = "Exosuit Beam Gun Kit"
desc = "Contains an advanced mounted medical beamgun, capable of alleviating wounds to targets."
cost = 7000
contains = list(
/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam
)
/datum/supply_pack/mech/equipment/rcs
- name = "Mech RCS kit"
+ name = "Exosuit RCS kit"
desc = "A gas fueled RCS pack, ideal for mechanized space operation."
cost = 800
contains = list(
@@ -205,7 +205,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/melee_armor_booster
- name = "Mech CCW armor kit"
+ name = "Exosuit CCW armor kit"
desc = "A \"close combat weaponry\" module designed to deflect melee attacks."
cost = 750
contains = list(
@@ -213,7 +213,7 @@ Mech Equipment
)
/datum/supply_pack/mech/equipment/projectile_armor_booster
- name = "Mech projectile armor kit"
+ name = "Exosuit projectile armor kit"
desc = "A protective exosuit module designed to deflect ranged attacks."
cost = 1000
contains = list(
@@ -225,13 +225,13 @@ weapons
*/
/datum/supply_pack/mech/weapon
- name = "Mech weapons crate"
+ name = "Exosuit weapons crate"
crate_type = /obj/structure/closet/crate/secure/weapon
- crate_name = "mech weapon crate"
+ crate_name = "exosuit weapon crate"
/datum/supply_pack/mech/weapon/pka
- name = "Mech Mounted Proto-Kinetic Accelerator kit"
- desc = "A ranged mining attachment for any mech."
+ name = "Exosuit-Mounted Proto-Kinetic Accelerator kit"
+ desc = "A ranged mining attachment for any exosuit."
cost = 750
contains = list(
/obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun
@@ -290,9 +290,9 @@ ammo
*/
/datum/supply_pack/mech/ammo
- name = "Mech ammo crate"
+ name = "Exosuit ammo crate"
crate_type = /obj/structure/closet/crate/secure/gear
- crate_name = "mech ammo crate"
+ crate_name = "exosuit ammo crate"
/datum/supply_pack/mech/ammo/scattershot_ammo
name = "LBX AC 10 ammo box"
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 08b576937138..e0c76180bade 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -9,42 +9,42 @@
/datum/supply_pack/medical/firstaid_single
name = "First Aid Kit Single-Pack"
desc = "Contains one first aid kit for healing most types of wounds."
- cost = 750
+ cost = 400
small_item = TRUE
contains = list(/obj/item/storage/firstaid/regular)
/datum/supply_pack/medical/firstaidbruises_single
name = "Bruise Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing bruises and broken bones."
- cost = 1250
+ cost = 700
small_item = TRUE
contains = list(/obj/item/storage/firstaid/brute)
/datum/supply_pack/medical/firstaidburns_single
name = "Burn Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing severe burns."
- cost = 1250
+ cost = 700
small_item = TRUE
contains = list(/obj/item/storage/firstaid/fire)
/datum/supply_pack/medical/firstaidoxygen_single
name = "Oxygen Deprivation Kit Single-Pack"
desc = "Contains one first aid kit focused on helping oxygen deprivation victims."
- cost = 1250
+ cost = 500
small_item = TRUE
contains = list(/obj/item/storage/firstaid/o2)
/datum/supply_pack/medical/firstaidtoxins_single
name = "Toxin Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on healing damage dealt by heavy toxins."
- cost = 1250
+ cost = 500
small_item = TRUE
contains = list(/obj/item/storage/firstaid/toxin)
/datum/supply_pack/medical/firstaid_rad_single
name = "Radiation Treatment Kit Single-Pack"
desc = "Contains one first aid kit focused on reducing the damage done by radiation."
- cost = 1000
+ cost = 500
small_item = TRUE
contains = list(/obj/item/storage/firstaid/radiation)
@@ -75,6 +75,15 @@
/obj/item/roller)
crate_name = "surgical supplies crate"
+
+/datum/supply_pack/medical/anesthetic
+ name = "Anesthetics Crate"
+ desc = "Contains a standard anesthetics tank, for standard surgical procedures."
+ cost = 500
+ contains = list(/obj/item/clothing/mask/breath/medical,
+ /obj/item/tank/internals/anesthetic)
+ crate_name = "anesthetics crate"
+
/*
Bundles and supplies
*/
diff --git a/code/modules/cargo/packs/sec_supply.dm b/code/modules/cargo/packs/sec_supply.dm
index 8ff09a5dc38a..d2039b009c5c 100644
--- a/code/modules/cargo/packs/sec_supply.dm
+++ b/code/modules/cargo/packs/sec_supply.dm
@@ -30,6 +30,13 @@
cost = 2000
crate_name = "security barriers crate"
+/datum/supply_pack/sec_supply/empty_sandbags
+ name = "Empty Sandbags"
+ desc = "Contains one box of seven empty sandbags for deployable cover in the field. Sand not included."
+ contains = list(/obj/item/storage/box/emptysandbags)
+ cost = 150
+ crate_name = "sandbag crate"
+
/datum/supply_pack/sec_supply/wall_flash
name = "Wall-Mounted Flash Crate"
desc = "Contains four wall-mounted flashes."
diff --git a/code/modules/cargo/packs/spacesuit_armor.dm b/code/modules/cargo/packs/spacesuit_armor.dm
index 8346ea00b06e..3ed4a64cab91 100644
--- a/code/modules/cargo/packs/spacesuit_armor.dm
+++ b/code/modules/cargo/packs/spacesuit_armor.dm
@@ -16,7 +16,7 @@
/datum/supply_pack/spacesuit_armor/pilot_spacesuit
name = "Pilot Space Suit Crate"
- desc = "One pilot space suit, for improved mobility in mechs."
+ desc = "One pilot space suit, for improved mobility in exosuits."
cost = 750
contains = list(/obj/item/clothing/suit/space/pilot,
/obj/item/clothing/head/helmet/space/pilot/random)
diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm
index 11fd10229e5e..b9c41a29e11f 100644
--- a/code/modules/cargo/supplypod_beacon.dm
+++ b/code/modules/cargo/supplypod_beacon.dm
@@ -7,7 +7,7 @@
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
- var/obj/machinery/computer/cargo/express/express_console
+ var/obj/machinery/computer/cargo/cargo_console
var/linked = FALSE
var/ready = FALSE
var/launched = FALSE
@@ -49,39 +49,39 @@
/obj/item/supplypod_beacon/examine(user)
. = ..()
- if(!express_console)
+ if(!cargo_console)
. += "[src] is not currently linked to an Express Supply console."
else
. += "Alt-click to unlink it from the Express Supply console."
/obj/item/supplypod_beacon/Destroy()
- if(express_console)
- express_console.beacon = null
+ if(cargo_console)
+ cargo_console.beacon = null
return ..()
/obj/item/supplypod_beacon/proc/unlink_console()
- if(express_console)
- express_console.beacon = null
- express_console = null
+ if(cargo_console)
+ cargo_console.beacon = null
+ cargo_console = null
update_status(SP_UNLINK)
update_status(SP_UNREADY)
-/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
+/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/C, mob/living/user)
if (C.beacon)//if new console has a beacon, then...
C.beacon.unlink_console()//unlink the old beacon from new console
- if (express_console)//if this beacon has an express console
- express_console.beacon = null//remove the connection the expressconsole has from beacons
- express_console = C//set the linked console var to the console
- express_console.beacon = src//out with the old in with the news
+ if (cargo_console)//if this beacon has an express console
+ cargo_console.beacon = null//remove the connection the expressconsole has from beacons
+ cargo_console = C//set the linked console var to the console
+ cargo_console.beacon = src//out with the old in with the news
update_status(SP_LINKED)
- if (express_console.use_beacon)
+ if (cargo_console.use_beacon)
update_status(SP_READY)
to_chat(user, "[src] linked to [C].")
/obj/item/supplypod_beacon/AltClick(mob/user)
if (!user.canUseTopic(src, !issilicon(user)))
return
- if (express_console)
+ if (cargo_console)
unlink_console()
else
to_chat(user, "There is no linked console.")
diff --git a/code/modules/client/loadout/loadout_accessories.dm b/code/modules/client/loadout/loadout_accessories.dm
index 70225b60cc2e..a8acc1544654 100644
--- a/code/modules/client/loadout/loadout_accessories.dm
+++ b/code/modules/client/loadout/loadout_accessories.dm
@@ -50,7 +50,39 @@
display_name = "tie, recolorable"
path = /obj/item/clothing/neck/tie
+//Gloves
+
+/datum/gear/accessory/gloves
+ subtype_path = /datum/gear/accessory/gloves
+ slot = ITEM_SLOT_GLOVES
+
+/datum/gear/accessory/gloves/black
+ display_name = "gloves, black"
+ description = "Standard hand coverings for everyday use."
+ path = /obj/item/clothing/gloves/color/black
+
+/datum/gear/accessory/gloves/white
+ display_name = "gloves, white"
+ description = "Standard hand coverings for everyday use."
+ path = /obj/item/clothing/gloves/color/white
+
+/datum/gear/accessory/gloves/brown
+ display_name = "gloves, brown"
+ description = "Standard hand coverings for everyday use."
+ path = /obj/item/clothing/gloves/color/brown
+
+/datum/gear/accessory/gloves/fingerless
+ display_name = "gloves, fingerless"
+ description = "Radical hand coverings for everyday use."
+ path = /obj/item/clothing/gloves/fingerless
+
+/datum/gear/accessory/gloves/evening
+ display_name = "gloves, evening"
+ description = "Excessively fancy elbow-length gloves."
+ path = /obj/item/clothing/gloves/color/evening
+
//Bone
+
/datum/gear/accessory/fangnecklace
display_name = "wolf fang necklace"
path = /obj/item/clothing/neck/fangnecklace
@@ -60,6 +92,36 @@
path = /obj/item/clothing/accessory/bonearmlet
slot = null
+//Masks
+
+/datum/gear/accessory/mask
+ subtype_path = /datum/gear/accessory/mask
+ slot = ITEM_SLOT_MASK
+
+/datum/gear/accessory/mask/bandana/red
+ display_name = "bandana, red"
+ path = /obj/item/clothing/mask/bandana/red
+
+/datum/gear/accessory/mask/bandana/skull
+ display_name = "bandana, skull"
+ path = /obj/item/clothing/mask/bandana/skull
+
+/datum/gear/accessory/mask/bandana/black
+ display_name = "bandana, black"
+ path = /obj/item/clothing/mask/bandana/black
+
+/datum/gear/accessory/mask/bandana/blue
+ display_name = "bandana, blue"
+ path = /obj/item/clothing/mask/bandana/blue
+
+/datum/gear/accessory/mask/surgical
+ display_name = "surgical mask"
+ path = /obj/item/clothing/mask/surgical
+
+/datum/gear/accessory/mask/balaclava
+ display_name = "balaclava"
+ path = /obj/item/clothing/mask/balaclava
+
//Misc
/datum/gear/accessory/waistcoat
@@ -72,39 +134,11 @@
path = /obj/item/clothing/neck/stethoscope
allowed_roles = list("Medical Doctor", "Chief Medical Officer")
-/datum/gear/accessory/collar
- display_name = "pet collar"
- description = "Only the truly insane would wear this around their neck."
- path = /obj/item/clothing/neck/petcollar
-
-/datum/gear/accessory/gloves/black
- display_name = "black gloves"
- description = "Standard hand coverings for everyday use."
- path = /obj/item/clothing/gloves/color/black
-
-/datum/gear/accessory/gloves/white
- display_name = "white gloves"
- description = "Standard hand coverings for everyday use."
- path = /obj/item/clothing/gloves/color/white
+/datum/gear/accessory/headphones
+ display_name = "headphones"
+ slot = ITEM_SLOT_EARS
+ path = /obj/item/instrument/piano_synth/headphones
-/datum/gear/accessory/gloves/fingerless
- display_name = "fingerless gloves"
- description = "Radical hand coverings for everyday use."
- path = /obj/item/clothing/gloves/fingerless
-
-/datum/gear/accessory/gloves/evening
- display_name = "evening gloves"
- description = "Excessively fancy elbow-length gloves."
- path = /obj/item/clothing/gloves/color/evening
- slot = ITEM_SLOT_GLOVES
-
-/datum/gear/accessory/tiki
- display_name = "tiki mask"
- description = "A wooden mask, simple, really."
- path = /obj/item/clothing/mask/gas/tiki_mask
- slot = ITEM_SLOT_MASK
-
-/datum/gear/accessory/joymask
- display_name = "face with tears of joy mask"
- path = /obj/item/clothing/mask/joy
- slot = ITEM_SLOT_MASK
+/datum/gear/accessory/pocketprotector
+ display_name = "pocket protector"
+ path = /obj/item/clothing/accessory/pocketprotector
diff --git a/code/modules/client/loadout/loadout_eyewear.dm b/code/modules/client/loadout/loadout_eyewear.dm
index 99e868ad0854..3ea37d68fed8 100644
--- a/code/modules/client/loadout/loadout_eyewear.dm
+++ b/code/modules/client/loadout/loadout_eyewear.dm
@@ -46,7 +46,10 @@
description = "A blindfold you can still see through."
path = /obj/item/clothing/glasses/trickblindfold
-
+/datum/gear/eyewear/doubleeyepatch
+ display_name = "double eyepatch"
+ description = "Two eyepatches at once! Effectively a blindfold, though."
+ path = /obj/item/clothing/glasses/blindfold/eyepatch
/datum/gear/eyewear/glasses/cold
display_name = "cold goggles"
diff --git a/code/modules/client/loadout/loadout_footwear.dm b/code/modules/client/loadout/loadout_footwear.dm
index dd4632f9bc34..3e65cd9ed5d3 100644
--- a/code/modules/client/loadout/loadout_footwear.dm
+++ b/code/modules/client/loadout/loadout_footwear.dm
@@ -64,3 +64,17 @@
/datum/gear/footwear/color/white
display_name = "white shoes"
path = /obj/item/clothing/shoes/sneakers/white
+
+//Cowboy boots
+
+/datum/gear/footwear/cowboy
+ display_name = "cowboy boots, brown"
+ path = /obj/item/clothing/shoes/cowboy
+
+/datum/gear/footwear/cowboy/black
+ display_name = "cowboy boots, black"
+ path = /obj/item/clothing/shoes/cowboy/black
+
+/datum/gear/footwear/cowboy/white
+ display_name = "cowboy boots, white"
+ path = /obj/item/clothing/shoes/cowboy/white
diff --git a/code/modules/client/loadout/loadout_general.dm b/code/modules/client/loadout/loadout_general.dm
index 6277a8a3a601..712500f9fd62 100644
--- a/code/modules/client/loadout/loadout_general.dm
+++ b/code/modules/client/loadout/loadout_general.dm
@@ -14,10 +14,6 @@
display_name = "lipstick, red"
path = /obj/item/lipstick
-/datum/gear/balaclava
- display_name = "balaclava"
- path = /obj/item/clothing/mask/balaclava
-
/datum/gear/vape
display_name = "vape"
path = /obj/item/clothing/mask/vape
@@ -26,10 +22,6 @@
display_name = "e-cigar"
path = /obj/item/clothing/mask/vape/cigar
-/datum/gear/bandana
- display_name = "bandana, red"
- path = /obj/item/clothing/mask/bandana/red
-
/datum/gear/flask
display_name = "flask"
path = /obj/item/reagent_containers/food/drinks/flask
@@ -58,12 +50,17 @@
display_name = "toy, deck of cards"
path = /obj/item/toy/cards/deck
+/datum/gear/kotahi
+ display_name = "toy, deck of KOTAHI cards"
+ path = /obj/item/toy/cards/deck/kotahi
+
/datum/gear/eightball
display_name = "toy, magic eight ball"
path = /obj/item/toy/eightball
/datum/gear/pai
display_name = "personal AI device"
+ description = "A synthetic friend that fits in your pocket."
path = /obj/item/paicard
/datum/gear/tablet
@@ -86,6 +83,10 @@
display_name = "pen, four-color"
path = /obj/item/pen/fourcolor
+/datum/gear/fountainpen
+ display_name = "pen, fountain"
+ path = /obj/item/pen/fountain
+
/datum/gear/paperbin
display_name = "paper bin"
path = /obj/item/paper_bin
@@ -127,7 +128,6 @@
display_name = "toy, rilena tali plushie"
path = /obj/item/toy/plush/tali
-// Shiptest edit
/datum/gear/amongus
display_name = "toy, suspicious pill plushie"
path = /obj/item/toy/plush/among
@@ -150,8 +150,6 @@
display_name = "table bell, brass"
path = /obj/item/table_bell/brass
-// End Shiptest
-
/datum/gear/flashlight
display_name = "tool, flashlight"
path = /obj/item/flashlight
@@ -160,19 +158,11 @@
display_name = "tool, emergency crowbar"
path = /obj/item/crowbar/red
-/datum/gear/balloon
- display_name = "toy, balloon"
- path = /obj/item/toy/balloon
-
-/datum/gear/balloon/ian
- display_name = "toy, ian balloon"
- path = /obj/item/toy/balloon/corgi
-
-/datum/gear/surgical_mask
- display_name = "surgical mask"
- path = /obj/item/clothing/mask/surgical
-
/datum/gear/rilena_poster
display_name = "poster, rilena"
path = /obj/item/poster/random_rilena
description = "A random poster of the RILENA series."
+
+/datum/gear/camera
+ display_name = "polaroid camera"
+ path = /obj/item/camera
diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm
index 3d2905720f0a..32384a0d59fa 100644
--- a/code/modules/client/loadout/loadout_hat.dm
+++ b/code/modules/client/loadout/loadout_hat.dm
@@ -27,6 +27,10 @@
display_name = "beret, red"
path = /obj/item/clothing/head/beret
+/datum/gear/hat/beret/black
+ display_name = "beret, black"
+ path = /obj/item/clothing/head/beret/black
+
/datum/gear/hat/beret/departmental
display_name = "beret, departmental"
path = /obj/item/clothing/head/beret/grey
@@ -74,28 +78,83 @@
path = /obj/item/clothing/head/beret/eng/hazard
allowed_roles = list("Station Engineer", "Atmospheric Technician", "Chief Engineer")
+//Soft caps
+
+/datum/gear/hat/softcap/red
+ display_name = "cap, red"
+ path = /obj/item/clothing/head/soft/red
+
+/datum/gear/hat/softcap/blue
+ display_name = "cap, blue"
+ path = /obj/item/clothing/head/soft/blue
+
+/datum/gear/hat/softcap/grey
+ display_name = "cap, grey"
+ path = /obj/item/clothing/head/soft/grey
+
+/datum/gear/hat/softcap/white
+ display_name = "cap, white"
+ path = /obj/item/clothing/head/soft/mime
+
+/datum/gear/hat/softcap/black
+ display_name = "cap, black"
+ path = /obj/item/clothing/head/soft/black
+
+//Beanies
+
+/datum/gear/hat/beanie
+ display_name = "beanie, white"
+ path = /obj/item/clothing/head/beanie
+
+/datum/gear/hat/beanie/black
+ display_name = "beanie, black"
+ path = /obj/item/clothing/head/beanie/black
+
+/datum/gear/hat/beanie/red
+ display_name = "beanie, red"
+ path = /obj/item/clothing/head/beanie/red
+
+/datum/gear/hat/beanie/green
+ display_name = "beanie, green"
+ path = /obj/item/clothing/head/beanie/green
+
+/datum/gear/hat/beanie/purple
+ display_name = "beanie, purple"
+ path = /obj/item/clothing/head/beanie/purple
+
+/datum/gear/hat/beanie/blue
+ display_name = "beanie, blue"
+ path = /obj/item/clothing/head/beanie/darkblue
+
+/datum/gear/hat/beanie/orange
+ display_name = "beanie, orange"
+ path = /obj/item/clothing/head/beanie/orange
//Misc
+/datum/gear/hat/bowler
+ display_name = "bowler hat"
+ path = /obj/item/clothing/head/bowler
+
/datum/gear/hat/that
display_name = "top hat"
path = /obj/item/clothing/head/that
/datum/gear/hat/fedora
- display_name = "fedora"
+ display_name = "fedora, black"
path = /obj/item/clothing/head/fedora
+/datum/gear/hat/fedora/white
+ display_name = "fedora, white"
+ path = /obj/item/clothing/head/fedora/white
+
+/datum/gear/hat/fedora/beige
+ display_name = "fedora, beige"
+ path = /obj/item/clothing/head/fedora/beige
+
/datum/gear/hat/flatcap
display_name = "flatcap"
path = /obj/item/clothing/head/flatcap
-/datum/gear/hat/beanie
- display_name = "beanie"
- path = /obj/item/clothing/head/beanie
-
-/datum/gear/hat/tinfoil
- display_name = "tinfoil hat"
- path = /obj/item/clothing/head/foilhat
-
/datum/gear/hat/wig
display_name = "wig"
path = /obj/item/clothing/head/wig
@@ -104,20 +163,6 @@
display_name = "cowboy hat"
path = /obj/item/clothing/head/cowboy
-/datum/gear/hat/catears
- display_name = "cat ears"
- path = /obj/item/clothing/head/kitty
-
-/datum/gear/hat/horse
- display_name = "horse mask"
- path = /obj/item/clothing/mask/horsehead
- slot = ITEM_SLOT_MASK
-
-/datum/gear/hat/piratehat
- display_name = "pirate hat"
- description = "Yarr. Comes with one free pirate speak manual."
- path = /obj/item/clothing/head/pirate
-
/datum/gear/hat/trapper
display_name = "trapper hat"
path = /obj/item/clothing/head/trapper
diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm
index dbed1feb8ee8..217998802d48 100644
--- a/code/modules/client/loadout/loadout_suit.dm
+++ b/code/modules/client/loadout/loadout_suit.dm
@@ -55,8 +55,6 @@
display_name = "suit jacket, charcoal"
path = /obj/item/clothing/suit/toggle/lawyer/charcoal
-/datum/gear/suit/jacket/navy //why is this blank? i dont know
-
/datum/gear/suit/jacket/hoodie_black
display_name = "hoodie, black"
path = /obj/item/clothing/suit/hooded/hoodie/black
@@ -93,6 +91,19 @@
display_name = "hazard jacket"
path = /obj/item/clothing/suit/toggle/hazard
+//Suspenders
+/datum/gear/suit/suspenders/red
+ display_name = "suspenders, red"
+ path = /obj/item/clothing/suit/toggle/suspenders
+
+/datum/gear/suit/suspenders/blue
+ display_name = "suspenders, blue"
+ path = /obj/item/clothing/suit/toggle/suspenders/blue
+
+/datum/gear/suit/suspenders/gray
+ display_name = "suspenders, gray"
+ path = /obj/item/clothing/suit/toggle/suspenders/gray
+
//Misc
/datum/gear/suit/grponcho
display_name = "poncho, green"
@@ -107,7 +118,7 @@
path = /obj/item/clothing/suit/toggle/labcoat
/datum/gear/suit/raincoat
- display_name = "Cybersun labcoat"
+ display_name = "translucent labcoat"
description = "Designer lab safety equipment. You're pretty sure this is just a raincoat."
path = /obj/item/clothing/suit/toggle/labcoat/raincoat
@@ -119,3 +130,11 @@
display_name = "floral shirt"
description = "From grills to guns, this shirt's seen it all."
path = /obj/item/clothing/suit/hawaiian
+
+/datum/gear/suit/hazardvest
+ display_name = "hazard vest"
+ path = /obj/item/clothing/suit/hazardvest
+
+/datum/gear/suit/longcoat
+ display_name = "longcoat"
+ path = /obj/item/clothing/suit/longcoat
diff --git a/code/modules/client/loadout/loadout_uniform.dm b/code/modules/client/loadout/loadout_uniform.dm
index 616c4308b437..96b4088b65bd 100644
--- a/code/modules/client/loadout/loadout_uniform.dm
+++ b/code/modules/client/loadout/loadout_uniform.dm
@@ -160,10 +160,6 @@
display_name = "suit, charcoal"
path = /obj/item/clothing/under/suit/charcoal
-/datum/gear/uniform/suit/galaxy
- display_name = "suit, galaxy"
- path = /obj/item/clothing/under/rank/civilian/lawyer/galaxy
-
/datum/gear/uniform/suit/white_skirt
display_name = "suitskirt, white shirt"
path = /obj/item/clothing/under/suit/black/skirt
@@ -236,8 +232,3 @@
/datum/gear/uniform/dress/rilena
display_name = "red dress, Ri cosplay"
path = /obj/item/clothing/under/dress/rilena
-
-//Premium
-/datum/gear/uniform/tacticool
- display_name = "tacticool turtleneck"
- path = /obj/item/clothing/under/syndicate/tacticool
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 006074e74bcd..317828283dbd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1435,7 +1435,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
balance -= initial(quirk_type.value)
switch(change_type)
if("species")
- if((quirk_name in SSquirks.species_blacklist) && (pref_species.id in SSquirks.species_blacklist[quirk_name]))
+ if((quirk_name in SSquirks.species_blacklist) && (target_species.id in SSquirks.species_blacklist[quirk_name]))
all_quirks_new -= quirk_name
balance += initial(quirk_type.value)
if("mood")
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index ce87ea624d7a..c8a0dbdda278 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -415,26 +415,31 @@
supports_variations = VOX_VARIATION
-/obj/item/storage/belt/military/clip/p16/PopulateContents()
+/obj/item/storage/belt/military/clip/cm82/PopulateContents()
for(var/i in 1 to 4)
new /obj/item/ammo_box/magazine/p16(src)
new /obj/item/grenade/frag(src)
-/obj/item/storage/belt/military/clip/gal/PopulateContents()
+/obj/item/storage/belt/military/clip/f4/PopulateContents()
for(var/i in 1 to 4)
- new /obj/item/ammo_box/magazine/gal(src)
+ new /obj/item/ammo_box/magazine/f4_308(src)
new /obj/item/grenade/frag(src)
/obj/item/storage/belt/military/clip/cm5/PopulateContents()
for(var/i in 1 to 4)
- new /obj/item/ammo_box/magazine/smgm9mm(src)
+ new /obj/item/ammo_box/magazine/cm5_9mm(src)
new /obj/item/grenade/frag(src)
/obj/item/storage/belt/military/clip/cm15/PopulateContents()
for(var/i in 1 to 5)
- new /obj/item/ammo_box/magazine/cm15_mag(src)
+ new /obj/item/ammo_box/magazine/cm15_12g(src)
new /obj/item/grenade/frag(src)
+/obj/item/storage/belt/military/clip/e50/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+
/obj/item/storage/belt/military/clip/e50/PopulateContents()
for(var/i in 1 to 5)
new /obj/item/stock_parts/cell/gun/large(src)
diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm
index 9bac6c40a004..d232f775e607 100644
--- a/code/modules/clothing/factions/frontiersmen.dm
+++ b/code/modules/clothing/factions/frontiersmen.dm
@@ -10,6 +10,7 @@
can_adjust = FALSE
icon = 'icons/obj/clothing/faction/frontiersmen/uniforms.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/uniforms.dmi'
+ supports_variations = VOX_VARIATION
/obj/item/clothing/under/frontiersmen/deckhand
name = "\improper deckhand jumpsuit"
@@ -58,6 +59,7 @@
icon = 'icons/obj/clothing/faction/frontiersmen/suits.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/suits.dmi'
blood_overlay_type = "armor"
+ supports_variations = VOX_VARIATION
/obj/item/clothing/suit/armor/vest/marine/frontier
name = "light tactical armor vest"
@@ -162,17 +164,20 @@
name = "\improper frontiersmen commander's cap"
desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
icon_state = "frontier_cap"
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/frontier/admiral
name = "\improper frontiersmen admiral's cap"
desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
icon_state = "frontier_admiral_cap"
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/helmet/bulletproof/x11/frontier
name = "\improper frontiersmen X-11 helmet"
desc = "A heavily modified X-11 pattern helmet used by the Frontiersmen pirate fleet."
icon_state = "x11helm_frontier"
unique_reskin = null
+ supports_variations = VOX_VARIATION
/obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof
name = "\improper fireproof frontiersmen X-11 helmet"
@@ -249,9 +254,14 @@
new /obj/item/ammo_box/magazine/skm_762_40(src)
new /obj/item/grenade/frag(src)
-/obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo/PopulateContents() //replace with spitter. remind me.
+/obj/item/storage/belt/security/military/frontiersmen/mauler_mp_ammo/PopulateContents()
for(var/i in 1 to 4)
- new /obj/item/ammo_box/magazine/pistolm9mm(src)
+ new /obj/item/ammo_box/magazine/m9mm_mauler(src)
+ new /obj/item/grenade/frag(src)
+
+/obj/item/storage/belt/security/military/frontiersmen/spitter_ammo/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/ammo_box/magazine/spitter_9mm(src)
new /obj/item/grenade/frag(src)
/obj/item/storage/belt/security/military/frontiersmen/flamer/PopulateContents()
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index 96c6eee3c734..eabc0fe752c4 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -36,10 +36,12 @@
item_state = "bluecloth"
blood_overlay_type = "coat"
togglename = "zipper"
- body_parts_covered = CHEST
+ body_parts_covered = CHEST|GROIN|ARMS
+ cold_protection = CHEST|GROIN|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
- armor = list("melee" = 20, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
//Armored suit
@@ -130,6 +132,9 @@
desc = "The standard cap of the PGF military, in Navy colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects."
icon_state = "navalflap"
item_state = "bluecloth"
+ cold_protection = HEAD
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
/obj/item/clothing/head/gezena/marine
name = "\improper PGFMC Cap"
@@ -137,7 +142,7 @@
icon_state = "marinehat"
item_state = "marinecloth"
-/obj/item/clothing/head/gezena/marine/flap
+/obj/item/clothing/head/gezena/flap/marine
name = "\improper PGFMC Betzu-il cap"
desc = "The standard cap of the PGF military, in Marine Corps colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects."
icon_state = "marineflap"
@@ -149,7 +154,7 @@
icon_state = "squadhat"
item_state = "marinecloth"
-/obj/item/clothing/head/gezena/marine/lead/flap
+/obj/item/clothing/head/gezena/flap/marine/lead
name = "\improper PGFMC Commander's' Betzu-il cap"
desc = "The standard cap of the PGF military, in Marine Corps colors. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. The silver markings denote it as a commander's cap."
icon_state = "squadflap"
@@ -161,7 +166,7 @@
icon_state = "medichat"
item_state = "whitecloth"
-/obj/item/clothing/head/gezena/medic/flap
+/obj/item/clothing/head/gezena/flap/medic
name = "\improper PGF medic Betzu-il cap"
desc = "The standard cap of the PGF military. “betzu-il”, translating to “sun-blocker”, refers to the flap at the back for protection against natural hazards such as sunburns, sandstorms, and biting insects. The coloring indicates the wearer as a medical officer."
icon_state = "medicflap"
@@ -260,8 +265,8 @@
item_state = "blackcloth"
/obj/item/clothing/neck/cloak/gezena/lead
- name = "sergeant's Azuilhauz"
- desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a squad commander."
+ name = "marine officer's Azuilhauz"
+ desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as a squad leader."
icon_state = "squadcape"
item_state = "blackcloth"
@@ -278,7 +283,7 @@
item_state = "whitecloth"
/obj/item/clothing/neck/cloak/gezena/command
- name = "officer's Azuilhauz"
+ name = "navy officer's Azuilhauz"
desc = "The “Aziulhauz”, or “rank-cape”, is the method with which PGF military members display their rank to others. Wearing one while on duty is required by uniform code. This variant displays the wearer's rank as an officer."
icon_state = "commandcape"
item_state = "whitecloth"
diff --git a/code/modules/clothing/factions/hardliners.dm b/code/modules/clothing/factions/hardliners.dm
index 5c3423f745c0..b1a7c5e96e2a 100644
--- a/code/modules/clothing/factions/hardliners.dm
+++ b/code/modules/clothing/factions/hardliners.dm
@@ -150,7 +150,7 @@
/obj/item/clothing/head/helmet/hardliners/swat
name = "hardliners pilot helmet"
- desc = "A modified X-11 helmet utilized by regular pilots, as well as the feared mech pilots of the Hardliner movement. The attached visor helps protect against sudden flashes from explosions."
+ desc = "A modified X-11 helmet utilized by regular pilots, as well as the feared exosuit pilots of the Hardliner movement. The attached visor helps protect against sudden flashes from explosions."
flash_protect = FLASH_PROTECTION_WELDER
icon_state = "hl_pilot"
item_state = "hl_pilot"
diff --git a/code/modules/clothing/factions/ngr.dm b/code/modules/clothing/factions/ngr.dm
index 7892a098b50d..4a70d10327c6 100644
--- a/code/modules/clothing/factions/ngr.dm
+++ b/code/modules/clothing/factions/ngr.dm
@@ -14,7 +14,7 @@
/obj/item/clothing/under/syndicate/ngr/fatigues
name = "\improper NGR fatigues"
- desc = "Beige fatigues used primarily by the ship and mech pilots of the New Gorlex Republic."
+ desc = "Beige fatigues used primarily by the shuttle and exosuit pilots of the New Gorlex Republic."
icon_state = "ngr_fatigues"
item_state = "ngr_fatigues"
@@ -64,6 +64,7 @@
mob_overlay_icon = 'icons/mob/clothing/faction/ngr/suits.dmi'
icon_state = "ngr_hazard"
item_state = "redcloth"
+ supports_variations = VOX_VARIATION
//////////////////
//Armored suits//
@@ -230,6 +231,7 @@
icon_state = "ngr_shemagh"
icon = 'icons/obj/clothing/faction/ngr/neck.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/ngr/neck.dmi'
+ supports_variations = VOX_VARIATION
//////////
//Belts//
diff --git a/code/modules/clothing/factions/srm.dm b/code/modules/clothing/factions/srm.dm
index cd901306b7a7..07639696bb01 100644
--- a/code/modules/clothing/factions/srm.dm
+++ b/code/modules/clothing/factions/srm.dm
@@ -10,6 +10,7 @@
can_adjust = FALSE
icon = 'icons/obj/clothing/faction/srm/uniforms.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/srm/uniforms.dmi'
+ supports_variations = KEPORI_VARIATION
//////////////////
//Armored suits//
@@ -25,12 +26,14 @@
heat_protection = CHEST|GROIN|ARMS
icon = 'icons/obj/clothing/faction/srm/suits.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/armor/roumain/shadow
name = "saint-roumain shadow duster"
desc = "A coat made from hard leather. Its rough, barely-treated finish is typical of one of the Saint-Roumain Militia's trainees."
icon_state = "armor_rouma_shadow"
item_state = "rouma_shadow_coat"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/toggle/labcoat/roumain_med
name = "saint-roumain medical duster"
@@ -39,6 +42,7 @@
mob_overlay_icon = 'icons/mob/clothing/faction/srm/suits.dmi'
icon_state = "rouma_med_coat"
armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/hazardvest/roumain
name = "saint-roumain machinist leather vest"
@@ -53,6 +57,7 @@
name = "saint-roumain flamebearer robes"
desc = "A set of ashy-grey robes made from hard leather, adorned with gold trims. Its rough finish after a near-char and application of aromatics is heavily favored for the ecclesiastical sect of the Church of Saint Roumain, a living reminder of the Ashen Huntsman himself."
icon_state = "armor_rouma_flamebearer"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/armor/roumain/colligne
name = "saint-roumain colligne coat"
@@ -62,6 +67,7 @@
body_parts_covered = CHEST|GROIN|ARMS|LEGS
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/armor/roumain/montagne
name = "saint-roumain montagne coat"
@@ -72,6 +78,7 @@
armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
+ supports_variations = KEPORI_VARIATION
///////////////
//Spacesuits//
@@ -86,6 +93,7 @@
item_state = "hardsuit0-roumain"
hardsuit_type = "roumain"
worn_y_offset = 4
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/suit/space/hardsuit/solgov/roumain
name = "\improper roumain hardsuit"
@@ -96,6 +104,7 @@
item_state = "hardsuit-roumain"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/solgov/roumain
slowdown = 0.5
+ supports_variations = KEPORI_VARIATION
/////////
//Hats//
@@ -107,11 +116,13 @@
icon_state = "rouma_hat"
icon = 'icons/obj/clothing/faction/srm/head.dmi'
mob_overlay_icon = 'icons/mob/clothing/faction/srm/head.dmi'
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/cowboy/sec/roumain/shadow
name = "shadow's hat"
desc = "A rough, simple hat. The way it covers your eyes makes you feel badass, but you just look like a wannabe hunter."
icon_state = "rouma_shadow_hat"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/cowboy/sec/roumain/machinist
name = "machinist's hat"
@@ -122,21 +133,25 @@
name = "medical hunter's hat"
desc = "A very wide-brimmed, round hat treated with oil and wax. Somehow manages to look stylish and creepy at the same time."
icon_state = "rouma_med_hat"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/cowboy/sec/roumain/flamebearer
name = "flamebearer's hat"
desc = "A wide-brimmed, pointed hat with charred leather, granting it an ash-grey appearance. The design honors the one the Ashen Huntsman himself wore, according to legend."
icon_state = "rouma_flamebearer_hat"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/cowboy/sec/roumain/colligne
name = "colligne's hat"
desc = "A fancy, pointy leather hat with a large feather plume to signal that you are, in fact... A Hunter Colligne. You still have some ways to go before you gain the title of Montagne."
icon_state = "rouma_colligne_hat"
+ supports_variations = KEPORI_VARIATION
/obj/item/clothing/head/cowboy/sec/roumain/montagne
name = "montagne's hat"
desc = "A very fancy hat with a large feather plume to signal that you are, in fact, a Hunter Montagne. The exotic fur lining is impeccably soft."
icon_state = "rouma_montagne_hat"
+ supports_variations = KEPORI_VARIATION
///////////////
//Accessories//
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index f33a789156e9..c1b54fc5adc5 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -314,7 +314,7 @@
flash_protect = FLASH_PROTECTION_WELDER
custom_materials = list(/datum/material/iron = 250)
tint = 2
- visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
+ visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | SEALS_EYES
flags_cover = GLASSESCOVERSEYES
glass_colour_type = /datum/client_colour/glass_colour/gray
supports_variations = VOX_VARIATION
@@ -378,7 +378,7 @@
colored_before = TRUE
/obj/item/clothing/glasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use)
- . = list()
+ . = ..()
if(!isinhands && ishuman(loc) && !colored_before)
var/mob/living/carbon/human/H = loc
var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite")
@@ -485,12 +485,14 @@
desc = "A pair of goggles meant for low temperatures."
icon_state = "cold"
item_state = "cold"
+ flags_cover = GLASSESCOVERSEYES | SEALS_EYES
/obj/item/clothing/glasses/heat
name = "heat goggles"
desc = "A pair of goggles meant for high temperatures."
icon_state = "heat"
item_state = "heat"
+ flags_cover = GLASSESCOVERSEYES | SEALS_EYES
/obj/item/clothing/glasses/orange
name = "orange glasses"
@@ -572,7 +574,7 @@
desc = "Medical, security and diagnostic hud. Alt click to toggle xray."
icon_state = "nvgmeson"
item_state = "nvgmeson"
- flags_cover = GLASSESCOVERSEYES
+ flags_cover = GLASSESCOVERSEYES | SEALS_EYES
darkness_view = 8
flash_protect = FLASH_PROTECTION_WELDER
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 61c06125d8f8..a6e9f22ea3e7 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -25,7 +25,7 @@
return TRUE
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 4039402588fd..aa1114e6b182 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -60,7 +60,7 @@
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index dba4c2f80406..9b28c58d03cf 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -116,7 +116,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
/obj/item/clothing/head/hardhat/mining
name = "mining helmet"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a6de8769642a..cdfe4672d46f 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -286,7 +286,7 @@
visor_flags_inv = HIDEFACE
toggle_cooldown = 0
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
- visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
dog_fashion = null
/obj/item/clothing/head/helmet/justice
@@ -492,7 +492,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
flash_protect = FLASH_PROTECTION_WELDER
flags_inv = HIDEHAIR|HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
strip_delay = 80
/obj/item/clothing/head/helmet/swat/inteq
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 24e2f95f03bd..5b8e228b49ee 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -241,7 +241,7 @@
return ..()
/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, file2use)
- . = list()
+ . = ..()
if(!isinhands)
var/datum/sprite_accessory/S = GLOB.hairstyles_list[hairstyle]
if(!S)
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 03ca246b60af..a4c1d5d509fa 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -32,7 +32,7 @@
/obj/item/clothing/mask/proc/handle_speech()
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(body_parts_covered & HEAD)
if(damaged_clothes)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 34e77816c941..e5d3717b2b65 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -8,7 +8,7 @@
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF
+ flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
/obj/item/clothing/mask/gas/atmos
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 3f431df81ccb..2165baaa2b0e 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -11,7 +11,7 @@
greyscale_icon_state = "scarf"
/obj/item/clothing/neck/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(body_parts_covered & HEAD)
if(damaged_clothes)
@@ -167,6 +167,7 @@
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."
icon_state = "stethoscope"
cuttable = FALSE
+ supports_variations = VOX_VARIATION
/obj/item/clothing/neck/stethoscope/attack(mob/living/carbon/human/M, mob/living/user)
if(ishuman(M) && isliving(user))
@@ -267,6 +268,7 @@
name = "shemagh"
desc = "An oversized shemagh, for those with a keen sense of fashion, or those operating tactically."
icon_state = "shemagh"
+ supports_variations = VOX_VARIATION
//The three following scarves don't have the scarf subtype
//This is because Ian can equip anything from that subtype
@@ -275,21 +277,25 @@
name = "striped red scarf"
icon_state = "stripedredscarf"
custom_price = 10
+ supports_variations = VOX_VARIATION
/obj/item/clothing/neck/stripedgreenscarf
name = "striped green scarf"
icon_state = "stripedgreenscarf"
custom_price = 10
+ supports_variations = VOX_VARIATION
/obj/item/clothing/neck/stripedbluescarf
name = "striped blue scarf"
icon_state = "stripedbluescarf"
custom_price = 10
+ supports_variations = VOX_VARIATION
/obj/item/clothing/neck/stripedsolgovscarf
name = "striped solgov scarf"
icon_state = "stripedsolgovscarf"
custom_price = 10
+ supports_variations = VOX_VARIATION
/obj/item/clothing/neck/petcollar
name = "pet collar"
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index b3a2b20f687c..d68c49e61778 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -59,7 +59,7 @@
/obj/item/storage/backpack/satchel = 20,
/obj/item/storage/backpack/messenger = 20,
/obj/item/melee/baton/cattleprod/loaded = 5,
- /obj/item/reagent_containers/food/snacks/baguette = 2, // yes you can put this on your back
+ /obj/item/food/baguette = 2, // yes you can put this on your back
/obj/item/deployable_turret_folded = 1,
/obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended = 1,
))
@@ -139,16 +139,29 @@
backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen)
/datum/outfit/job/frontiersmen/ert/grunt/skm
- name = "ERT - Frontiersman Grunt (SKM-24)"
+ name = "ERT - Frontiersman Grunt (SKM-24 AR)"
suit_store = /obj/item/gun/ballistic/automatic/assault/skm
belt = /obj/item/storage/belt/security/military/frontiersmen/skm_ammo
-/datum/outfit/job/frontiersmen/ert/grunt/aps_mp //remember. Remind me to replace this with the spitter.
- name = "ERT - Frontiersman Grunt (Stechkin APS)"
+/datum/outfit/job/frontiersmen/ert/grunt/mauler_mp
+ name = "ERT - Frontiersman Grunt (Mauler MP)"
- suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
- belt = /obj/item/storage/belt/security/military/frontiersmen/aps_mp_ammo
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/mauler
+ belt = /obj/item/storage/belt/security/military/frontiersmen/mauler_mp_ammo
+
+/datum/outfit/job/frontiersmen/ert/grunt/spitter_mp
+ name = "ERT - Frontiersman Grunt (Spitter MP)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/spitter
+ belt = /obj/item/storage/belt/security/military/frontiersmen/spitter_ammo
+
+/datum/outfit/job/frontiersmen/ert/grunt/pounder_smg
+ name = "ERT - Frontiersman Grunt (Pounder SMG)"
+
+ suit_store = /obj/item/gun/ballistic/automatic/smg/pounder
+ belt = null
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen=1, /obj/item/ammo_box/magazine/c22lr_pounder_pan=2)
/datum/outfit/job/frontiersmen/ert/leader
name = "ERT - Frontiersman Officer"
@@ -177,9 +190,9 @@
mask = /obj/item/clothing/mask/surgical
gloves = /obj/item/clothing/gloves/color/latex/nitrile
belt = /obj/item/storage/belt/medical/webbing/frontiersmen/surgery
- suit_store = /obj/item/gun/ballistic/automatic/pistol/APS
+ suit_store = /obj/item/gun/ballistic/automatic/pistol/mauler
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3, /obj/item/ammo_box/magazine/pistolm9mm=2)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack=3, /obj/item/ammo_box/magazine/m9mm_mauler=2)
/datum/outfit/job/frontiersmen/ert/engineer
@@ -211,7 +224,7 @@
/datum/outfit/job/frontiersmen/ert/sentry_lmg
- name = "ERT - Frontiersman Sentry (SKM-24v)"
+ name = "ERT - Frontiersman Sentry (SKM-24v LMG)"
head = /obj/item/clothing/head/helmet/marine/frontier
mask = /obj/item/clothing/mask/gas/sechailer/balaclava
@@ -222,3 +235,18 @@
belt = /obj/item/gun/ballistic/revolver/mateba
backpack_contents = list(/obj/item/ammo_box/magazine/skm_762_40/drum=2,/obj/item/ammo_box/a357=2,/obj/item/grenade/frag=1,/obj/item/radio=1)
+
+/datum/outfit/job/frontiersmen/ert/sentry_shredder
+ name = "ERT - Frontiersman Sentry (Shredder LMG)"
+
+ head = /obj/item/clothing/head/helmet/marine/frontier
+ mask = /obj/item/clothing/mask/gas/sechailer/balaclava
+ suit = /obj/item/clothing/suit/armor/vest/marine/frontier
+ gloves = /obj/item/clothing/gloves/combat
+
+ belt = /obj/item/gun/ballistic/revolver/mateba
+
+
+ l_hand = /obj/item/gun/ballistic/automatic/hmg/shredder // this doesnt even fit on the suit storage slot
+
+ backpack_contents = list(/obj/item/ammo_box/magazine/m12_shredder=2,/obj/item/ammo_box/a357=2,/obj/item/grenade/frag=1,/obj/item/radio=1)
diff --git a/code/modules/clothing/outfits/ert/minutemen_ert.dm b/code/modules/clothing/outfits/ert/minutemen_ert.dm
index bc440d3bc612..482777814c64 100644
--- a/code/modules/clothing/outfits/ert/minutemen_ert.dm
+++ b/code/modules/clothing/outfits/ert/minutemen_ert.dm
@@ -4,7 +4,7 @@
job_icon = "clip_cmm2"
suit = /obj/item/clothing/suit/armor/vest/marine/heavy
- suit_store = /obj/item/gun/ballistic/shotgun/bulldog/minutemen
+ suit_store = /obj/item/gun/ballistic/shotgun/cm15
mask = /obj/item/clothing/mask/gas/clip
head = /obj/item/clothing/head/helmet/riot/clip
belt = /obj/item/storage/belt/military/clip/cm15
@@ -58,7 +58,7 @@
belt = /obj/item/storage/belt/military/clip/e50
uniform = /obj/item/clothing/under/clip/officer
suit = /obj/item/clothing/suit/armor/vest/marine
- suit_store = /obj/item/gun/energy/laser/e50
+ suit_store = /obj/item/gun/energy/laser/e50/clip
r_pocket = /obj/item/grenade/c4
l_pocket = /obj/item/reagent_containers/hypospray/medipen/stimpack
diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm
index db227c2903c7..f89d39a4d8d3 100644
--- a/code/modules/clothing/outfits/factions/independent.dm
+++ b/code/modules/clothing/outfits/factions/independent.dm
@@ -540,7 +540,7 @@
dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
shoes = /obj/item/clothing/shoes/sneakers/brown
glasses = /obj/item/clothing/glasses/sunglasses
- l_hand = /obj/item/clipboard
+ r_pocket = /obj/item/clipboard
backpack_contents = list(/obj/item/modular_computer/tablet/preset/cargo=1)
chameleon_extras = /obj/item/stamp/qm
@@ -548,12 +548,16 @@
/datum/outfit/job/independent/quartermaster/western
name = "Independent - Quartermaster (Western)"
- uniform = /obj/item/clothing/under/rank/cargo/qm
- suit = /obj/item/clothing/suit/toggle/hazard
+ uniform = /obj/item/clothing/under/rank/security/detective
+ suit = /obj/item/clothing/suit/hazardvest
shoes = /obj/item/clothing/shoes/workboots
+ gloves = /obj/item/clothing/gloves/fingerless
glasses = /obj/item/clothing/glasses/sunglasses
head = /obj/item/clothing/head/cowboy/sec
+ backpack = /obj/item/storage/backpack/industrial
+ satchel = /obj/item/storage/backpack/satchel/eng
+
/datum/outfit/job/independent/miner
name = "Independent - Miner"
jobtype = /datum/job/mining
diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm
index 5c038b05f181..8a04a0fb76f8 100644
--- a/code/modules/clothing/outfits/factions/minutemen.dm
+++ b/code/modules/clothing/outfits/factions/minutemen.dm
@@ -552,16 +552,16 @@
backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/chicken_wings_hot_sauce=1)
/datum/outfit/job/clip/minutemen/grunt/dressed/armed
- name = "CLIP Minutemen - Minuteman (Armed - CM-16)"
+ name = "CLIP Minutemen - Minuteman (Armed - CM-82)"
- suit_store = /obj/item/gun/ballistic/automatic/assault/p16/minutemen
- belt = /obj/item/storage/belt/military/clip/p16
+ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82
+ belt = /obj/item/storage/belt/military/clip/cm82
-/datum/outfit/job/clip/minutemen/grunt/dressed/armed/f4 //f4 is rename of GAL, don't wanna repath upon adding the clip guns though, if i forget to remove this during then, fucking yell at me
- name = "CLIP Minutemen - Minuteman (Armed - CM-GAL)"
+/datum/outfit/job/clip/minutemen/grunt/dressed/armed/f4
+ name = "CLIP Minutemen - Minuteman (Armed - F4)"
- suit_store = /obj/item/gun/ballistic/automatic/marksman/gal
- belt = /obj/item/storage/belt/military/clip/gal
+ suit_store = /obj/item/gun/ballistic/automatic/marksman/f4
+ belt = /obj/item/storage/belt/military/clip/f4
/datum/outfit/job/clip/minutemen/grunt/dressed/armed/cm5
name = "CLIP Minutemen - Minuteman (Armed - CM-5)"
@@ -580,9 +580,9 @@
belt = /obj/item/storage/belt/military/clip/engi
/datum/outfit/job/clip/minutemen/grunt/dressed/engi/armed
- name = "CLIP Minutemen - Field Engineer (Armed - CM-16)"
+ name = "CLIP Minutemen - Field Engineer (Armed - CM-82)"
- suit_store = /obj/item/gun/ballistic/automatic/assault/p16/minutemen
+ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82
backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/chili_macaroni=1, /obj/item/grenade/c4=2, /obj/item/ammo_box/magazine/p16=3)
/datum/outfit/job/clip/minutemen/grunt/dressed/med
@@ -598,20 +598,25 @@
suit_store = /obj/item/gun/ballistic/automatic/smg/cm5
- backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/cheese_pizza_slice, /obj/item/defibrillator/compact/loaded=1, /obj/item/storage/firstaid/medical=1, /obj/item/ammo_box/magazine/smgm9mm=3)
+ backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/cheese_pizza_slice, /obj/item/defibrillator/compact/loaded=1, /obj/item/storage/firstaid/medical=1, /obj/item/ammo_box/magazine/cm5_9mm=3)
+
+/obj/item/storage/belt/military/clip/gunner/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
/obj/item/storage/belt/military/clip/gunner/PopulateContents()
for(var/i in 1 to 5)
- new /obj/item/ammo_box/magazine/skm_762_40/extended(src)
+ new /obj/item/ammo_box/magazine/cm40_762_40_box(src)
new /obj/item/grenade/frag(src)
/datum/outfit/job/clip/minutemen/grunt/dressed/gunner_armed
- name = "CLIP Minutemen - Field Gunner (Armed - SKM-24u)" //See above, replace with CLIP LMG when added
+ name = "CLIP Minutemen - Field Gunner (Armed - CM-40)"
id_assignment = "Machinegunner"
accessory = /obj/item/clothing/accessory/armband
belt = /obj/item/storage/belt/military/clip/gunner
- suit_store = /obj/item/gun/ballistic/automatic/hmg/skm_lmg/extended
+ suit_store = /obj/item/gun/ballistic/automatic/hmg/cm40
backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1)
@@ -639,8 +644,8 @@
/datum/outfit/job/clip/minutemen/grunt/lead/armed
name = "CLIP Minutemen - Field Sergeant (Armed)"
- suit_store = /obj/item/gun/ballistic/automatic/assault/p16/minutemen
- belt = /obj/item/storage/belt/military/clip/p16
+ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82
+ belt = /obj/item/storage/belt/military/clip/cm82
//replace commander with the cm23 when its impemented, see the cm-f4 above
backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1, /obj/item/gun/ballistic/automatic/pistol/commander=1)
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index f03c91d51a11..b22c69b38f6b 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -472,10 +472,10 @@
accessory = /obj/item/clothing/accessory/holster
head = /obj/item/clothing/head/beret/command
-// Mech Pilot
+// Exosuit Pilot
/datum/outfit/job/nanotrasen/security/mech_pilot
- name = "Nanotrasen - Mech Pilot"
- id_assignment = "Mech Pilot"
+ name = "Nanotrasen - Exosuit Pilot"
+ id_assignment = "Exosuit Pilot"
uniform = /obj/item/clothing/under/rank/security/officer/military/eng
head = /obj/item/clothing/head/beret/sec/officer
diff --git a/code/modules/clothing/outfits/factions/syndicate.dm b/code/modules/clothing/outfits/factions/syndicate.dm
index 4dbbe0826e21..479965e756b4 100644
--- a/code/modules/clothing/outfits/factions/syndicate.dm
+++ b/code/modules/clothing/outfits/factions/syndicate.dm
@@ -4,7 +4,7 @@
name = "Syndicate - Base Outfit"
uniform = /obj/item/clothing/under/color/black
- box = /obj/item/storage/box/survival/syndie
+ box = /obj/item/storage/box/survival
id = /obj/item/card/id/syndicate_command/crew_id
faction_icon = "bg_syndicate"
@@ -52,7 +52,7 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
+ box = /obj/item/storage/box/survival
/datum/outfit/job/syndicate/assistant/gorlex
name = "Syndicate - Junior Agent (Hardliner)"
@@ -106,8 +106,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/assistant/twink/post_equip(mob/living/carbon/human/H)
. = ..()
@@ -246,8 +244,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/bartender/twink/post_equip(mob/living/carbon/human/H)
. = ..()
assign_codename(H)
@@ -301,8 +297,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/sec
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/captain/aclf
name = "Captain (ACLF)"
@@ -483,6 +477,7 @@
l_hand = /obj/item/storage/firstaid/medical
suit_store = /obj/item/flashlight/pen
backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1)
+ box = /obj/item/storage/box/survival/medical
/datum/outfit/job/syndicate/cmo/suns
name = "Syndicate - Medical Instructor (SUNS)"
@@ -577,6 +572,7 @@
r_pocket = /obj/item/assembly/flash/handheld
l_pocket = /obj/item/restraints/handcuffs
backpack_contents = list(/obj/item/melee/baton/loaded=1)
+ box = /obj/item/storage/box/survival/security
/datum/outfit/job/syndicate/hos/gorlex
name = "Syndicate - Sergeant (Hardliner)"
@@ -628,8 +624,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/hos/twink/post_equip(mob/living/carbon/human/H)
. = ..()
assign_codename(H)
@@ -685,6 +679,7 @@
shoes = /obj/item/clothing/shoes/sneakers/white
alt_suit = /obj/item/clothing/suit/apron/surgical
l_hand = /obj/item/storage/firstaid/medical
+ box = /obj/item/storage/box/survival/medical
/datum/outfit/job/syndicate/doctor/suns
name = "Syndicate - Medical Doctor (SUNS)"
@@ -755,6 +750,7 @@
suit_store = /obj/item/flashlight/pen
backpack_contents = list(/obj/item/roller=1)
pda_slot = ITEM_SLOT_LPOCKET
+ box = /obj/item/storage/box/survival/medical
/datum/outfit/job/syndicate/paramedic/gorlex
name = "Syndicate - Paramedic (Gorlex)"
@@ -793,8 +789,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie/med
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/paramedic/twink/post_equip(mob/living/carbon/human/H)
. = ..()
assign_codename(H)
@@ -920,6 +914,8 @@
/obj/item/melee/baton/loaded=1,
)
+ box = /obj/item/storage/box/survival/security
+
/datum/outfit/job/syndicate/security/gorlex
name = "Syndicate - Trooper (Hardliner)"
@@ -935,7 +931,7 @@
l_pocket = /obj/item/restraints/handcuffs
r_pocket = /obj/item/assembly/flash/handheld
-/datum/outfit/job/syndicate/security/gorlex
+/datum/outfit/job/syndicate/security/gorlex/pilot
name = "Syndicate - Pilot (Hardliner)"
id_assignment = "Pilot"
job_icon = "securityofficer"
@@ -987,8 +983,6 @@
duffelbag = /obj/item/storage/backpack/duffelbag/syndie
courierbag = /obj/item/storage/backpack/messenger/sec
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/security/twink/post_equip(mob/living/carbon/human/H)
. = ..()
assign_codename(H)
@@ -1030,6 +1024,8 @@
/obj/item/mining_voucher=1,\
/obj/item/stack/marker_beacon/ten=1)
+ box = /obj/item/storage/box/survival/mining
+
/datum/outfit/job/syndicate/miner/gorlex
name = "Syndicate - Wrecker (Hardliner)"
id_assignment = "Wrecker"
@@ -1175,8 +1171,6 @@
r_pocket = null
implants = list(/obj/item/implant/weapons_auth)
- box = /obj/item/storage/box/survival/syndie
-
/datum/outfit/job/syndicate/engineer/twink/post_equip(mob/living/carbon/human/H)
. = ..()
assign_codename(H)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 336ac43c7d4d..cd4474588090 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -29,7 +29,7 @@
var/atom/movable/screen/alert/our_alert
/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index cb98f607089c..f96ad54adb88 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -18,7 +18,7 @@
flash_protect = FLASH_PROTECTION_WELDER
strip_delay = 50
equip_delay_other = 50
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
dog_fashion = null
content_overlays = FALSE
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 02fbb162892b..3c54e44cf035 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -17,7 +17,7 @@
actions_types = list(/datum/action/item_action/toggle_helmet)
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
var/rad_count = 0
var/rad_record = 0
var/grace_count = 0
@@ -734,23 +734,6 @@
item_state = "capspacesuit"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat/captain
- //Clown
-/obj/item/clothing/head/helmet/space/hardsuit/clown
- name = "cosmohonk hardsuit helmet"
- desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding."
- icon_state = "hardsuit0-clown"
- item_state = "hardsuit0-clown"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30)
- hardsuit_type = "clown"
-
-/obj/item/clothing/suit/space/hardsuit/clown
- name = "cosmohonk hardsuit"
- desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it."
- icon_state = "hardsuit-clown"
- item_state = "clown_hardsuit"
- armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown
-
//Old Prototype
/obj/item/clothing/head/helmet/space/hardsuit/ancient
name = "prototype RIG hardsuit helmet"
@@ -863,7 +846,7 @@
C.update_inv_wear_suit()
/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands)
- . = list()
+ . = ..()
if(!isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01)
@@ -1045,7 +1028,7 @@
item_state = "independent_sec_helm"
hardsuit_type = "independent-sec"
armor = list("melee" = 35, "bullet" = 25, "laser" = 20,"energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
- supports_variations = VOX_VARIATION
+ supports_variations = VOX_VARIATION | SNOUTED_VARIATION
/obj/item/clothing/suit/space/hardsuit/security/independent
icon_state = "hardsuit-independent-sec"
@@ -1056,7 +1039,7 @@
hardsuit_type = "independent-sec"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/independent
armor = list("melee" = 35, "bullet" = 25, "laser" = 20, "energy" = 40, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75)
- supports_variations = VOX_VARIATION
+ supports_variations = VOX_VARIATION | DIGITIGRADE_VARIATION
//Mining
/obj/item/clothing/head/helmet/space/hardsuit/mining/independent
@@ -1106,7 +1089,7 @@
name = "pilot space suit"
icon_state = "space-pilot"
item_state = "space-pilot"
- desc = "A lightweight, unarmored space suit designed for mech and fighter pilots. Special attachment points make mounting and dismounting from mechs much easier."
+ desc = "A lightweight, unarmored space suit designed for exosuit and shuttle pilots. Special attachment points make mounting and dismounting from exosuits much easier."
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | FAST_EMBARK
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large
@@ -1114,7 +1097,7 @@
name = "pilot helmet"
icon_state = "space-pilot-plain0"
item_state = "space-pilot-plain"
- desc = "A specialized space helmet designed for mech and fighter pilots. Offers limited impact protection."
+ desc = "A specialized space helmet designed for exosuit and shuttle pilots. Offers limited impact protection."
var/skin = "plain"
var/blurb = " Its simple design is quite ancient."
up = FALSE
@@ -1147,7 +1130,7 @@
if("corvid")
blurb = " It is sloppily painted with thin teal and red paint. There are some dark stains on the lining..."
- desc = "A specialized space helmet designed for mech and fighter pilots. Offers limited impact protection.[blurb]"
+ desc = "A specialized space helmet designed for exosuit and shuttle pilots. Offers limited impact protection.[blurb]"
update_icon_state()
/obj/item/clothing/head/helmet/space/pilot/random/New()
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 43dc5a5dd8d0..895dea5156aa 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -58,7 +58,7 @@
actions_types = list(/datum/action/item_action/toggle_helmet_light)
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF
+ flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF | SEALS_EYES
visor_flags_inv = HIDEEYES|HIDEFACE
// WS Begin - plasmeme command helmets buff - used for RD bomb scanner
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 0e7edb63f068..30d3c3c3c9ba 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -19,7 +19,7 @@
mob_overlay_icon = 'icons/mob/clothing/suit.dmi'
/obj/item/clothing/suit/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 9dfd23210d9c..4b5da2de4f8e 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -330,7 +330,7 @@
icon_state = "armor_inteq_honorable_battlecoat"
item_state = "inteq_honorable_battlecoat"
armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90)
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/obj/item/clothing/suit/armor/inteq/corpsman
name = "inteq corpsman vest"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 1131c4e9166c..3ef1628c19b4 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -8,7 +8,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 30, "acid" = 100)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
resistance_flags = ACID_PROOF
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
/obj/item/clothing/suit/bio_suit
name = "bio suit"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 56018c288b6a..312f14dec507 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -114,6 +114,8 @@
item_state = "highvis"
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
+ cold_protection = CHEST|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
togglename = "zipper"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio)
resistance_flags = NONE
@@ -194,7 +196,7 @@
//Mime
/obj/item/clothing/suit/toggle/suspenders
name = "suspenders"
- desc = "They suspend the illusion of the mime's play."
+ desc = "The symbol of hard labor and dirty jobs."
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 858b494564e6..798a34606bc1 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -59,11 +59,11 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50)
/obj/item/clothing/suit/toggle/labcoat/raincoat
- name = "\improper Cybersun labcoat"
- desc = {"A translucent, uniquely designed labcoat from Cybersun Solutions. It's made from a special material that actively repels fluids.
+ name = "translucent labcoat"
+ desc = {"A uniquely designed, translucent labcoat. It's made from a special material that actively repels fluids.
You're pretty sure this is just a raincoat.
-Wearing a raincoat inside is like wearing sunglasses at night. A good Cybersun exec does both.
+Wearing a raincoat inside is like wearing sunglasses at night. A good chemist does both.
"}
icon_state = "raincoat"
item_state = "raincoat"
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index ac91351c2324..88661d6b835c 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -67,7 +67,7 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 70
equip_delay_other = 70
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
@@ -126,7 +126,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
strip_delay = 60
equip_delay_other = 60
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
+ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF | SEALS_EYES
resistance_flags = NONE
flags_1 = RAD_PROTECT_CONTENTS_1
supports_variations = VOX_VARIATION
diff --git a/code/modules/clothing/towels.dm b/code/modules/clothing/towels.dm
index 22c1b29976fc..f35c608a042a 100644
--- a/code/modules/clothing/towels.dm
+++ b/code/modules/clothing/towels.dm
@@ -32,7 +32,7 @@
item_flags = NOBLUDGEON
resistance_flags = FLAMMABLE
flags_inv = HIDEHAIR // Only relevant when in head shape, but useful to keep around regardless.
- supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+ supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON | VOX_VARIATION
/// The shape we're currently in.
var/shape = TOWEL_FOLDED
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index a28d6d323a83..bc8cb512906b 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -27,7 +27,7 @@
supports_variations = VOX_VARIATION
/obj/item/clothing/under/worn_overlays(isinhands = FALSE)
- . = list()
+ . = ..()
if(!isinhands)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index bfc7524149cb..ac7eeea5dc23 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -167,7 +167,7 @@
can_adjust = FALSE
resistance_flags = NONE
-/obj/item/clothing/under/costume/mech_suit
+/obj/item/clothing/under/costume/mech_suit //these still have "mech" in the name because they're costumes, not serious utility wear
name = "red mech pilot's suit"
desc = "A red mech pilot's suit. Might make your butt look big."
icon_state = "red_mech_suit"
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index f474018739d0..4f2c3cd1343a 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -1,6 +1,6 @@
// Fish path used for autogenerated fish
/obj/item/fish
- name = "generic looking aquarium fish"
+ name = "generic fish"
desc = "very bland"
icon = 'icons/obj/aquarium.dmi'
icon_state = "trout" //Replace this with "bugfish" from tg please
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 32c4b1a9a09f..ec10f7dfb0f2 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -373,7 +373,7 @@
desc = "A popular Gezenan drink made of fermented honey and spices, known as Gezenan Dark Mead, or GDM for short."
icon_state = "beer"
list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30)
- foodtype = GRAIN | ALCOHOL
+ foodtype = SUGAR | ALCOHOL
custom_price = 60
/obj/item/reagent_containers/food/drinks/beer/light
@@ -762,7 +762,7 @@
desc = "If you ever wondered where air came from..."
list_reagents = list(/datum/reagent/oxygen = 6, /datum/reagent/nitrogen = 24)
icon = 'icons/obj/food/ration.dmi'
- icon_state = "ration_package"
+ icon_state = "ration_drink"
drop_sound = 'sound/items/handling/cardboardbox_drop.ogg'
pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg'
in_container = TRUE
@@ -773,7 +773,7 @@
/obj/item/reagent_containers/food/drinks/ration/proc/open_ration(mob/user)
to_chat(user, "You tear open \the [src].")
- playsound(user.loc, 'sound/effects/rip3.ogg', 50)
+ playsound(user.loc, 'sound/items/glass_cap.ogg', 50)
reagents.flags |= OPENCONTAINER
spillable = TRUE
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 57d84ee22397..785607cdef67 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -202,10 +202,10 @@
/obj/item/reagent_containers/food/drinks/bottle/kahlua
name = "Keh'Lu'Tex Liqueur"
- desc = "An adapted recipe of a caffeine-mixed liqueur originating from Reh'himl, which replaces it's original ingredient with coffee from Terra."
+ desc = "An adapted recipe of a caffeine-mixed liqueur originating from Reh'himl, which replaces its original ingredient with coffee from Terra."
icon_state = "kahluabottle"
list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 100)
- foodtype = VEGETABLES
+ foodtype = SUGAR | ALCOHOL //it's coffee and rum .
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
name = "Student-Union's Gold Standard"
@@ -618,6 +618,10 @@
custom_materials = list(/datum/material/wood = 800)
w_class = WEIGHT_CLASS_BULKY
var/sealed = FALSE
+ var/max_bottles = 6
+ var/list/valid_bottles = list(/obj/item/reagent_containers/food/drinks/beer,
+ /obj/item/reagent_containers/food/drinks/ale,
+ /obj/item/reagent_containers/food/drinks/bottle)
/obj/item/storage/bottles/Initialize()
. = ..()
@@ -628,12 +632,8 @@
var/datum/component/storage/S = GetComponent(/datum/component/storage)
S.max_w_class = WEIGHT_CLASS_NORMAL
S.max_combined_w_class = 16
- S.max_items = 6
- S.set_holdable(list(
- /obj/item/reagent_containers/food/drinks/beer,
- /obj/item/reagent_containers/food/drinks/ale,
- /obj/item/reagent_containers/food/drinks/bottle
- ))
+ S.max_items = max_bottles
+ S.set_holdable(valid_bottles)
S.locked = sealed
/obj/item/storage/bottles/update_icon_state()
@@ -668,3 +668,17 @@
/obj/item/storage/bottles/sandblast/PopulateContents()
for(var/i in 1 to 6)
new /obj/item/reagent_containers/food/drinks/bottle/sarsaparilla(src)
+
+/obj/item/storage/bottles/moonshine
+ name = "moonshine bottle crate"
+ desc = "Holds four bottles of the strongest hooch this side of the Frontier."
+ icon_state = "hoochcrate"
+ max_bottles = 4
+ valid_bottles = list(/obj/item/reagent_containers/food/drinks/bottle/moonshine)
+
+/obj/item/storage/bottles/moonshine/PopulateContents()
+ for(var/i in 1 to 4)
+ new /obj/item/reagent_containers/food/drinks/bottle/moonshine(src)
+
+/obj/item/storage/bottles/moonshine/sealed
+ sealed = TRUE
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index fc3df2f74713..3147ee9a5de4 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -45,7 +45,7 @@
to_chat(user, "The ingredient is too big for [src]!")
else if((ingredients.len >= ingMax) || (reagents.total_volume >= volume))
to_chat(user, "You can't add more ingredients to [src]!")
- else if(istype(I, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(I, /obj/item/reagent_containers/food/snacks/cakeslice/custom))
+ else if(istype(I, /obj/item/reagent_containers/food/snacks/pizzaslice/custom))
to_chat(user, "Adding [I.name] to [src] would make a mess.")
else
if(!user.transferItemToLoc(I, src))
@@ -170,26 +170,6 @@
foodtype = GRAIN
-/obj/item/reagent_containers/food/snacks/customizable/bread
- name = "bread"
- ingMax = 6
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/custom
- slices_num = 5
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "tofubread"
- foodtype = GRAIN
-
-
-/obj/item/reagent_containers/food/snacks/customizable/cake
- name = "cake"
- ingMax = 6
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/custom
- slices_num = 5
- icon = 'icons/obj/food/piecake.dmi'
- icon_state = "plaincake"
- foodtype = GRAIN | DAIRY
-
-
/obj/item/reagent_containers/food/snacks/customizable/kebab
name = "kebab"
desc = "Delicious food on a stick."
@@ -199,15 +179,6 @@
ingMax = 6
icon_state = "rod"
-/obj/item/reagent_containers/food/snacks/customizable/pasta
- name = "spaghetti"
- desc = "Noodles. With stuff. Delicious."
- ingredients_placement = INGREDIENTS_SCATTER
- ingMax = 6
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- icon_state = "spaghettiboiled"
- foodtype = GRAIN
-
/obj/item/reagent_containers/food/snacks/customizable/pie
name = "pie"
@@ -238,43 +209,6 @@
icon_state = "bowl"
-/obj/item/reagent_containers/food/snacks/customizable/sandwich
- name = "toast"
- desc = "A timeless classic."
- ingredients_placement = INGREDIENTS_STACK
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "breadslice"
- var/finished = 0
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/customizable/sandwich/initialize_custom_food(obj/item/reagent_containers/BASE, obj/item/I, mob/user)
- icon_state = BASE.icon_state
- ..()
-
-/obj/item/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/reagent_containers/food/snacks/breadslice)) //we're finishing the custom food.
- var/obj/item/reagent_containers/food/snacks/breadslice/BS = I
- if(finished)
- return
- to_chat(user, "You finish the [src.name].")
- finished = 1
- name = "[customname] sandwich"
- BS.reagents.trans_to(src, BS.reagents.total_volume, transfered_by = user)
- ingMax = ingredients.len //can't add more ingredients after that
- var/mutable_appearance/TOP = mutable_appearance(icon, "[BS.icon_state]")
- TOP.pixel_y = 2 * ingredients.len + 3
- add_overlay(TOP)
- if(istype(BS, /obj/item/reagent_containers/food/snacks/breadslice/custom))
- var/mutable_appearance/filling = new(icon, "[initial(BS.icon_state)]_filling")
- filling.color = BS.filling_color
- filling.pixel_y = 2 * ingredients.len + 3
- add_overlay(filling)
- qdel(BS)
- return
- else
- ..()
-
-
/obj/item/reagent_containers/food/snacks/customizable/soup
name = "soup"
desc = "A bowl with liquid and... stuff in it."
diff --git a/code/modules/food_and_drinks/food/ration.dm b/code/modules/food_and_drinks/food/ration.dm
index 261fe707ed7f..6766a6aedbda 100644
--- a/code/modules/food_and_drinks/food/ration.dm
+++ b/code/modules/food_and_drinks/food/ration.dm
@@ -83,7 +83,7 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
/obj/item/reagent_containers/food/snacks/ration/snack
- icon_state = "ration_side"
+ icon_state = "ration_snack"
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/sugar = 3)
/obj/item/reagent_containers/food/snacks/ration/bar
@@ -92,7 +92,7 @@
/obj/item/reagent_containers/food/snacks/ration/condiment
name = "condiment pack"
- desc = "Just your average condiment pacl."
+ desc = "Just your average condiment pack."
icon_state = "ration_condi"
volume = 10
amount_per_transfer_from_this = 10
@@ -126,7 +126,7 @@
/obj/item/reagent_containers/food/snacks/ration/pack
name = "powder pack"
desc = "Mix into a bottle of water and shake."
- icon_state = "ration_condi"
+ icon_state = "ration_pack"
volume = 10
amount_per_transfer_from_this = 10
possible_transfer_amounts = list()
@@ -742,84 +742,105 @@
/obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread
name = "cheese spread pack"
+ filling_color = "#ffcc00"
list_reagents = list(/datum/reagent/consumable/cheese_spread = 8)
/obj/item/reagent_containers/food/snacks/ration/condiment/hot_cheese_spread
name = "jalapeno cheddar cheese spread pack"
+ filling_color = "#ffaa00"
list_reagents = list(/datum/reagent/consumable/cheese_spread = 5 , /datum/reagent/consumable/capsaicin = 3)
/obj/item/reagent_containers/food/snacks/ration/condiment/garlic_cheese_spread
name = "garlic parmesan cheese spread pack"
+ filling_color = "#ffff00"
list_reagents = list(/datum/reagent/consumable/cheese_spread = 8)
/obj/item/reagent_containers/food/snacks/ration/condiment/bacon_cheddar_cheese_spread
name = "bacon cheddar cheese spread pack"
+ filling_color = "#ff9900"
list_reagents = list(/datum/reagent/consumable/cheese_spread = 8)
/obj/item/reagent_containers/food/snacks/ration/condiment/peanut_butter
name = "peanut butter pack"
+ filling_color = "#664400"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/peanut_butter = 5)
/obj/item/reagent_containers/food/snacks/ration/condiment/chunky_peanut_butter
name = "chunky peanut butter pack"
+ filling_color = "#663300"
list_reagents = list(/datum/reagent/consumable/peanut_butter = 10)
/obj/item/reagent_containers/food/snacks/ration/condiment/maple_syrup
name = "maple syrup pack"
+ filling_color = "#661100"
list_reagents = list(/datum/reagent/consumable/sugar = 10)
/obj/item/reagent_containers/food/snacks/ration/pack/chocolate_protein_beverage
name = "chocolate hazelnut protein drink powder pack"
+ filling_color = "#664400"
list_reagents = list(/datum/reagent/consumable/coco = 5, /datum/reagent/consumable/eggyolk = 5)
/obj/item/reagent_containers/food/snacks/ration/pack/fruit_beverage
name = "fruit punch beverage powder, carb-electrolyte pack"
+ filling_color = "#ff4400"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/applejuice = 2, /datum/reagent/consumable/orangejuice = 2)
/obj/item/reagent_containers/food/snacks/ration/pack/fruit_smoothie_beverage
name = "tropical blend fruit and vegetable smoothie powder pack"
+ filling_color = "#ffaa00"
list_reagents = list(/datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/orangejuice = 3, /datum/reagent/consumable/eggyolk = 3)
/obj/item/reagent_containers/food/snacks/ration/pack/grape_beverage
name = "grape beverage powder, carb-fortified pack"
+ filling_color = "#9900ff"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/grapejuice = 5)
/obj/item/reagent_containers/food/snacks/ration/pack/grape_beverage_sugar_free
name = "sugar-free grape beverage base powder"
+ filling_color = "#9900ff"
list_reagents = list(/datum/reagent/consumable/grapejuice = 10)
/obj/item/reagent_containers/food/snacks/ration/pack/lemonade_beverage
name = "lemonade drink powder pack"
+ filling_color = "#ffff80"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/lemonjuice = 5)
/obj/item/reagent_containers/food/snacks/ration/pack/lemonade_beverage_suger_free
name = "lemonade sugar-free beverage base pack"
+ filling_color = "#ffff00"
list_reagents = list(/datum/reagent/consumable/lemonjuice = 10)
/obj/item/reagent_containers/food/snacks/ration/pack/orange_beverage
name = "orange beverage powder, carb-fortified pack"
+ filling_color = "#ffbb00"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/orangejuice = 5)
/obj/item/reagent_containers/food/snacks/ration/pack/orange_beverage_sugar_free
name = "orange beverage base, sugar-free pack"
+ filling_color = "#ff9900"
list_reagents = list(/datum/reagent/consumable/orangejuice = 10)
/obj/item/reagent_containers/food/snacks/ration/pack/cherry_beverage
name = "cherry high-energy beverage powder pack"
+ filling_color = "#ff5555"
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/cherryjelly = 5)
/obj/item/reagent_containers/food/snacks/ration/pack/pineapple_beverage
name = "pinapple fruit beverage base pack"
+ filling_color = "#fff111"
list_reagents = list(/datum/reagent/consumable/pineapplejuice = 10)
/obj/item/reagent_containers/food/snacks/ration/pack/freeze_dried_coffee_orange
name = "freeze-dried coffee flavored with orange pack"
+ filling_color = "#cc7400"
list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/orangejuice = 3)
/obj/item/reagent_containers/food/snacks/ration/pack/freeze_dried_coffee_chocolate
name = "freeze-dried coffee flavored with chocolate pack"
+ filling_color = "#803300"
list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/coco = 3)
/obj/item/reagent_containers/food/snacks/ration/pack/freeze_dried_coffee_hazelnut
name = "freeze-dried coffee flavored with hazelnut pack"
+ filling_color = "#553300"
list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/coco = 3)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 61121a3ca950..9e84c272dbb6 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -56,6 +56,16 @@ All foods are distributed among various categories. Use common sense.
//Placeholder for effect that trigger on eating that aren't tied to reagents.
+/obj/item/reagent_containers/food/snacks/Initialize(mapload)
+ . = ..()
+ RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried))
+
+
+/obj/item/reagent_containers/food/snacks/proc/on_fried(fry_object)
+ reagents.trans_to(fry_object, reagents.total_volume)
+ qdel()
+ return COMSIG_FRYING_HANDLED
+
/obj/item/reagent_containers/food/snacks/add_initial_reagents()
if(tastes && tastes.len)
if(list_reagents)
@@ -175,7 +185,7 @@ All foods are distributed among various categories. Use common sense.
if(W.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, span_warning("[S] is too big for [src]!"))
return FALSE
- if(istype(S) && (!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom)))
+ if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom))
to_chat(user, span_warning("[src] can't be filled with [S]!"))
return FALSE
if(contents.len >= 20)
@@ -337,26 +347,10 @@ All foods are distributed among various categories. Use common sense.
/// All the food items that can store an item inside itself, like bread or cake.
/obj/item/reagent_containers/food/snacks/store
w_class = WEIGHT_CLASS_NORMAL
- var/stored_item = 0
-/obj/item/reagent_containers/food/snacks/store/attackby(obj/item/W, mob/user, params)
- ..()
- if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods.
- if(W.get_sharpness())
- return 0
- if(stored_item)
- return 0
- if(!iscarbon(user))
- return 0
- if(contents.len >= 20)
- to_chat(user, "[src] is full.")
- return 0
- to_chat(user, "You slip [W] inside [src].")
- user.transferItemToLoc(W, src)
- add_fingerprint(user)
- contents += W
- stored_item = 1
- return 1 // no afterattack here
+/obj/item/reagent_containers/food/snacks/store/Initialize()
+ . = ..()
+ AddComponent(/datum/component/food_storage)
/obj/item/reagent_containers/food/snacks/MouseDrop(atom/over)
var/turf/T = get_turf(src)
diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm
index 9567690dc71c..4f5f06379927 100644
--- a/code/modules/food_and_drinks/food/snacks/dough.dm
+++ b/code/modules/food_and_drinks/food/snacks/dough.dm
@@ -7,7 +7,7 @@
desc = "A piece of dough."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "dough"
- cooked_type = /obj/item/reagent_containers/food/snacks/store/bread/plain
+ cooked_type = /obj/item/food/bread/plain
list_reagents = list(/datum/reagent/consumable/nutriment = 6)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("dough" = 1)
@@ -82,7 +82,7 @@
desc = "Cook it to get a cake."
icon = 'icons/obj/food/food_ingredients.dmi'
icon_state = "cakebatter"
- cooked_type = /obj/item/reagent_containers/food/snacks/store/cake/plain
+ cooked_type = /obj/item/food/cake/plain
list_reagents = list(/datum/reagent/consumable/nutriment = 9)
w_class = WEIGHT_CLASS_NORMAL
tastes = list("batter" = 1)
diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
deleted file mode 100644
index 13342a968900..000000000000
--- a/code/modules/food_and_drinks/food/snacks_bread.dm
+++ /dev/null
@@ -1,302 +0,0 @@
-
-/obj/item/reagent_containers/food/snacks/store/bread
- icon = 'icons/obj/food/burgerbread.dmi'
- volume = 80
- slices_num = 5
- tastes = list("bread" = 10)
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/store/bread/Initialize()
- . = ..()
- AddElement(/datum/element/dunkable, 10)
-
-/obj/item/reagent_containers/food/snacks/breadslice
- icon = 'icons/obj/food/burgerbread.dmi'
- bitesize = 2
- custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich
- filling_color = "#FFA500"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2)
- slot_flags = ITEM_SLOT_HEAD
- customfoodfilling = 0 //to avoid infinite bread-ception
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/breadslice/Initialize()
- . = ..()
- AddElement(/datum/element/dunkable, 10)
-
-/obj/item/reagent_containers/food/snacks/store/bread/plain
- name = "bread"
- desc = "Some plain old earthen bread."
- icon_state = "bread"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 7)
- list_reagents = list(/datum/reagent/consumable/nutriment = 10)
- custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/bread
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/plain
- tastes = list("bread" = 10)
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/breadslice/plain
- name = "bread slice"
- desc = "A slice of home."
- icon_state = "breadslice"
- customfoodfilling = 1
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/breadslice/moldy
- name = "moldy bread slice"
- desc = "Entire stations have been ripped apart over arguing whether this is still good to eat."
- icon_state = "moldybreadslice"
- customfoodfilling = 0
- bonus_reagents = list(/datum/reagent/consumable/mold = 10)
- tastes = list("decaying fungus" = 1)
- foodtype = GROSS
-
-/obj/item/reagent_containers/food/snacks/store/bread/meat
- name = "meatbread loaf"
- desc = "The culinary base of every self-respecting eloquen/tg/entleman."
- icon_state = "meatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/meat
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "meat" = 10)
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/breadslice/meat
- name = "meatbread slice"
- desc = "A slice of delicious meatbread."
- icon_state = "meatbreadslice"
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/store/bread/xenomeat
- name = "xenomeatbread loaf"
- desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical."
- icon_state = "xenomeatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/xenomeat
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "acid" = 10)
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/breadslice/xenomeat
- name = "xenomeatbread slice"
- desc = "A slice of delicious meatbread. Extra Heretical."
- icon_state = "xenobreadslice"
- filling_color = "#32CD32"
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/store/bread/spidermeat
- name = "spider meat loaf"
- desc = "Reassuringly green meatloaf made from spider meat."
- icon_state = "spidermeatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/spidermeat
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "cobwebs" = 5)
- foodtype = GRAIN | MEAT | TOXIC
-
-/obj/item/reagent_containers/food/snacks/breadslice/spidermeat
- name = "spider meat bread slice"
- desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
- icon_state = "spiderbreadslice"
- filling_color = "#7CFC00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtype = GRAIN | MEAT | TOXIC
-
-/obj/item/reagent_containers/food/snacks/store/bread/banana
- name = "banana-nut bread"
- desc = "A heavenly and filling treat."
- icon_state = "bananabread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/banana
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/banana = 20)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/banana = 20)
- tastes = list("bread" = 10) // bananjuice will also flavour
- foodtype = GRAIN | FRUIT
-
-
-/obj/item/reagent_containers/food/snacks/breadslice/banana
- name = "banana-nut bread slice"
- desc = "A slice of delicious banana bread."
- icon_state = "bananabreadslice"
- filling_color = "#FFD700"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4)
- foodtype = GRAIN | FRUIT
-
-/obj/item/reagent_containers/food/snacks/store/bread/tofu
- name = "Tofubread"
- desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
- icon_state = "tofubread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/tofu
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "tofu" = 10)
- foodtype = GRAIN | VEGETABLES
-
-/obj/item/reagent_containers/food/snacks/breadslice/tofu
- name = "tofubread slice"
- desc = "A slice of delicious tofubread."
- icon_state = "tofubreadslice"
- filling_color = "#FF8C00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtype = GRAIN | VEGETABLES
-
-/obj/item/reagent_containers/food/snacks/store/bread/creamcheese
- name = "cream cheese bread"
- desc = "Yum yum yum!"
- icon_state = "creamcheesebread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/creamcheese
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "cheese" = 10)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/breadslice/creamcheese
- name = "cream cheese bread slice"
- desc = "A slice of yum!"
- icon_state = "creamcheesebreadslice"
- filling_color = "#FF8C00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/bread/mimana
- name = "mimana bread"
- desc = "Best eaten in silence."
- icon_state = "mimanabread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice/mimana
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("bread" = 10, "silence" = 10)
- foodtype = GRAIN | FRUIT
-
-/obj/item/reagent_containers/food/snacks/breadslice/mimana
- name = "mimana bread slice"
- desc = "A slice of silence!"
- icon_state = "mimanabreadslice"
- filling_color = "#C0C0C0"
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- foodtype = GRAIN | FRUIT
-
-/obj/item/reagent_containers/food/snacks/breadslice/custom
- name = "bread slice"
- icon_state = "tofubreadslice"
- filling_color = "#FFFFFF"
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/baguette
- name = "baguette"
- desc = "Bon appetit!"
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "baguette"
- item_state = "baguette"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
- bitesize = 3
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT
- attack_verb = list("touche'd")
- tastes = list("bread" = 1)
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/garlicbread
- name = "garlic bread"
- desc = "Alas, it is limited."
- icon = 'icons/obj/food/burgerbread.dmi'
- icon_state = "garlicbread"
- item_state = "garlicbread"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/garlic = 2)
- bitesize = 3
- tastes = list("bread" = 1, "garlic" = 1, "butter" = 1)
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/deepfryholder
- name = "Deep Fried Foods Holder Obj"
- desc = "If you can see this description the code for the deep fryer fucked up."
- icon = 'icons/obj/food/food.dmi'
- icon_state = ""
- bitesize = 2
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried)
- . = ..()
- name = fried.name //We'll determine the other stuff when it's actually removed
- appearance = fried.appearance
- layer = initial(layer)
- plane = initial(plane)
- lefthand_file = fried.lefthand_file
- righthand_file = fried.righthand_file
- item_state = fried.item_state
- desc = fried.desc
- w_class = fried.w_class
- slowdown = fried.slowdown
- equip_delay_self = fried.equip_delay_self
- equip_delay_other = fried.equip_delay_other
- strip_delay = fried.strip_delay
- species_exception = fried.species_exception
- item_flags = fried.item_flags
- obj_flags = fried.obj_flags
- inhand_x_dimension = fried.inhand_x_dimension
- inhand_y_dimension = fried.inhand_y_dimension
-
- if(istype(fried, /obj/item/reagent_containers/food/snacks))
- fried.reagents.trans_to(src, fried.reagents.total_volume)
- qdel(fried)
- else
- fried.forceMove(src)
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy()
- if(contents)
- QDEL_LIST(contents)
- . = ..()
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater)
- if(contents)
- QDEL_LIST(contents)
- ..()
-
-/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30)
- switch(cook_time)
- if(0 to 15)
- add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
- name = "lightly-fried [name]"
- desc = "[desc] It's been lightly fried in a deep fryer."
- if(16 to 49)
- add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
- name = "fried [name]"
- desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
- if(50 to 59)
- add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
- name = "deep-fried [name]"
- desc = "[desc] Deep-fried to perfection."
- if(60 to INFINITY)
- add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
- name = "\proper the physical manifestation of the very concept of fried foods"
- desc = "A heavily-fried...something. Who can tell anymore?"
- filling_color = color
- foodtype |= FRIED
-
-/obj/item/reagent_containers/food/snacks/butterbiscuit
- name = "butter biscuit"
- desc = "Well butter my biscuit!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "butterbiscuit"
- filling_color = "#F0E68C"
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("butter" = 1, "biscuit" = 1)
- foodtype = GRAIN | BREAKFAST
-
-/obj/item/reagent_containers/food/snacks/butterdog
- name = "butterdog"
- desc = "Made from exotic butters."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "butterdog"
- bitesize = 1
- filling_color = "#F1F49A"
- list_reagents = list(/datum/reagent/consumable/nutriment = 5)
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("butter", "exotic butter")
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/slippery, 80)
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
deleted file mode 100644
index d6f6151d47ac..000000000000
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ /dev/null
@@ -1,431 +0,0 @@
-/obj/item/reagent_containers/food/snacks/store/cake
- icon = 'icons/obj/food/piecake.dmi'
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/plain
- slices_num = 5
- bitesize = 3
- volume = 80
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("cake" = 1)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/cakeslice
- icon = 'icons/obj/food/piecake.dmi'
- trash = /obj/item/trash/plate
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1)
- customfoodfilling = 0 //to avoid infinite cake-ception
- tastes = list("cake" = 1)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/cake/plain
- name = "plain cake"
- desc = "A plain cake, not a lie."
- icon_state = "plaincake"
- custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/cake
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
- tastes = list("sweetness" = 2,"cake" = 5)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/plain
- name = "plain cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "plaincake_slice"
- filling_color = "#FFD700"
- customfoodfilling = 1
- tastes = list("sweetness" = 2,"cake" = 5)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/carrot
- name = "carrot cake"
- desc = "A favorite desert of a certain wascally wabbit. Not a lie."
- icon_state = "carrotcake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/carrot
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/oculine = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
- foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/carrot
- name = "carrot cake slice"
- desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
- icon_state = "carrotcake_slice"
- filling_color = "#FFA500"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/oculine = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
- foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/brain
- name = "brain cake"
- desc = "A squishy cake-thing."
- icon_state = "braincake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brain
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/brain
- name = "brain cake slice"
- desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
- icon_state = "braincakeslice"
- filling_color = "#FF69B4"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1)
- foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/cheese
- name = "cheese cake"
- desc = "DANGEROUSLY cheesy."
- icon_state = "cheesecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/cheese
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 4, "cream cheese" = 3)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/cakeslice/cheese
- name = "cheese cake slice"
- desc = "Slice of pure cheestisfaction."
- icon_state = "cheesecake_slice"
- filling_color = "#FFFACD"
- tastes = list("cake" = 4, "cream cheese" = 3)
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/cake/orange
- name = "orange cake"
- desc = "A cake with added orange."
- icon_state = "orangecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/orange
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/orange
- name = "orange cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "orangecake_slice"
- filling_color = "#FFA500"
- tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/lime
- name = "lime cake"
- desc = "A cake with added lime."
- icon_state = "limecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lime
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/lime
- name = "lime cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "limecake_slice"
- filling_color = "#00FF00"
- tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/lemon
- name = "lemon cake"
- desc = "A cake with added lemon."
- icon_state = "lemoncake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lemon
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/lemon
- name = "lemon cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "lemoncake_slice"
- filling_color = "#FFEE00"
- tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/chocolate
- name = "chocolate cake"
- desc = "A cake with added chocolate."
- icon_state = "chocolatecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/chocolate
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/chocolate
- name = "chocolate cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "chocolatecake_slice"
- filling_color = "#A0522D"
- tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
- foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday
- name = "birthday cake"
- desc = "Happy Birthday little clown..."
- icon_state = "birthdaycake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
- list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("cake" = 5, "sweetness" = 1)
- foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club
- new /obj/item/clothing/head/hardhat/cakehat(get_turf(src))
- qdel(src)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday
- name = "birthday cake slice"
- desc = "A slice of your birthday."
- icon_state = "birthdaycakeslice"
- filling_color = "#DC143C"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- tastes = list("cake" = 5, "sweetness" = 1)
- foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy
- name = "energy cake"
- desc = "Just enough calories for a whole nuclear operative squad."
- icon_state = "energycake"
- force = 5
- hitsound = 'sound/weapons/blade1.ogg'
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy
- list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/pacfuel = 10, /datum/reagent/consumable/liquidelectricity = 10)
- tastes = list("cake" = 3, "a Vlad's Salad" = 1)
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/proc/energy_bite(mob/living/user)
- to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!")
- user.apply_damage(30,BRUTE,BODY_ZONE_HEAD)
- playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/attack(mob/living/M, mob/living/user)
- . = ..()
- if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly
- return
- energy_bite(M, user)
-
-/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club
- new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src))
- qdel(src)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy
- name = "energy cake slice"
- desc = "For the traitor on the go."
- icon_state = "energycakeslice"
- force = 2
- hitsound = 'sound/weapons/blade1.ogg'
- filling_color = "#00FF00"
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/pacfuel = 2, /datum/reagent/consumable/liquidelectricity = 2)
- tastes = list("cake" = 3, "a Vlad's Salad" = 1)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
- to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!")
- user.apply_damage(18,BRUTE,BODY_ZONE_HEAD)
- playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/attack(mob/living/M, mob/living/user)
- . = ..()
- if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly
- return
- energy_bite(M, user)
-
-/obj/item/reagent_containers/food/snacks/store/cake/apple
- name = "apple cake"
- desc = "A cake centred with Apple."
- icon_state = "applecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/apple
- slices_num = 5
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10)
- tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/apple
- name = "apple cake slice"
- desc = "A slice of heavenly cake."
- icon_state = "applecakeslice"
- filling_color = "#FF4500"
- tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/custom
- name = "cake slice"
- icon_state = "plaincake_slice"
- filling_color = "#FFFFFF"
- foodtype = GRAIN | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/cake/slimecake
- name = "Slime cake"
- desc = "A cake made of slimes. Probably not electrified."
- icon_state = "slimecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/slimecake
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
- tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/slimecake
- name = "slime cake slice"
- desc = "A slice of slime cake."
- icon_state = "slimecake_slice"
- filling_color = "#00FFFF"
- tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
- name = "pumpkin spice cake"
- desc = "A hollow cake with real pumpkin."
- icon_state = "pumpkinspicecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 5)
- tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
- foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice
- name = "pumpkin spice cake slice"
- desc = "A spicy slice of pumpkin goodness."
- icon_state = "pumpkinspicecakeslice"
- filling_color = "#FFD700"
- tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
- foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake
- name = "blackberry and strawberry vanilla cake"
- desc = "A plain cake, filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_vanilla_cake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4)
- tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/bsvc
- name = "blackberry and strawberry vanilla cake slice"
- desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_vanilla_slice"
- filling_color = "#FFD700"
- tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake
- name = "blackberry and strawberry chocolate cake"
- desc = "A chocolate cake, filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_coco_cake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/coco = 5)
- tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/bscc
- name = "blackberry and strawberry chocolate cake slice"
- desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon_state = "blackbarry_strawberries_cake_coco_slice"
- filling_color = "#FFD700"
- tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/holy_cake
- name = "angel food cake"
- desc = "A cake made for angels and chaplains alike! Contains holy water."
- icon_state = "holy_cake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/water/holywater = 10)
- tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
- name = "angel food cake slice"
- desc = "A slice of heavenly cake."
- icon_state = "holy_cake_slice"
- filling_color = "#00FFFF"
- tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
- foodtype = GRAIN | DAIRY | SUGAR
-
-/obj/item/reagent_containers/food/snacks/store/cake/pound_cake
- name = "pound cake"
- desc = "A condensed cake made for filling people up quickly."
- icon_state = "pound_cake"
- slices_num = 7 //Its ment to feed the party
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 60)
- tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
- foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
-
-/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
- name = "pound cake slice"
- desc = "A slice of condensed cake made for filling people up quickly."
- icon_state = "pound_cake_slice"
- filling_color = "#00FFFF"
- tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
- foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
-
-/obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
- name = "hardware cake"
- desc = "A quote on quote cake that is made with electronic boards and leaks acid..."
- icon_state = "hardware_cake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
- bonus_reagents = list(/datum/reagent/toxin/acid = 15, /datum/reagent/fuel/oil = 15)
- tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
- foodtype = GRAIN | GROSS
-
-/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
- name = "hardware cake slice"
- desc = "A slice of electronic boards and some acid."
- icon_state = "hardware_cake_slice"
- filling_color = "#00FFFF"
- tastes = list("acid" = 3, "metal" = 4, "glass" = 5)
- foodtype = GRAIN | GROSS
-
-/obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
- name = "vanilla cake"
- desc = "A vanilla frosted cake."
- icon_state = "vanillacake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
- bonus_reagents = list(/datum/reagent/consumable/sugar = 15, /datum/reagent/consumable/vanilla = 15)
- tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
- foodtype = GRAIN | SUGAR | DAIRY
-
-/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
- name = "vanilla cake slice"
- desc = "A slice of vanilla frosted cake."
- icon_state = "vanillacake_slice"
- filling_color = "#00FFFF"
- tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
- foodtype = GRAIN | SUGAR | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/cake/clown_cake
- name = "clown cake"
- desc = "A funny cake with a clown face on it."
- icon_state = "clowncake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
- bonus_reagents = list(/datum/reagent/consumable/sugar = 15)
- tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
- foodtype = GRAIN | SUGAR | DAIRY
-
-/obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
- name = "clown cake slice"
- desc = "A slice of bad jokes, and silly props."
- icon_state = "clowncake_slice"
- filling_color = "#00FFFF"
- tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
- foodtype = GRAIN | SUGAR | DAIRY
-
-/obj/item/reagent_containers/food/snacks/store/cake/trumpet
- name = "spaceman's cake"
- desc = "A spaceman's trumpet frosted cake."
- icon_state = "trumpetcake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/trumpet
- bonus_reagents = list(/datum/reagent/medicine/polypyr = 15, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/berryjuice = 5)
- filling_color = "#7A3D80"
- tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
-/obj/item/reagent_containers/food/snacks/cakeslice/trumpet
- name = "spaceman's cake"
- desc = "A spaceman's trumpet frosted cake."
- icon_state = "trumpetcakeslice"
- filling_color = "#7A3D80"
- tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index 360053c28ca4..665d94e1fa9b 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -10,6 +10,8 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 4, "sweetness" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/egg
name = "egg"
@@ -18,7 +20,8 @@
list_reagents = list(/datum/reagent/consumable/eggyolk = 5)
cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg
filling_color = "#F0E68C"
- foodtype = MEAT
+ foodtype = MEAT | RAW
+ w_class = WEIGHT_CLASS_TINY
grind_results = list()
var/static/chick_count = 0 //I copied this from the chicken_count (note the "en" in there) variable from chicken code.
@@ -106,6 +109,8 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("egg" = 1)
foodtype = MEAT | BREAKFAST
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/omelette //FUCK THIS
name = "omelette du fromage"
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index e35cb7eeb5fe..d79b91507c1b 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -8,20 +8,24 @@
desc = "Portable Ice-cream in its own packaging."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "icecreamsandwich"
+ w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/ice = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
tastes = list("ice cream" = 1)
foodtype = GRAIN | DAIRY | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/strawberryicecreamsandwich
name = "strawberry ice cream sandwich"
desc = "Portable ice-cream in its own packaging of the strawberry variety."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "strawberryicecreamsandwich"
+ w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2)
tastes = list("ice cream" = 2, "berry" = 2)
foodtype = FRUIT | DAIRY | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/spacefreezy
@@ -29,6 +33,7 @@
desc = "The best icecream in space."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "spacefreezy"
+ w_class = WEIGHT_CLASS_TINY
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bluecherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 4)
filling_color = "#87CEFA"
@@ -40,6 +45,7 @@
desc = "A classic dessert."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "sundae"
+ w_class = WEIGHT_CLASS_SMALL
bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
filling_color = "#FFFACD"
@@ -66,12 +72,14 @@
desc = "It's just shaved ice. Still fun to chew on."
icon = 'icons/obj/food/frozen_treats.dmi'
icon_state = "flavorless_sc"
+ w_class = WEIGHT_CLASS_SMALL
trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water
list_reagents = list(/datum/reagent/water = 1) // We dont get food for water/juices
filling_color = "#FFFFFF" //Ice is white
tastes = list("ice" = 1, "water" = 1)
foodtype = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit
+ /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/snowcones/lime
name = "lime snowcone"
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index 510130ce08be..c088b2259610 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -211,6 +211,8 @@
filling_color = "#800000"
tastes = list("meat" = 1)
foodtype = MEAT
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/sausage
name = "sausage"
@@ -223,6 +225,7 @@
slices_num = 6
slice_path = /obj/item/reagent_containers/food/snacks/salami
foodtype = MEAT | BREAKFAST
+ /*food_flags = FOOD_FINGER_FOOD*/
var/roasted = FALSE
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
@@ -266,6 +269,8 @@
filling_color = "#CD853F"
tastes = list("the jungle" = 1, "bananas" = 1)
foodtype = MEAT | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
var/faction
var/spawned_mob = /mob/living/carbon/monkey
custom_price = 300
@@ -359,6 +364,8 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
tastes = list("\"chicken\"" = 1)
foodtype = MEAT
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/nugget/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 1eca7970a517..0e55d21b3505 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -37,7 +37,9 @@
filling_color = "#FF1493"
tastes = list("watermelon" = 1)
foodtype = FRUIT
+ /*food_flags = FOOD_FINGER_FOOD*/
juice_results = list(/datum/reagent/consumable/watermelonjuice = 5)
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/candy_corn
name = "candy corn"
@@ -47,6 +49,8 @@
filling_color = "#FF8C00"
tastes = list("candy corn" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/candy_corn/prison
name = "desiccated candy corn"
@@ -64,6 +68,8 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/hugemushroomslice
name = "huge mushroom slice"
@@ -179,6 +185,8 @@
list_reagents = list(/datum/reagent/toxin/minttoxin = 2)
filling_color = "#800000"
foodtype = TOXIC | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/eggwrap
name = "egg wrap"
@@ -216,6 +224,8 @@
filling_color = "#00800"
tastes = list("cobwebs" = 1, "sugar" = 2)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/chococoin
name = "chocolate coin"
@@ -226,6 +236,8 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/fudgedice
name = "fudge dice"
@@ -237,6 +249,8 @@
trash = /obj/item/dice/fudge
tastes = list("fudge" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/chocoorange
name = "chocolate orange"
@@ -247,6 +261,8 @@
filling_color = "#A0522D"
tastes = list("chocolate" = 3, "oranges" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/eggplantparm
name = "eggplant parmigiana"
@@ -391,6 +407,8 @@
filling_color = "#F2CE91"
tastes = list("oats" = 3, "nuts" = 2, "honey" = 1)
foodtype = GRAIN | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/stuffedlegion
name = "stuffed legion"
@@ -471,6 +489,8 @@
next_succ = 0
tastes = list("candy" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/chewable/lollipop/Initialize()
. = ..()
@@ -507,6 +527,7 @@
name = "bubblegum"
desc = "A rubbery strip of gum. Not exactly filling, but it keeps you busy."
icon_state = "bubblegum"
+ supports_variations = VOX_VARIATION
item_state = "bubblegum"
color = "#E48AB5" // craftable custom gums someday?
list_reagents = list(/datum/reagent/consumable/sugar = 5)
@@ -561,6 +582,8 @@
list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/bicaridine = 2, /datum/reagent/medicine/kelotane = 2) //Kek
tastes = list("candy")
foodtype = JUNKFOOD
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/gumball/Initialize()
. = ..()
@@ -641,6 +664,7 @@
desc = "delicious, golden, fatty goodness on a stick."
icon_state = "butteronastick"
trash = /obj/item/stack/rods
+ /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/onionrings
name = "onion rings"
@@ -651,6 +675,7 @@
gender = PLURAL
tastes = list("batter" = 3, "onion" = 1)
foodtype = VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/pineappleslice
name = "pineapple slice"
@@ -660,6 +685,7 @@
juice_results = list(/datum/reagent/consumable/pineapplejuice = 3)
tastes = list("pineapple" = 1)
foodtype = FRUIT | PINEAPPLE
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/tinychocolate
name = "chocolate"
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index ee0dd7ab58de..7cb9f05900ba 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -13,6 +13,8 @@
filling_color = "#D2691E"
tastes = list("donut" = 1)
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
var/decorated_icon = "donut_homer"
var/is_decorated = FALSE
var/extra_reagent = null
@@ -336,6 +338,8 @@
filling_color = "#F4A460"
tastes = list("muffin" = 1)
foodtype = GRAIN | SUGAR | BREAKFAST
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/muffin/berry
name = "berry muffin"
@@ -420,6 +424,8 @@
filling_color = "#CD853F"
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtype = GRAIN
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/donkpocket/warm
name = "warm Donk-pocket"
@@ -565,6 +571,8 @@
filling_color = "#F0E68C"
tastes = list("cookie" = 1)
foodtype = GRAIN | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/cookie/Initialize()
. = ..()
@@ -583,6 +591,8 @@
filling_color = "#F4A460"
tastes = list("cookie" = 1)
foodtype = GRAIN | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/fortunecookie/proc/get_fortune()
var/atom/drop_location = drop_location()
@@ -613,6 +623,8 @@
filling_color = "#F0E68C"
tastes = list("pretzel" = 1)
foodtype = GRAIN | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
name = "plump helmet biscuit"
@@ -623,6 +635,8 @@
filling_color = "#F0E68C"
tastes = list("mushroom" = 1, "biscuit" = 1)
foodtype = GRAIN | VEGETABLES
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize()
var/fey = prob(10)
@@ -644,6 +658,8 @@
filling_color = "#F0E68C"
tastes = list("cracker" = 1)
foodtype = GRAIN
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/hotdog
name = "hotdog"
@@ -732,21 +748,19 @@
name = "cherry cupcake"
desc = "A sweet cupcake with cherry bits."
icon_state = "cherrycupcake"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
filling_color = "#F0E68C"
tastes = list("cake" = 3, "cherry" = 1)
foodtype = GRAIN | FRUIT | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
-/obj/item/reagent_containers/food/snacks/bluecherrycupcake
+/obj/item/reagent_containers/food/snacks/cherrycupcake/blue
name = "blue cherry cupcake"
desc = "Blue cherries inside a delicious cupcake."
icon_state = "bluecherrycupcake"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3)
- list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1)
- filling_color = "#F0E68C"
tastes = list("cake" = 3, "blue cherry" = 1)
- foodtype = GRAIN | FRUIT | SUGAR
/obj/item/reagent_containers/food/snacks/honeybun
name = "honey bun"
diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
index c15a6606be97..169d208bf30d 100644
--- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
@@ -9,6 +9,8 @@
cooked_type = /obj/item/reagent_containers/food/snacks/toastedsandwich
tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1)
foodtype = GRAIN | VEGETABLES
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/toastedsandwich
name = "toasted sandwich"
@@ -31,6 +33,8 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("toast" = 1, "cheese" = 1)
foodtype = GRAIN | DAIRY
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/jellysandwich
name = "jelly sandwich"
diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
deleted file mode 100644
index 88c1188f1dee..000000000000
--- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm
+++ /dev/null
@@ -1,106 +0,0 @@
-
-/obj/item/reagent_containers/food/snacks/spaghetti
- name = "spaghetti"
- desc = "Now that's a nic'e pasta!"
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- icon_state = "spaghetti"
- list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- cooked_type = /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti
- filling_color = "#F0E68C"
- tastes = list("pasta" = 1)
- foodtype = GRAIN
-
-/obj/item/reagent_containers/food/snacks/spaghetti/Initialize()
- . = ..()
- if(!cooked_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket?
- var/list/display_message = list(
- "Something wet falls out of their pocket and hits the ground. Is that... [name]?",
- "Oh shit! All your pocket [name] fell out!")
- AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg')
-
-/obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti
- name = "boiled spaghetti"
- desc = "A plain dish of noodles, this needs more ingredients."
- icon_state = "spaghettiboiled"
- trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2)
- list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1)
- cooked_type = null
- custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pasta
-
-/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato
- name = "spaghetti"
- desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
- icon_state = "pastatomato"
- trash = /obj/item/trash/plate
- bitesize = 4
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4)
- cooked_type = null
- filling_color = "#DC143C"
- tastes = list("pasta" = 1, "tomato" = 1)
- foodtype = GRAIN | VEGETABLES
-
-/obj/item/reagent_containers/food/snacks/spaghetti/copypasta
- name = "copypasta"
- desc = "You probably shouldn't try this, you always hear people talking about how bad it is..."
- icon_state = "copypasta"
- trash = /obj/item/trash/plate
- bitesize = 4
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8)
- cooked_type = null
- filling_color = "#DC143C"
- tastes = list("pasta" = 1, "tomato" = 1)
- foodtype = GRAIN | VEGETABLES
-
-/obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti
- name = "spaghetti and meatballs"
- desc = "Now that's a nic'e meatball!"
- icon_state = "meatballspaghetti"
- trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4)
- cooked_type = null
- tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/spaghetti/spesslaw
- name = "spesslaw"
- desc = "A lawyers favourite."
- icon_state = "spesslaw"
- trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6)
- cooked_type = null
- tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1)
-
-/obj/item/reagent_containers/food/snacks/spaghetti/chowmein
- name = "chow mein"
- desc = "A nice mix of noodles and fried vegetables."
- icon_state = "chowmein"
- trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4)
- list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6)
- cooked_type = null
- tastes = list("noodle" = 1, "tomato" = 1)
-
-/obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle
- name = "beef noodle"
- desc = "Nutritious, beefy and noodly."
- icon_state = "beefnoodle"
- trash = /obj/item/reagent_containers/glass/bowl
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3)
- cooked_type = null
- tastes = list("noodle" = 1, "meat" = 1)
- foodtype = GRAIN | MEAT
-
-/obj/item/reagent_containers/food/snacks/spaghetti/butternoodles
- name = "butter noodles"
- desc = "Noodles covered in savory butter. Simple and slippery, but delicious."
- icon_state = "butternoodles"
- trash = /obj/item/trash/plate
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
- cooked_type = null
- tastes = list("noodle" = 1, "butter" = 1)
- foodtype = GRAIN | DAIRY
diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
index 94477d1932aa..b071add1027a 100644
--- a/code/modules/food_and_drinks/food/snacks_vend.dm
+++ b/code/modules/food_and_drinks/food/snacks_vend.dm
@@ -12,6 +12,8 @@
filling_color = "#D2691E"
tastes = list("candy" = 1)
foodtype = JUNKFOOD | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_TINY
/obj/item/reagent_containers/food/snacks/candy/bronx
name = "South Bronx Paradise bar"
@@ -82,7 +84,9 @@
filling_color = "#8B0000"
tastes = list("dried raisins" = 1)
foodtype = JUNKFOOD | FRUIT | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
custom_price = 90
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/no_raisin/healthy
name = "homemade raisins"
@@ -99,7 +103,9 @@
junkiness = 25
filling_color = "#FFD700"
foodtype = JUNKFOOD | GRAIN | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
custom_price = 30
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/candy_trash
name = "candy cigarette butt"
@@ -136,6 +142,7 @@
filling_color = "#F5F5DC"
tastes = list("sweetness" = 3, "cake" = 1)
foodtype = GRAIN | FRUIT | VEGETABLES
+ w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/snacks/energybar
name = "High-power energy bars"
@@ -146,3 +153,5 @@
filling_color = "#97ee63"
tastes = list("pure electricity" = 3, "fitness" = 2)
foodtype = TOXIC
+ /*food_flags = FOOD_FINGER_FOOD*/
+ w_class = WEIGHT_CLASS_SMALL
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 8eccd04c8404..62e6a4075a93 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -18,6 +18,8 @@
// _- _
// -
+//God bless These Deepfried States o7 -2024
+
/obj/machinery/deepfryer
name = "deep fryer"
desc = "Deep fried everything."
@@ -27,7 +29,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = IDLE_DRAW_LOW
layer = BELOW_OBJ_LAYER
- var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW?
+ var/obj/item/food/deepfryholder/frying //What's being fried RIGHT NOW?
var/cook_time = 0
var/oil_use = 0.05 //How much cooking oil is used per tick
var/fry_speed = 1 //How quickly we fry food
@@ -93,7 +95,7 @@
if(I.resistance_flags & INDESTRUCTIBLE)
to_chat(user, "You don't feel it would be wise to fry [I]...")
return
- if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder))
+ if(istype(I, /obj/item/food/deepfryholder))
to_chat(user, "Your cooking skills are not up to the legendary Doublefry technique.")
return
if(default_unfasten_wrench(user, I))
@@ -105,7 +107,7 @@
return ..()
else if(!frying && user.transferItemToLoc(I, src))
to_chat(user, "You put [I] into [src].")
- frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I)
+ frying = new/obj/item/food/deepfryholder(src, I)
icon_state = "fryer_on"
fry_loop.start()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
index c349c7511752..c150fe94498d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm
@@ -9,7 +9,7 @@
layer = BELOW_OBJ_LAYER
use_power = NO_POWER_USE
var/grill_fuel = 0
- var/obj/item/reagent_containers/food/grilled_item
+ var/obj/item/reagent_containers/food/snacks/grilled_item
var/grill_time = 0
var/datum/looping_sound/grill/grill_loop
@@ -27,68 +27,74 @@
else
icon_state = "grill_open"
return ..()
+
+/obj/machinery/grill/examine(mob/user)
+ . = ..()
+ if(grill_fuel)
+ . += span_notice("\The [src] has [grill_fuel] units of fuel left.")
+ else
+ . += span_warning("\The [src] is out of fuel! Add some wood or coal!")
+
/obj/machinery/grill/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/S = I
var/stackamount = S.get_amount()
- to_chat(user, "You put [stackamount] [I]s in [src].")
+ to_chat(user, span_notice("You put [stackamount] [I]s in [src]."))
if(istype(I, /obj/item/stack/sheet/mineral/coal))
- grill_fuel += (500 * stackamount)
- else
grill_fuel += (50 * stackamount)
+ else
+ grill_fuel += (5 * stackamount)
S.use(stackamount)
update_appearance()
return
if(I.resistance_flags & INDESTRUCTIBLE)
- to_chat(user, "You don't feel it would be wise to grill [I]...")
+ to_chat(user, span_warning("You don't feel it would be wise to grill [I]..."))
return ..()
- if(istype(I, /obj/item/reagent_containers))
- if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks))
- var/obj/item/reagent_containers/food/food_item = I
- if(HAS_TRAIT(food_item, TRAIT_NODROP) || (food_item.item_flags & (ABSTRACT | DROPDEL)))
- return ..()
- else if(food_item.foodtype & GRILLED)
- to_chat(user, "[food_item] has already been grilled!")
- return
- else if(!grill_fuel)
- to_chat(user, "There is not enough fuel!")
- return
- else if(!grilled_item && user.transferItemToLoc(food_item, src))
- grilled_item = food_item
- grilled_item.foodtype |= GRILLED
- to_chat(user, "You put the [grilled_item] on [src].")
- update_appearance()
- grill_loop.start()
- return
- else
- if(I.reagents.has_reagent(/datum/reagent/consumable/xeno_energy))
- grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy)))
- to_chat(user, "You pour the Monkey Energy in [src].")
- I.reagents.remove_reagent(/datum/reagent/consumable/xeno_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/xeno_energy))
- update_appearance()
- return
+
+ if(istype(I, /obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/food_item = I
+ if(HAS_TRAIT(food_item, TRAIT_NODROP) || (food_item.item_flags & (ABSTRACT | DROPDEL)))
+ return ..()
+ else if(food_item.foodtype & GRILLED)
+ to_chat(user, span_notice("[food_item] has already been grilled!"))
+ return
+ else if(grill_fuel <= 0)
+ to_chat(user, span_warning("There is not enough fuel!"))
+ return
+ else if(grilled_item)
+ to_chat(user,span_warning("\The [src] is already grilling something, take it out first!"))
+ return
+ else if(user.transferItemToLoc(food_item, src))
+ START_PROCESSING(SSmachines, src)
+ grilled_item = food_item
+ to_chat(user, span_notice("You put the [grilled_item] on [src]."))
+ update_appearance()
+ grill_loop.start()
+ return
..()
/obj/machinery/grill/process()
..()
+ if(!grilled_item)
+ return PROCESS_KILL
update_appearance()
- if(!grill_fuel)
+ if(grill_fuel <= 0)
+ grill_fuel = 0
+ visible_message(span_warning("\The [src] is out of fuel!"))
+ if(grilled_item)
+ grilled_item.forceMove(loc)
+ finish_grill()
return
- else
- grill_fuel -= 1
- if(prob(1))
- var/datum/effect_system/smoke_spread/bad/smoke = new
- smoke.set_up(1, loc)
- smoke.start()
- if(grilled_item)
- grill_time += 1
- grill_fuel -= 10
- grilled_item.AddComponent(/datum/component/sizzle)
+ grill_time += 1
+ grill_fuel -= 1
+ if(prob(1))
+ var/datum/effect_system/smoke_spread/bad/smoke = new
+ smoke.set_up(1, loc)
+ smoke.start()
/obj/machinery/grill/Exited(atom/movable/AM)
if(AM == grilled_item)
finish_grill()
- grilled_item = null
. = ..()
/obj/machinery/grill/Destroy()
@@ -118,13 +124,15 @@
/obj/machinery/grill/attack_hand(mob/user)
if(grilled_item)
- to_chat(user, "You take out [grilled_item] from [src].")
+ to_chat(user, span_notice("You take out [grilled_item] from [src]."))
grilled_item.forceMove(drop_location())
update_appearance()
return
return ..()
/obj/machinery/grill/proc/finish_grill()
+ if(grill_time >= 10 && grilled_item.cooked_type)
+ grilled_item = grilled_item.microwave_act()
switch(grill_time) //no 0-9 to prevent spam
if(10 to 15)
grilled_item.name = "lightly-grilled [grilled_item.name]"
@@ -141,8 +149,12 @@
grilled_item.name = "Powerfully Grilled [grilled_item.name]"
grilled_item.desc = "A [grilled_item.name]. Reminds you of your wife, wait, no, it's prettier!"
grilled_item.foodtype |= FRIED
+ grilled_item.AddComponent(/datum/component/sizzle, (grill_time * 7.5))
+ grilled_item.foodtype |= GRILLED
grill_time = 0
grill_loop.stop()
+ grilled_item = null
+ update_appearance()
/obj/machinery/grill/unwrenched
anchored = FALSE
diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index 1d4e366ad6d9..de4d844aa3ac 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -210,7 +210,7 @@
return
/obj/item/reagent_containers/food/snacks/icecream
- name = "ice cream cone"
+ name = "waffle cone"
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
@@ -220,6 +220,7 @@
var/cone_type
bitesize = 4
foodtype = DAIRY | SUGAR
+ /*food_flags = FOOD_FINGER_FOOD*/
/obj/item/reagent_containers/food/snacks/icecream/Initialize()
. = ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 2762892110f8..0df04a08658b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -362,7 +362,7 @@
name = "flameless ration heater"
desc = "A magnisium based ration heater. It can be used to heat up entrees and other food items. reaches the same temperature as a microwave with half the volume."
icon = 'icons/obj/food/ration.dmi'
- icon_state = "ration_package"
+ icon_state = "ration_heater"
grind_results = list(/datum/reagent/iron = 10, /datum/reagent/water = 10, /datum/reagent/consumable/sodiumchloride = 5)
heat = 3800
var/obj/item/tocook = null
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 772893e3ff16..b5c4c2c42b85 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -96,7 +96,7 @@
. += tag_overlay
/obj/item/pizzabox/worn_overlays(isinhands, icon_file)
- . = list()
+ . = ..()
var/current_offset = 2
if(isinhands)
for(var/V in boxes) //add EXTRA BOX per box
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 2474d1d53501..9fdacebf8900 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -29,6 +29,7 @@
results = list(/datum/reagent/consumable/ethanol/moonshine = 10)
required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5)
required_catalysts = list(/datum/reagent/consumable/enzyme = 5)
+ required_container = /obj/structure/fermenting_barrel
/datum/chemical_reaction/wine
results = list(/datum/reagent/consumable/ethanol/wine = 10)
diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm
index 98c5fa053c8f..c13983c6792d 100644
--- a/code/modules/food_and_drinks/recipes/processor_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm
@@ -31,7 +31,7 @@
/datum/food_processor_process/spaghetti
input = /obj/item/reagent_containers/food/snacks/doughslice
- output = /obj/item/reagent_containers/food/snacks/spaghetti
+ output = /obj/item/food/spaghetti/raw
/datum/food_processor_process/corn
input = /obj/item/reagent_containers/food/snacks/grown/corn
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index f29e948adf4c..0dec69a393f5 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -6,83 +6,83 @@
/datum/crafting_recipe/food/meatbread
name = "Meat bread"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/meat
+ result = /obj/item/food/bread/meat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/xenomeatbread
name = "Xenomeat bread"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/xenomeat
+ result = /obj/item/food/bread/xenomeat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/spidermeatbread
name = "Spidermeat bread"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet/spider = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/spidermeat
+ result = /obj/item/food/bread/spidermeat
subcategory = CAT_BREAD
/datum/crafting_recipe/food/banananutbread
name = "Banana nut bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/boiledegg = 3,
/obj/item/reagent_containers/food/snacks/grown/banana = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/banana
+ result = /obj/item/food/bread/banana
subcategory = CAT_BREAD
/datum/crafting_recipe/food/tofubread
name = "Tofu bread"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/tofu = 3,
/obj/item/reagent_containers/food/snacks/cheesewedge = 3
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/tofu
+ result = /obj/item/food/bread/tofu
subcategory = CAT_BREAD
/datum/crafting_recipe/food/creamcheesebread
name = "Cream cheese bread"
reqs = list(
/datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/creamcheese
+ result = /obj/item/food/bread/creamcheese
subcategory = CAT_BREAD
/datum/crafting_recipe/food/mimanabread
name = "Mimana bread"
reqs = list(
/datum/reagent/consumable/soymilk = 5,
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/tofu = 3,
/obj/item/reagent_containers/food/snacks/grown/banana/mime = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/bread/mimana
+ result = /obj/item/food/bread/mimana
subcategory = CAT_BREAD
/datum/crafting_recipe/food/garlicbread
name = "Garlic Bread"
time = 40
reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
+ /obj/item/food/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/reagent_containers/food/snacks/garlicbread
+ result = /obj/item/food/garlicbread
subcategory = CAT_BREAD
/datum/crafting_recipe/food/butterbiscuit
@@ -91,7 +91,7 @@
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/reagent_containers/food/snacks/butterbiscuit
+ result = /obj/item/food/butterbiscuit
subcategory = CAT_BREAD
/datum/crafting_recipe/food/butterdog
@@ -100,14 +100,14 @@
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/butter = 3,
)
- result = /obj/item/reagent_containers/food/snacks/butterdog
+ result = /obj/item/food/butterdog
subcategory = CAT_BREAD
/datum/crafting_recipe/food/moldybread // why would you make this?
name = "Moldy Bread"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
+ /obj/item/food/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 1
)
- result = /obj/item/reagent_containers/food/snacks/breadslice/moldy
+ result = /obj/item/food/breadslice/moldy
subcategory = CAT_BREAD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index dcae05095ae8..7a3a4c6837b5 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -6,190 +6,190 @@
/datum/crafting_recipe/food/carrotcake
name = "Carrot cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/carrot = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/carrot
+ result = /obj/item/food/cake/carrot
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cheesecake
name = "Cheese cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/cheese
+ result = /obj/item/food/cake/cheese
subcategory = CAT_CAKE
/datum/crafting_recipe/food/applecake
name = "Apple cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/apple = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/apple
+ result = /obj/item/food/cake/apple
subcategory = CAT_CAKE
/datum/crafting_recipe/food/orangecake
name = "Orange cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/orange = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/orange
+ result = /obj/item/food/cake/orange
subcategory = CAT_CAKE
/datum/crafting_recipe/food/limecake
name = "Lime cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/lime = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/lime
+ result = /obj/item/food/cake/lime
subcategory = CAT_CAKE
/datum/crafting_recipe/food/lemoncake
name = "Lemon cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/lemon
+ result = /obj/item/food/cake/lemon
subcategory = CAT_CAKE
/datum/crafting_recipe/food/chocolatecake
name = "Chocolate cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/chocolate
+ result = /obj/item/food/cake/chocolate
subcategory = CAT_CAKE
/datum/crafting_recipe/food/birthdaycake
name = "Birthday cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/candle = 1,
/datum/reagent/consumable/sugar = 5,
/datum/reagent/consumable/caramel = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/birthday
+ result = /obj/item/food/cake/birthday
subcategory = CAT_CAKE
/datum/crafting_recipe/food/energycake
name = "Energy cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1,
+ /obj/item/food/cake/birthday = 1,
/obj/item/melee/transforming/energy/sword = 1,
)
- blacklist = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy)
- result = /obj/item/reagent_containers/food/snacks/store/cake/birthday/energy
+ blacklist = list(/obj/item/food/cake/birthday/energy)
+ result = /obj/item/food/cake/birthday/energy
subcategory = CAT_CAKE
/datum/crafting_recipe/food/braincake
name = "Brain cake"
reqs = list(
/obj/item/organ/brain = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
+ /obj/item/food/cake/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/brain
+ result = /obj/item/food/cake/brain
subcategory = CAT_CAKE
/datum/crafting_recipe/food/slimecake
name = "Slime cake"
reqs = list(
/obj/item/slime_extract = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
+ /obj/item/food/cake/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/slimecake
+ result = /obj/item/food/cake/slimecake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/pumpkinspicecake
name = "Pumpkin spice cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/pumpkin = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
+ result = /obj/item/food/cake/pumpkinspice
subcategory = CAT_CAKE
/datum/crafting_recipe/food/holycake
name = "Angel food cake"
reqs = list(
/datum/reagent/water/holywater = 15,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
+ /obj/item/food/cake/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake
+ result = /obj/item/food/cake/holy_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/poundcake
name = "Pound cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 4
+ /obj/item/food/cake/plain = 4
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ result = /obj/item/food/cake/pound_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/hardwarecake
name = "Hardware cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/circuitboard = 2,
/datum/reagent/toxin/acid = 5
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
+ result = /obj/item/food/cake/hardware_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/bscccake
name = "blackberry and strawberry chocolate cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 2,
/obj/item/reagent_containers/food/snacks/grown/berries = 5
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
+ result = /obj/item/food/cake/bscc
subcategory = CAT_CAKE
/datum/crafting_recipe/food/bscvcake
name = "blackberry and strawberry vanilla cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/berries = 5
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
+ result = /obj/item/food/cake/bsvc
subcategory = CAT_CAKE
/datum/crafting_recipe/food/clowncake
name = "clown cake"
always_availible = FALSE
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/sundae = 2,
/obj/item/reagent_containers/food/snacks/grown/banana = 5
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake
+ result = /obj/item/food/cake/clown_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/vanillacake
name = "vanilla cake"
always_availible = FALSE
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/vanillapod = 2
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
+ result = /obj/item/food/cake/vanilla_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/trumpetcake
name = "Spaceman's Cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/food/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/trumpet = 2,
/datum/reagent/consumable/cream = 5,
/datum/reagent/consumable/berryjuice = 5
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/trumpet
+ result = /obj/item/food/cake/trumpet
subcategory = CAT_CAKE
@@ -198,7 +198,7 @@
reqs = list(
/obj/item/organ/brain = 1,
/obj/item/organ/heart = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1,
+ /obj/item/food/cake/birthday = 1,
/obj/item/reagent_containers/food/snacks/meat/slab = 3,
/datum/reagent/blood = 30,
/datum/reagent/consumable/sprinkles = 5,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
index 4e0ade4fa22d..96c67eca7a9e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm
@@ -139,7 +139,7 @@
time = 30
reqs = list(
/obj/item/storage/bag/trash = 1,
- /obj/item/reagent_containers/food/snacks/breadslice/moldy = 1,
+ /obj/item/food/breadslice/moldy = 1,
/obj/item/reagent_containers/food/snacks/grown = 4,
/obj/item/reagent_containers/food/snacks/candy_corn = 2,
/datum/reagent/water = 15
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
index 522f362e777e..a4ab818fdd6f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
@@ -36,7 +36,7 @@
reqs = list(
/obj/item/reagent_containers/food/snacks/friedegg = 1,
/obj/item/reagent_containers/food/snacks/meat/steak = 1,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
+ /obj/item/food/breadslice/plain = 1,
)
result = /obj/item/reagent_containers/food/snacks/benedict
subcategory = CAT_EGG
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 1bb3d250a9ae..b1191fda7ada 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -102,7 +102,7 @@
/datum/reagent/consumable/blackpepper = 1,
/obj/item/reagent_containers/food/snacks/pastrybase = 2
)
- result = /obj/item/reagent_containers/food/snacks/baguette
+ result = /obj/item/food/baguette
subcategory = CAT_MISCFOOD
////////////////////////////////////////////////TOAST////////////////////////////////////////////////
@@ -111,7 +111,7 @@
name = "Slime toast"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ /obj/item/food/breadslice/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
subcategory = CAT_MISCFOOD
@@ -120,7 +120,7 @@
name = "Jellied toast"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ /obj/item/food/breadslice/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
subcategory = CAT_MISCFOOD
@@ -128,7 +128,7 @@
/datum/crafting_recipe/food/butteredtoast
name = "Buttered Toast"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1,
+ /obj/item/food/breadslice/plain = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
result = /obj/item/reagent_containers/food/snacks/butteredtoast
@@ -138,7 +138,7 @@
name = "Two bread"
reqs = list(
/datum/reagent/consumable/ethanol/wine = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2
+ /obj/item/food/breadslice/plain = 2
)
result = /obj/item/reagent_containers/food/snacks/twobread
subcategory = CAT_MISCFOOD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index cc61c7048fdc..a1c1297647c3 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -473,7 +473,7 @@
reqs = list(
/datum/reagent/consumable/eggyolk = 5,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1
+ /obj/item/food/bread/plain = 1
)
result = /obj/item/reagent_containers/food/snacks/khachapuri
subcategory = CAT_PASTRY
@@ -575,7 +575,7 @@
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
/obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
)
- result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
+ result = /obj/item/reagent_containers/food/snacks/cherrycupcake/blue
subcategory = CAT_PASTRY
/datum/crafting_recipe/food/honeybun
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 41829e9ec2b8..b8cefcb9bd80 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -9,7 +9,7 @@
/datum/crafting_recipe/food/sandwich
name = "Sandwich"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/meat/steak = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1
)
@@ -19,7 +19,7 @@
/datum/crafting_recipe/food/grilledcheesesandwich
name = "Cheese sandwich"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/cheesewedge = 2
)
result = /obj/item/reagent_containers/food/snacks/grilledcheese
@@ -29,7 +29,7 @@
name = "Jelly sandwich"
reqs = list(
/datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
)
result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime
subcategory = CAT_SANDWICH
@@ -38,7 +38,7 @@
name = "Jelly sandwich"
reqs = list(
/datum/reagent/consumable/cherryjelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
)
result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry
subcategory = CAT_SANDWICH
@@ -46,7 +46,7 @@
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
/obj/item/clothing/mask/fakemoustache = 1
)
result = /obj/item/reagent_containers/food/snacks/notasandwich
@@ -55,7 +55,7 @@
/datum/crafting_recipe/food/blt
name = "BLT"
reqs = list(
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
+ /obj/item/food/breadslice/plain = 2,
/obj/item/reagent_containers/food/snacks/meat/bacon = 2,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 1
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
index 796c360c3448..2ad56d0ce62b 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -6,65 +6,65 @@
/datum/crafting_recipe/food/tomatopasta
name = "Tomato pasta"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 2
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato
+ result = /obj/item/food/spaghetti/pastatomato
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/copypasta
name = "Copypasta"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato = 2
+ /obj/item/food/spaghetti/pastatomato = 2
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/copypasta
+ result = /obj/item/food/spaghetti/copypasta
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/spaghettimeatball
name = "Spaghetti meatball"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meatball = 2
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti
+ result = /obj/item/food/spaghetti/meatballspaghetti
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/spesslaw
name = "Spesslaw"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meatball = 4
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/spesslaw
+ result = /obj/item/food/spaghetti/spesslaw
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/beefnoodle
name = "Beef noodle"
reqs = list(
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle
+ result = /obj/item/food/spaghetti/beefnoodle
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/chowmein
name = "Chowmein"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/grown/cabbage = 2,
/obj/item/reagent_containers/food/snacks/grown/carrot = 1
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/chowmein
+ result = /obj/item/food/spaghetti/chowmein
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/butternoodles
name = "Butter Noodles"
reqs = list(
- /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1,
+ /obj/item/food/spaghetti/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/butter = 1
)
- result = /obj/item/reagent_containers/food/snacks/spaghetti/butternoodles
+ result = /obj/item/food/spaghetti/butternoodles
subcategory = CAT_SPAGHETTI
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 9d88d3107551..2e40c8ed04c6 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -174,36 +174,12 @@
/datum/crafting_recipe/food/hotcrossbun
name = "Hot-Cross Bun"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/datum/reagent/consumable/sugar = 1
)
result = /obj/item/reagent_containers/food/snacks/hotcrossbun
subcategory = CAT_MISCFOOD
-
-/obj/item/reagent_containers/food/snacks/store/cake/brioche
- name = "brioche cake"
- desc = "A ring of sweet, glazed buns."
- icon_state = "briochecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche
- slices_num = 6
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/brioche
- name = "brioche cake slice"
- desc = "Delicious sweet-bread. Who needs anything else?"
- icon_state = "briochecake_slice"
- filling_color = "#FFD700"
-
-/datum/crafting_recipe/food/briochecake
- name = "Brioche cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /datum/reagent/consumable/sugar = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/brioche
- subcategory = CAT_MISCFOOD
-
/obj/item/reagent_containers/food/snacks/scotchegg
name = "scotch egg"
desc = "A boiled egg wrapped in a delicious, seasoned meatball."
@@ -234,7 +210,7 @@
/datum/crafting_recipe/food/mammi
name = "Mammi"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/food/bread/plain = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 1,
/datum/reagent/consumable/milk = 5
)
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 022b3278e92b..490742d7cdf7 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -271,9 +271,8 @@
hitsound = 'sound/items/bikehorn.ogg'
/obj/item/choice_beacon/music
- name = "instrument delivery beacon"
- desc = "Summon your tool of art."
- icon_state = "gangtool-red"
+ name = "instrument box"
+ desc = "Contains your tool of art."
/obj/item/choice_beacon/music/generate_display_names()
var/static/list/instruments
@@ -299,9 +298,8 @@
return instruments
/obj/item/choice_beacon/rnd
- name = "C.R.E.W.M.A.T.E type R&D Choice Beacon"
- desc = "This aging launch beacon summons a limited production RND package from a nearby orbital satellite, delivered via impact pod."
- icon_state = "gangtool-sus"
+ name = "C.R.E.W.M.A.T.E type R&D box"
+ desc = "This box contains a limited production RND package."
/obj/item/choice_beacon/rnd/generate_display_names()
var/static/list/rndboxes
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 39eb08749872..d11bb6177e14 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -368,15 +368,15 @@
if(ACCESS_NETWORK)
return "Network Access"
if(ACCESS_MECH_MINING)
- return "Mining Mech Access"
+ return "Mining Exosuit Access"
if(ACCESS_MECH_MEDICAL)
- return "Medical Mech Access"
+ return "Medical Exosuit Access"
if(ACCESS_MECH_SECURITY)
- return "Security Mech Access"
+ return "Security Exosuit Access"
if(ACCESS_MECH_SCIENCE)
- return "Science Mech Access"
+ return "Science Exosuit Access"
if(ACCESS_MECH_ENGINE)
- return "Engineering Mech Access"
+ return "Engineering Exosuit Access"
//WS Begin
if(ACCESS_CLONING)
diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm
index e9ac7662edab..2040764eefb9 100644
--- a/code/modules/mapping/mapping_helpers.dm
+++ b/code/modules/mapping/mapping_helpers.dm
@@ -281,7 +281,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
if(length(table))
var/turf/food_turf = get_turf(pick(table))
new /obj/item/kitchen/knife(food_turf)
- var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf)
+ var/obj/item/food/cake/birthday/iancake = new(food_turf)
iancake.desc = "Happy birthday, Ian!"
//some balloons! this picks an open turf and pops a few balloons in and around that turf, yay.
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e48f4d5af5aa..a2b48d9319b9 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -1103,7 +1103,7 @@
C.update_inv_wear_suit()
/obj/item/clothing/suit/armor/ascetic/worn_overlays(isinhands)
- . = list()
+ . = ..()
if(!isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER - 0.01)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 77e2045e357c..aab8b681bf50 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -26,25 +26,8 @@
return 0
return ..()
-/mob/living/carbon/human/experience_pressure_difference(pressure_difference)
- if(pressure_difference > 100)
- playsound_local(null, 'sound/effects/space_wind_big.ogg', clamp(pressure_difference / 50, 10, 100), 1)
- else
- playsound_local(null, 'sound/effects/space_wind.ogg', clamp(pressure_difference, 10, 100), 1)
- if(shoes && istype(shoes, /obj/item/clothing))
- var/obj/item/clothing/S = shoes
- if((S.clothing_flags & NOSLIP))
- return 0
- return ..()
-
-/mob/living/carbon/human/mob_has_gravity()
- . = ..()
- if(!.)
- if(mob_negates_gravity())
- . = 1
-
/mob/living/carbon/human/mob_negates_gravity()
- return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src)))
+ return dna.species.negates_gravity(src) || ..()
/mob/living/carbon/human/Move(NewLoc, direct)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 756af00f1839..25e045064a44 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -334,7 +334,8 @@
if(equip_to_slot_if_possible(thing, slot_type))
update_inv_hands()
return
- if(!SEND_SIGNAL(equipped_item, COMSIG_CONTAINS_STORAGE)) // not a storage item
+ var/datum/component/storage/storage = equipped_item.GetComponent(/datum/component/storage)
+ if(!storage)
if(!thing)
equipped_item.attack_hand(src)
else
@@ -344,10 +345,11 @@
if(!SEND_SIGNAL(equipped_item, COMSIG_TRY_STORAGE_INSERT, thing, src))
to_chat(src, "You can't fit [thing] into your [equipped_item.name]!")
return
- if(!equipped_item.contents.len) // nothing to take out
+ var/atom/real_location = storage.real_location()
+ if(!real_location.contents.len) // nothing to take out
to_chat(src, "There's nothing in your [equipped_item.name] to take out!")
return
- var/obj/item/stored = equipped_item.contents[equipped_item.contents.len]
+ var/obj/item/stored = real_location.contents[real_location.contents.len]
if(!stored || stored.on_found(src))
return
stored.attack_hand(src) // take out thing from item in storage slot
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 730001819de4..18b6cb9ba40e 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -61,6 +61,21 @@
return ONE_ATMOSPHERE
return pressure
+/mob/living/carbon/human/proc/check_for_seal()
+ var/obj/item/clothing/clothing_suit = wear_suit
+ var/obj/item/clothing/clothing_head = head
+ if(istype(clothing_suit) && istype(clothing_head))
+ if (clothing_suit.clothing_flags & clothing_head.clothing_flags & STOPSPRESSUREDAMAGE)
+ return TRUE
+ return FALSE
+
+/mob/living/carbon/human/proc/check_for_goggles()
+ if(head?.flags_cover & SEALS_EYES)
+ return head
+ if(wear_mask?.flags_cover & SEALS_EYES)
+ return wear_mask
+ if(glasses?.flags_cover & SEALS_EYES)
+ return glasses
/mob/living/carbon/human/handle_traits()
if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e2a01d29540c..788baa32fbf5 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1,5 +1,7 @@
GLOBAL_LIST_EMPTY(roundstart_races)
+#define MINIMUM_MOLS_TO_HARM 1
+
/**
* # species datum
*
@@ -1793,6 +1795,61 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!H.on_fire || areatemp > H.bodytemperature) // If we are not on fire or the area is hotter
H.adjust_bodytemperature((areatemp - H.bodytemperature), use_insulation=TRUE, use_steps=TRUE, hardsuit_fix=bodytemp_normal - H.bodytemperature)
+ if(H.check_for_seal())
+ return
+
+ var/plasma = environment.get_moles(GAS_PLASMA)
+ var/tritium = environment.get_moles(GAS_TRITIUM)
+ var/chlorine = environment.get_moles(GAS_CHLORINE)
+ var/hydrogen_chloride = environment.get_moles(GAS_HYDROGEN_CHLORIDE)
+ if(chlorine <= MINIMUM_MOLS_TO_HARM && hydrogen_chloride <= MINIMUM_MOLS_TO_HARM && tritium <= MINIMUM_MOLS_TO_HARM && plasma <= MINIMUM_MOLS_TO_HARM)
+ return
+
+ var/eyedamage = FALSE
+ var/irritant = FALSE
+ var/burndamage = 0
+ var/lowerthreshold = 0
+ if(HAS_TRAIT(H, TRAIT_METALLIC)) //makes certain species take more damage and start taking damage at lower air amounts
+ lowerthreshold = 1
+
+ if(plasma > (MINIMUM_MOLS_TO_HARM * 10))
+ eyedamage = TRUE
+ irritant = TRUE
+ if(tritium)
+ burndamage += max(sqrt(tritium) - 2 + lowerthreshold, 0)
+ if(tritium > MINIMUM_MOLS_TO_HARM)
+ eyedamage = TRUE
+ irritant = TRUE
+ if(chlorine)
+ burndamage += max(sqrt(chlorine) - 4 + lowerthreshold, 0)
+ irritant = TRUE
+ if(chlorine > (MINIMUM_MOLS_TO_HARM * 10))
+ eyedamage = TRUE
+ if(hydrogen_chloride)
+ burndamage += max(sqrt(hydrogen_chloride) - 1 + lowerthreshold, 0)
+ eyedamage = TRUE
+ irritant = TRUE
+
+ if(!eyedamage && !burndamage && !irritant)
+ return
+ H.apply_damage(burndamage, BURN, spread_damage = TRUE)
+ if(prob(50) && burndamage)
+ if(lowerthreshold)
+ to_chat(H, "You're corroding!")
+ else
+ to_chat(H, "You're melting!")
+ playsound(H, 'sound/items/welder.ogg', 30, TRUE)
+ if(!H.check_for_goggles() && eyedamage)
+ H.adjustOrganLoss(ORGAN_SLOT_EYES, 1)
+ if(prob(50))
+ to_chat(H, "Your eyes burn!")
+ if(irritant && prob(50))
+ if(lowerthreshold)
+ to_chat(H, "Your outer shell smolders!")
+ else
+ to_chat(H, "Your skin itches.")
+
+
/// Handle the body temperature status effects for the species
/// Traits for resitance to heat or cold are handled here.
/datum/species/proc/handle_body_temperature(mob/living/carbon/human/H)
@@ -2264,3 +2321,5 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/get_harm_descriptors()
return
+
+#undef MINIMUM_MOLS_TO_HARM
diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm
index 9410111c9e4f..20d3f81aa38d 100644
--- a/code/modules/mob/living/carbon/human/species_types/IPC.dm
+++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm
@@ -5,7 +5,7 @@
species_age_min = 0
species_age_max = 300
species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,TRAIT_EASYDISMEMBER,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH,NO_BONES) //all of these + whatever we inherit from the real species
- inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_LIMBATTACHMENT)
+ inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_LIMBATTACHMENT, TRAIT_METALLIC)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
mutantbrain = /obj/item/organ/brain/mmi_holder/posibrain
mutanteyes = /obj/item/organ/eyes/robotic
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 0f3ab70e4034..540dddb9a489 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -741,13 +741,13 @@ There are several things that need to be remembered:
update_hud_neck(I)
if(!(ITEM_SLOT_NECK in check_obscured_slots()))
- if(dna.species.bodytype & BODYTYPE_VOX) // there is neither a vox or kepori neck path, we just tell it to greyscale no matter what
-// if(I.supports_variations & VOX_VARIATION)
-// icon_file = VOX_NECK_PATH
-// if(I.vox_override_icon)
-// icon_file = I.vox_override_icon
-// else
- handled_by_bodytype = TRUE
+ if(dna.species.bodytype & BODYTYPE_VOX) // there is no kepori neck path, we just tell it to greyscale no matter what
+ if(I.supports_variations & VOX_VARIATION)
+ icon_file = VOX_NECK_PATH
+ if(I.vox_override_icon)
+ icon_file = I.vox_override_icon
+ else
+ handled_by_bodytype = TRUE
else if(dna.species.bodytype & BODYTYPE_KEPORI)
// if(I.supports_variations & KEPORI_VARIATION)
@@ -804,7 +804,7 @@ There are several things that need to be remembered:
handled_by_bodytype = TRUE
if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
- icon_file = DEFAULT_BACK_PATH
+ icon_file = I.mob_overlay_icon ? I.mob_overlay_icon : DEFAULT_BACK_PATH
handled_by_bodytype = TRUE
var/use_autogen = handled_by_bodytype ? dna.species : null
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index d5b97a942da2..9525ebd6ec9b 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -14,6 +14,30 @@
return legcuffed
return null
+/mob/living/carbon/get_slot_by_item(obj/item/looking_for)
+ if(looking_for == back)
+ return ITEM_SLOT_BACK
+
+ if(back && (looking_for in back))
+ return ITEM_SLOT_BACKPACK
+
+ if(looking_for == wear_mask)
+ return ITEM_SLOT_MASK
+
+ if(looking_for == wear_neck)
+ return ITEM_SLOT_NECK
+
+ if(looking_for == head)
+ return ITEM_SLOT_HEAD
+
+ if(looking_for == handcuffed)
+ return ITEM_SLOT_HANDCUFFED
+
+ if(looking_for == legcuffed)
+ return ITEM_SLOT_LEGCUFFED
+
+ return ..()
+
/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1)
for(var/slot in slots)
if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE))
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index c80c9a821fd0..34bd7dd8632c 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -211,6 +211,9 @@
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file
/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file)
+ SHOULD_CALL_PARENT(TRUE)
+ RETURN_TYPE(/list)
+
. = list()
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index a25025294497..c054b7d50bf4 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -122,7 +122,7 @@
return
/mob/living/proc/handle_gravity()
- var/gravity = mob_has_gravity()
+ var/gravity = has_gravity()
update_gravity(gravity)
if(gravity > STANDARD_GRAVITY)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 269c74a837bd..1258df8b84c5 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -97,6 +97,7 @@
if(m_intent == MOVE_INTENT_WALK)
return TRUE
+ SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
@@ -831,7 +832,7 @@
return pick("trails_1", "trails_2")
/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0)
- if(buckled)
+ if(buckled || mob_negates_gravity())
return
if(client && client.move_delay >= world.time + world.tick_lag*2)
pressure_resistance_prob_delta -= 30
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index 80c643e0ceef..9813ac88d43e 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, break_modifier = 1, sharpness = FALSE)
+/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1, sharpness = FALSE)
var/hit_percent = (100-blocked)/100
if((!damage || (!forced && hit_percent <= 0)))
return 0
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 5229967f0374..01610cd13644 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -235,6 +235,9 @@
if(!target && trash) //Then for trash.
target = scan(/obj/item/trash)
+ if(!target && trash) //Then for Chainsmokers.
+ target = scan(/obj/item/cigbutt)
+
if(!target && trash) //Search for dead mices.
target = scan(/obj/item/reagent_containers/food/snacks/deadmouse)
@@ -317,6 +320,7 @@
target_types += list(
/obj/item/trash,
/obj/item/reagent_containers/food/snacks/deadmouse,
+ /obj/item/cigbutt,
)
target_types = typecacheof(target_types)
@@ -340,7 +344,7 @@
else if(istype(A, /obj/item) || istype(A, /obj/effect/decal/remains))
visible_message("[src] sprays hydrofluoric acid at [A]!")
playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6)
- A.acid_act(75, 10)
+ A.acid_act(100, 10)
target = null
else if(istype(A, /mob/living/simple_animal/hostile/cockroach) || istype(A, /mob/living/simple_animal/mouse))
var/mob/living/simple_animal/M = target
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 1916a7c52adb..646a3eb8436b 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -270,7 +270,7 @@
maxHealth = 50
gender = FEMALE
harm_intent_damage = 10
- butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/reagent_containers/food/snacks/cakeslice/birthday = 3, \
+ butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/cakeslice/birthday = 3, \
/obj/item/reagent_containers/food/snacks/meat/slab = 2)
response_harm_continuous = "takes a bite out of"
response_harm_simple = "take a bite out of"
diff --git a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
index 4d38e1c5f87f..968e1f7b55ff 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm
@@ -2,15 +2,27 @@
name = "Frontiersman"
desc = "A frontiersman! A terrorist that would probably kill everyone without mercy."
icon_state = "frontiersmanmelee"
+ icon = 'icons/mob/simple_frontiersman.dmi'
icon_living = "frontiersmanmelee"
icon_dead = "frontiersmanmelee_dead"
speak_chance = 0
melee_damage_lower = 15
melee_damage_upper = 15
loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
- /obj/item/kitchen/knife)
+ /obj/item/kitchen/knife/combat/survival)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
faction = list(FACTION_ANTAG_FRONTIERSMEN)
+ footstep_type = FOOTSTEP_MOB_SHOE
+
+/mob/living/simple_animal/hostile/human/frontier/internals
+ icon_state = "frontiersmanmelee_mask"
+ icon_living = "frontiersmanmelee_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier,
+ /obj/item/clothing/mask/gas/sechailer,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
/mob/living/simple_animal/hostile/human/frontier/ranged
icon_state = "frontiersmanranged"
@@ -23,6 +35,21 @@
projectilesound = 'sound/weapons/gun/revolver/shot.ogg'
casingtype = /obj/item/ammo_casing/a357
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals
+ icon_state = "frontiersmanranged_mask"
+ icon_living = "frontiersmanranged_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
+ /obj/item/gun/ballistic/revolver/syndicate,
+ /obj/item/clothing/mask/gas/sechailer,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
+ /obj/item/clothing/mask/gas/sechailer,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
@@ -34,6 +61,21 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals
+ icon_state = "frontiersmanrangedrifle_mask"
+ icon_living = "frontiersmanrangedrifle_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
+ /obj/item/gun/ballistic/rifle/illestren,
+ /obj/item/clothing/mask/gas/sechailer,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged,
+ /obj/item/clothing/mask/gas/sechailer,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged)
@@ -47,6 +89,21 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/shotgun/brimstone)
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals
+ icon_state = "frontiersmanrangedelite_mask"
+ icon_living = "frontiersmanrangedelite_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/gun/ballistic/shotgun/brimstone,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -60,6 +117,21 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
/obj/item/gun/ballistic/automatic/assault/skm)
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals
+ icon_state = "frontiersmanrangedak47_mask"
+ icon_living = "frontiersmanrangedak47_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/gun/ballistic/automatic/assault/skm,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -72,6 +144,21 @@
casingtype = /obj/item/ammo_casing/a8_50r
projectilesound = 'sound/weapons/gun/rifle/mosin.ogg'
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals
+ icon_state = "frontiersmanrangedmosin_mask"
+ icon_living = "frontiersmanrangedmosin_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/gun/ballistic/rifle/illestren,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper)
@@ -87,6 +174,21 @@
projectiletype = /obj/projectile/beam/weak/penetrator
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy)
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/internals
+ icon_state = "frontiersmanrangedminigun_mask"
+ icon_living = "frontiersmanrangedminigun_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless)
@@ -101,10 +203,20 @@
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
/obj/item/gun/ballistic/automatic/pistol/APS)
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals
+ icon_state = "frontiersmanofficer_mask"
+ icon_living = "frontiersmanofficer_mask"
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
+ /obj/item/gun/ballistic/automatic/pistol/APS,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+/mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals/neutered
+ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer,
+ /obj/item/clothing/mask/gas,
+ /obj/item/tank/internals/emergency_oxygen/engi)
+
/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured
loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer)
-
-/mob/living/simple_animal/hostile/human/frontier/ranged/officer/Aggro()
- ..()
- summon_backup(15)
- say(pick("Help!!", "They're right here!!", "Don't let me die!!"))
diff --git a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
index f7abea96b222..52863c1a5c64 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm
@@ -39,7 +39,7 @@
icon_state = "survivor_hunter"
icon_living = "survivor_hunter"
projectiletype = null
- casingtype = /obj/item/ammo_casing/aac_300blk/recycled
+ casingtype = /obj/item/ammo_casing/a762_40
projectilesound = 'sound/weapons/gun/rifle/shot.ogg'
ranged = 1
rapid_fire_delay = 6
@@ -244,7 +244,7 @@
if(prob(20))
l_pocket = /obj/item/reagent_containers/food/snacks/meat/steak/goliath
else if(prob(60))
- l_pocket = /obj/item/ammo_box/aac_300blk_stripper
+ l_pocket = /obj/item/ammo_box/a762_stripper
if(prob(20))
new /obj/item/gun/ballistic/rifle/polymer(loc)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index 2a60b3c52fc2..7caaf4f1e436 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -19,7 +19,7 @@ Featuring:
*/
/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot
- name = "Syndicate Mecha Pilot"
+ name = "Syndicate Exosuit Pilot"
desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour."
wanted_objects = list()
search_objects = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index b5d539086ac7..b7ca291a5be4 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -208,7 +208,7 @@
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "is shrugged off by"
del_on_death = TRUE
- stat_attack = HARD_CRIT
+ stat_attack = SOFT_CRIT
robust_searching = 1
var/can_infest_dead = FALSE
@@ -222,7 +222,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/staff/Initialize()
. = ..()
- addtimer(CALLBACK(src, PROC_REF(death)), 50)
+ addtimer(CALLBACK(src, PROC_REF(death)), 5 SECONDS)
AddComponent(/datum/component/swarming)
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
@@ -230,6 +230,8 @@
if(stat == DEAD || !isturf(loc))
return
for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile
+ if(istype(victim.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull)) // no double dipping
+ continue
switch(victim.stat)
if(UNCONSCIOUS, HARD_CRIT)
infest(victim)
@@ -239,21 +241,87 @@
infest(victim)
return //This will qdelete the legion.
-
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
- visible_message("[name] burrows into the flesh of [H]!")
- var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
- if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
- L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
+ visible_message(span_warning("[name] burrows into the flesh of [H]!"))
+ if(H.stat != DEAD)
+ var/obj/item/organ/legion_skull/throwyouabone = new()
+ throwyouabone.Insert(H)
else
- L = new(H.loc)
- visible_message("[L] staggers to [L.p_their()] feet!")
- H.death()
- H.adjustBruteLoss(1000)
- L.stored_mob = H
- H.forceMove(L)
+ var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
+ if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff!
+ L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
+ else
+ L = new(H.loc)
+ visible_message(span_warning("[L] staggers to [L.p_their()] feet!"))
+ H.adjustBruteLoss(1000)
+ L.stored_mob = H
+ H.forceMove(L)
qdel(src)
+/obj/item/organ/legion_skull
+ name = "legion skull"
+ desc = "The skull of a legion, likely torn from a soon-to-be host."
+ icon_state = "legion_skull"
+ zone = BODY_ZONE_CHEST
+ slot = ORGAN_SLOT_REGENERATIVE_CORE
+ grind_results = list(/datum/reagent/medicine/soulus = 2, /datum/reagent/blood = 5)
+ var/datum/disease/transformation/legionvirus/malignance
+ var/malignance_countdown = 5 MINUTES
+ var/malignance_tracker
+
+/obj/item/organ/legion_skull/on_find(mob/living/finder)
+ ..()
+ to_chat(finder, span_warning("You found a skull-shaped growth in [owner]'s [zone]!"))
+
+/obj/item/organ/legion_skull/Insert(mob/living/carbon/M, special = 0)
+ ..()
+ malignance = new()
+ malignance.infect(M, FALSE) //we handle all the fancy virus stuff in the organ, so we need a reference for it
+ malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME)
+ M.heal_overall_bleeding(12) //stop dying so fast
+
+/obj/item/organ/legion_skull/Remove(mob/living/carbon/M, special = 0)
+ malignance_countdown = initial(malignance_countdown)
+ deltimer(malignance_tracker)
+ malignance_tracker = null
+ malignance.cure()
+ ..()
+
+/obj/item/organ/legion_skull/on_life()
+ . = ..()
+ skull_check()
+
+/obj/item/organ/legion_skull/on_death()
+ . = ..()
+ skull_check()
+
+/// track our timers and reagents
+/obj/item/organ/legion_skull/proc/skull_check()
+ if(!malignance)
+ malignance = new()
+ malignance.infect(owner, FALSE)
+ if(owner.reagents.has_reagent(/datum/reagent/medicine/synaptizine, needs_metabolizing = TRUE) || owner.reagents.has_reagent(/datum/reagent/medicine/spaceacillin, needs_metabolizing = TRUE))
+ if(isnull(timeleft(malignance_tracker))) //ruhehehehehe
+ malignance_countdown = min(malignance_countdown + 1 SECONDS, initial(malignance_countdown)) //slightly improve our resistance to dying so we don't turn the second a treatment runs out
+ return
+ malignance_countdown = timeleft(malignance_tracker) //pause our timer if we have the reagents
+ deltimer(malignance_tracker)
+ malignance_tracker = null //you would think deltimer would do this but it actually doesn't track a direct reference!
+ return
+ if(!malignance_tracker)
+ malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME) //and resume if we run out
+
+/// Updates the stage of our tied disease
+/obj/item/organ/legion_skull/proc/update_stage()
+ malignance.update_stage(min(malignance.stage + 1, malignance.max_stages))
+ if(malignance.stage == 5)
+ malignance.stage_act() //force the transformation here, then delete everything
+ qdel(malignance)
+ qdel(src)
+ return
+ malignance_countdown = initial(malignance_countdown)
+ malignance_tracker = addtimer(CALLBACK(src, PROC_REF(update_stage)), malignance_countdown, TIMER_STOPPABLE|TIMER_DELETE_ME)
+
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
name = "Signifer"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index 09d85a664e86..437333f15284 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -203,14 +203,14 @@
if(prob(50))
r_pocket = pickweight(list(
/obj/item/stack/marker_beacon = 20,
- /obj/item/spacecash/bundle/mediumrand = 7,
+ /obj/item/spacecash/bundle/smallrand = 7,
/obj/item/reagent_containers/hypospray/medipen/survival = 2,
/obj/item/borg/upgrade/modkit/damage = 1
)
)
if(prob(25))
l_pocket = pickweight(list(
- /obj/item/spacecash/bundle/mediumrand = 5,
+ /obj/item/spacecash/bundle/smallrand = 5,
/obj/item/reagent_containers/hypospray/medipen/survival = 2,
/obj/item/borg/upgrade/modkit/cooldown = 1
)
@@ -411,7 +411,7 @@
for(var/i = 1 to 3)
if(prob(75))
backpack_contents += pickweight(list(
- /obj/item/spacecash/bundle/mediumrand = 5,
+ /obj/item/spacecash/bundle/smallrand = 5,
/obj/item/ammo_box/magazine/illestren_a850r = 5,
/obj/item/ammo_box/magazine/zip_ammo_9mm = 5,
/obj/item/modular_computer/tablet/preset/cargo = 3,
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 06c7a9af52d8..b1788a7aa50d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -313,6 +313,14 @@
/mob/proc/get_item_by_slot(slot_id)
return null
+/// Gets what slot the item on the mob is held in.
+/// Returns null if the item isn't in any slots on our mob.
+/// Does not check if the passed item is null, which may result in unexpected outcoms.
+/mob/proc/get_slot_by_item(obj/item/looking_for)
+ if(looking_for in held_items)
+ return ITEM_SLOT_HANDS
+
+ return null
///Is the mob incapacitated
/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index de1cb857ed4e..bd1227d94d7d 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -28,6 +28,45 @@
zone = BODY_ZONE_CHEST
return zone
+/// Returns a generic path of the object based on the slot
+/proc/get_path_by_slot(slot_id)
+ switch(slot_id)
+ if(ITEM_SLOT_BACK)
+ return /obj/item/storage/backpack
+ if(ITEM_SLOT_MASK)
+ return /obj/item/clothing/mask
+ if(ITEM_SLOT_NECK)
+ return /obj/item/clothing/neck
+ if(ITEM_SLOT_HANDCUFFED)
+ return /obj/item/restraints/handcuffs
+ if(ITEM_SLOT_LEGCUFFED)
+ return /obj/item/restraints/legcuffs
+ if(ITEM_SLOT_BELT)
+ return /obj/item/storage/belt
+ if(ITEM_SLOT_ID)
+ return /obj/item/card/id
+ if(ITEM_SLOT_EARS)
+ return /obj/item/clothing/ears
+ if(ITEM_SLOT_EYES)
+ return /obj/item/clothing/glasses
+ if(ITEM_SLOT_GLOVES)
+ return /obj/item/clothing/gloves
+ if(ITEM_SLOT_HEAD)
+ return /obj/item/clothing/head
+ if(ITEM_SLOT_FEET)
+ return /obj/item/clothing/shoes
+ if(ITEM_SLOT_OCLOTHING)
+ return /obj/item/clothing/suit
+ if(ITEM_SLOT_ICLOTHING)
+ return /obj/item/clothing/under
+ if(ITEM_SLOT_LPOCKET)
+ return /obj/item
+ if(ITEM_SLOT_RPOCKET)
+ return /obj/item
+ if(ITEM_SLOT_SUITSTORE)
+ return /obj/item
+ return null
+
/**
* Return the zone or randomly, another valid zone
*
@@ -169,13 +208,9 @@
var/static/regex/nostutter = regex(@@[aeiouAEIOU "'()[\]{}.!?,:;_`~-]@)
for(var/i = 1, i <= leng, i += length(rawchar))
rawchar = newletter = phrase[i]
- if(prob(80) && !nostutter.Find(rawchar))
- if(prob(10))
- newletter = "[newletter]-[newletter]-[newletter]-[newletter]"
- else if(prob(20))
+ if(prob(70) && !nostutter.Find(rawchar))
+ if(prob(25))
newletter = "[newletter]-[newletter]-[newletter]"
- else if (prob(5))
- newletter = ""
else
newletter = "[newletter]-[newletter]"
. += newletter
diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm
new file mode 100644
index 000000000000..1df1f7b8894b
--- /dev/null
+++ b/code/modules/mod/mod_actions.dm
@@ -0,0 +1,193 @@
+/datum/action/item_action/mod
+ background_icon_state = "bg_tech_blue"
+ icon_icon = 'icons/mob/actions/actions_mod.dmi'
+ check_flags = AB_CHECK_CONSCIOUS
+ /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently.
+ var/ai_action = FALSE
+
+/datum/action/item_action/mod/New(Target)
+ ..()
+ if(!istype(Target, /obj/item/mod/control))
+ qdel(src)
+ return
+ if(ai_action)
+ background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND
+
+/datum/action/item_action/mod/Grant(mob/user)
+ var/obj/item/mod/control/mod = target
+ if(ai_action && user != mod.ai)
+ return
+ else if(!ai_action && user == mod.ai)
+ return
+ return ..()
+
+/datum/action/item_action/mod/Remove(mob/user)
+ var/obj/item/mod/control/mod = target
+ if(ai_action && user != mod.ai)
+ return
+ else if(!ai_action && user == mod.ai)
+ return
+ return ..()
+
+/datum/action/item_action/mod/Trigger(trigger_flags)
+ if(!IsAvailable())
+ return FALSE
+ var/obj/item/mod/control/mod = target
+ if(mod.malfunctioning && prob(75))
+ mod.balloon_alert(usr, "button malfunctions!")
+ return FALSE
+ return TRUE
+
+/datum/action/item_action/mod/deploy
+ name = "Deploy MODsuit"
+ desc = "LMB: Deploy/Undeploy part. Alt Click: Deploy/Undeploy full suit."
+ button_icon_state = "deploy"
+
+/datum/action/item_action/mod/deploy/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+ var/obj/item/mod/control/mod = target
+ if(trigger_flags & TRIGGER_SECONDARY_ACTION)
+ mod.quick_deploy(usr)
+ else
+ mod.choose_deploy(usr)
+
+/datum/action/item_action/mod/deploy/ai
+ ai_action = TRUE
+
+/datum/action/item_action/mod/activate
+ name = "Activate MODsuit"
+ desc = "LMB: Activate/Deactivate suit with prompt. Alt Click: Activate/Deactivate suit skipping prompt."
+ button_icon_state = "activate"
+ /// First time clicking this will set it to TRUE, second time will activate it.
+ var/ready = FALSE
+
+/datum/action/item_action/mod/activate/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+ if(!(trigger_flags & TRIGGER_SECONDARY_ACTION) && !ready)
+ ready = TRUE
+ button_icon_state = "activate-ready"
+ if(!ai_action)
+ background_icon_state = "bg_tech"
+ UpdateButtonIcon()
+ addtimer(CALLBACK(src, PROC_REF(reset_ready)), 3 SECONDS)
+ return
+ var/obj/item/mod/control/mod = target
+ reset_ready()
+ mod.toggle_activate(usr)
+
+/// Resets the state requiring to be doubleclicked again.
+/datum/action/item_action/mod/activate/proc/reset_ready()
+ ready = FALSE
+ button_icon_state = initial(button_icon_state)
+ if(!ai_action)
+ background_icon_state = initial(background_icon_state)
+ UpdateButtonIcon()
+
+/datum/action/item_action/mod/activate/ai
+ ai_action = TRUE
+
+/datum/action/item_action/mod/module
+ name = "Toggle Module"
+ desc = "Toggle a MODsuit module."
+ button_icon_state = "module"
+
+/datum/action/item_action/mod/module/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+ var/obj/item/mod/control/mod = target
+ mod.quick_module(usr)
+
+/datum/action/item_action/mod/module/ai
+ ai_action = TRUE
+
+/datum/action/item_action/mod/panel
+ name = "MODsuit Panel"
+ desc = "Open the MODsuit's panel."
+ button_icon_state = "panel"
+
+/datum/action/item_action/mod/panel/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+ var/obj/item/mod/control/mod = target
+ mod.ui_interact(usr)
+
+/datum/action/item_action/mod/panel/ai
+ ai_action = TRUE
+
+/datum/action/item_action/mod/pinned_module
+ desc = "Activate the module."
+ /// Overrides the icon applications.
+ var/override = FALSE
+ /// Module we are linked to.
+ var/obj/item/mod/module/module
+ /// A ref to the mob we are pinned to.
+ var/pinner_ref
+
+/datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user)
+ if(isAI(user))
+ ai_action = TRUE
+ ..()
+ module = linked_module
+ name = "Activate [capitalize(linked_module.name)]"
+ desc = "Quickly activate [linked_module]."
+ icon_icon = linked_module.icon
+ button_icon_state = linked_module.icon_state
+ RegisterSignal(linked_module, COMSIG_MODULE_ACTIVATED, PROC_REF(on_module_activate))
+ RegisterSignal(linked_module, COMSIG_MODULE_DEACTIVATED, PROC_REF(on_module_deactivate))
+ RegisterSignal(linked_module, COMSIG_MODULE_USED, PROC_REF(on_module_use))
+
+/datum/action/item_action/mod/pinned_module/Destroy()
+ module.pinned_to -= pinner_ref
+ module = null
+ return ..()
+
+/datum/action/item_action/mod/pinned_module/Grant(mob/user)
+ var/user_ref = REF(user)
+ if(!pinner_ref)
+ pinner_ref = user_ref
+ module.pinned_to[pinner_ref] = src
+ else if(pinner_ref != user_ref)
+ return
+ return ..()
+
+/datum/action/item_action/mod/pinned_module/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+ module.on_select()
+
+/datum/action/item_action/mod/pinned_module/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force)
+ . = ..(current_button, force = TRUE)
+ if(override)
+ return
+ var/obj/item/mod/control/mod = target
+ if(module == mod.selected_module)
+ current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_selected", layer = FLOAT_LAYER-0.1))
+ else if(module.active)
+ current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_active", layer = FLOAT_LAYER-0.1))
+ if(!COOLDOWN_FINISHED(module, cooldown_timer))
+ var/image/cooldown_image = image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown")
+ current_button.add_overlay(cooldown_image)
+ addtimer(CALLBACK(current_button, TYPE_PROC_REF(/image, cut_overlay), cooldown_image), COOLDOWN_TIMELEFT(module, cooldown_timer))
+
+
+/datum/action/item_action/mod/pinned_module/proc/on_module_activate(datum/source)
+ SIGNAL_HANDLER
+
+ UpdateButtonIcon()
+
+/datum/action/item_action/mod/pinned_module/proc/on_module_deactivate(datum/source)
+ SIGNAL_HANDLER
+
+ UpdateButtonIcon()
+
+/datum/action/item_action/mod/pinned_module/proc/on_module_use(datum/source)
+ SIGNAL_HANDLER
+
+ UpdateButtonIcon()
diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm
new file mode 100644
index 000000000000..cb61728f2cbb
--- /dev/null
+++ b/code/modules/mod/mod_activation.dm
@@ -0,0 +1,244 @@
+#define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED
+
+/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted.
+/obj/item/mod/control/proc/choose_deploy(mob/user)
+ if(!length(mod_parts))
+ return
+ var/list/display_names = list()
+ var/list/items = list()
+ for(var/obj/item/part as anything in mod_parts)
+ display_names[part.name] = REF(part)
+ var/image/part_image = image(icon = part.icon, icon_state = part.icon_state)
+ if(part.loc != src)
+ part_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_active")
+ items += list(part.name = part_image)
+ var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
+ if(!pick)
+ return
+ var/part_reference = display_names[pick]
+ var/obj/item/part = locate(part_reference) in mod_parts
+ if(!istype(part) || user.incapacitated())
+ return
+ if((active && part != helmet) || activating)
+ balloon_alert(user, "deactivate the suit first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ var/parts_to_check = mod_parts - part
+ if(part.loc == src)
+ deploy(user, part)
+ for(var/obj/item/checking_part as anything in parts_to_check)
+ if(checking_part.loc != src)
+ continue
+ choose_deploy(user)
+ break
+ else
+ retract(user, part)
+ for(var/obj/item/checking_part as anything in parts_to_check)
+ if(checking_part.loc == src)
+ continue
+ choose_deploy(user)
+ break
+
+/// Quickly deploys all parts (or retracts if all are on the wearer)
+/obj/item/mod/control/proc/quick_deploy(mob/user)
+ if(active || activating)
+ balloon_alert(user, "deactivate the suit first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ var/deploy = FALSE
+ for(var/obj/item/part as anything in mod_parts)
+ if(part.loc != src)
+ continue
+ deploy = TRUE
+ for(var/obj/item/part as anything in mod_parts)
+ if(deploy && part.loc == src)
+ deploy(null, part)
+ else if(!deploy && part.loc != src)
+ retract(null, part)
+ wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its' parts with a mechanical hiss."),
+ span_notice("[src] [deploy ? "deploys" : "retracts"] its' parts with a mechanical hiss."),
+ span_hear("You hear a mechanical hiss."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ return TRUE
+
+/// Deploys a part of the suit onto the user.
+/obj/item/mod/control/proc/deploy(mob/user, obj/item/part)
+ if(part.loc != src)
+ if(!user)
+ return FALSE
+ balloon_alert(user, "[part.name] already deployed!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ if(part in overslotting_parts)
+ var/obj/item/overslot = wearer.get_item_by_slot(part.slot_flags)
+ if(overslot)
+ overslotting_parts[part] = overslot
+ wearer.transferItemToLoc(overslot, part, force = TRUE)
+ RegisterSignal(part, COMSIG_ATOM_EXITED, PROC_REF(on_overslot_exit))
+ if(wearer.equip_to_slot_if_possible(part, part.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
+ ADD_TRAIT(part, TRAIT_NODROP, MOD_TRAIT)
+ if(!user)
+ return TRUE
+ wearer.visible_message(span_notice("[wearer]'s [part.name] deploy[part.p_s()] with a mechanical hiss."),
+ span_notice("[part] deploy[part.p_s()] with a mechanical hiss."),
+ span_hear("You hear a mechanical hiss."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ return TRUE
+ else
+ if(!user)
+ return FALSE
+ balloon_alert(user, "bodypart clothed!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+
+/// Retract a part of the suit from the user.
+/obj/item/mod/control/proc/retract(mob/user, obj/item/part)
+ if(part.loc == src)
+ if(!user)
+ return FALSE
+ balloon_alert(user, "[part.name] already retracted!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ REMOVE_TRAIT(part, TRAIT_NODROP, MOD_TRAIT)
+ wearer.transferItemToLoc(part, src, force = TRUE)
+ if(overslotting_parts[part])
+ UnregisterSignal(part, COMSIG_ATOM_EXITED)
+ var/obj/item/overslot = overslotting_parts[part]
+ if(!wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
+ wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE)
+ overslotting_parts[part] = null
+ if(!user)
+ return
+ wearer.visible_message(span_notice("[wearer]'s [part.name] retract[part.p_s()] back into [src] with a mechanical hiss."),
+ span_notice("[part] retract[part.p_s()] back into [src] with a mechanical hiss."),
+ span_hear("You hear a mechanical hiss."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+
+/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on
+/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE)
+ if(!wearer)
+ if(!force_deactivate)
+ balloon_alert(user, "put suit on back!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE))
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ for(var/obj/item/part as anything in mod_parts)
+ if(!force_deactivate && part.loc == src)
+ balloon_alert(user, "deploy all parts first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(locked && !active && !allowed(user) && !force_deactivate)
+ balloon_alert(user, "access insufficient!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(!get_charge() && !force_deactivate)
+ balloon_alert(user, "suit not powered!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(open && !force_deactivate)
+ balloon_alert(user, "close the suit panel!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(activating)
+ if(!force_deactivate)
+ balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.active || module.allowed_inactive)
+ continue
+ module.on_deactivation(display_message = FALSE)
+ activating = TRUE
+ to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"]."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(boots, seal = !active)
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"]."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(gauntlets, seal = !active)
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"]."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(chestplate, seal = !active)
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"]."))
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(helmet, seal = !active)
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
+ if(ai)
+ to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\""))
+ finish_activation(on = !active)
+ if(active)
+ playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ if(!malfunctioning)
+ wearer.playsound_local(get_turf(src), 'sound/mecha/nominal.ogg', 50)
+ else
+ playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ activating = FALSE
+ return TRUE
+
+///Seals or unseals the given part
+/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal)
+ if(seal)
+ part.clothing_flags |= part.visor_flags
+ part.flags_inv |= part.visor_flags_inv
+ part.flags_cover |= part.visor_flags_cover
+ part.heat_protection = initial(part.heat_protection)
+ part.cold_protection = initial(part.cold_protection)
+ part.alternate_worn_layer = null
+ else
+ part.flags_cover &= ~part.visor_flags_cover
+ part.flags_inv &= ~part.visor_flags_inv
+ part.clothing_flags &= ~part.visor_flags
+ part.heat_protection = NONE
+ part.cold_protection = NONE
+ part.alternate_worn_layer = mod_parts[part]
+ if(part == boots)
+ boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]"
+ wearer.update_inv_shoes()
+ if(part == gauntlets)
+ gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]"
+ wearer.update_inv_gloves()
+ if(part == chestplate)
+ chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]"
+ wearer.update_inv_wear_suit()
+ wearer.update_inv_w_uniform()
+ if(part == helmet)
+ helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]"
+ wearer.update_inv_head()
+ wearer.update_inv_wear_mask()
+ wearer.update_inv_glasses()
+ wearer.update_hair()
+
+/// Finishes the suit's activation, starts processing
+/obj/item/mod/control/proc/finish_activation(on)
+ active = on
+ if(active)
+ for(var/obj/item/mod/module/module as anything in modules)
+ module.on_suit_activation()
+ START_PROCESSING(SSobj, src)
+ else
+ for(var/obj/item/mod/module/module as anything in modules)
+ module.on_suit_deactivation()
+ STOP_PROCESSING(SSobj, src)
+ update_speed()
+ update_icon_state()
+ wearer.update_inv_back(slot_flags)
+
+/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits.
+/obj/item/mod/control/proc/quick_activation()
+ var/seal = TRUE
+ for(var/obj/item/part as anything in mod_parts)
+ if(!deploy(null, part))
+ seal = FALSE
+ if(!seal)
+ return
+ for(var/obj/item/part as anything in mod_parts)
+ seal_part(part, seal = TRUE)
+ finish_activation(on = TRUE)
+
+/obj/item/mod/control/proc/has_wearer()
+ return wearer
diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm
new file mode 100644
index 000000000000..a05717970348
--- /dev/null
+++ b/code/modules/mod/mod_ai.dm
@@ -0,0 +1,125 @@
+/**
+ * Simple proc to insert the pAI into the MODsuit.
+ *
+ * user - The person trying to put the pAI into the MODsuit.
+ * card - The pAI card we're slotting in the MODsuit.
+ */
+
+/obj/item/mod/control/proc/insert_pai(mob/user, obj/item/paicard/card)
+ if(ai)
+ balloon_alert(user, "ai already installed!")
+ return
+ if(!card.pai || !card.pai.mind)
+ balloon_alert(user, "pai unresponsive!")
+ return
+ balloon_alert(user, "transferring to suit...")
+ if(!do_after(user, 5 SECONDS, target = src))
+ balloon_alert(user, "interrupted!")
+ return FALSE
+ if(!user.transferItemToLoc(card, src))
+ return
+
+ card.pai.canholo = FALSE
+ ai = card.pai
+ balloon_alert(user, "pAI transferred to suit")
+ balloon_alert(ai, "transferred to a suit")
+ ai.remote_control = src
+ for(var/datum/action/action as anything in actions)
+ action.Grant(ai)
+ return TRUE
+
+/**
+ * Simple proc to extract the pAI from the MODsuit. It's the proc to call if you want to take it out,
+ * remove_pai() is there so atom_destruction() doesn't have any risk of sleeping.
+ *
+ * user - The person trying to take out the pAI from the MODsuit.
+ * forced - Whether or not we skip the checks and just eject the pAI. Defaults to FALSE.
+ * feedback - Whether to give feedback via balloon alerts or not. Defaults to TRUE.
+ */
+/obj/item/mod/control/proc/extract_pai(mob/user, forced = FALSE, feedback = TRUE)
+ if(!ai)
+ if(user && feedback)
+ balloon_alert(user, "no pAI to remove!")
+ return
+ if(!ispAI(ai))
+ if(user && feedback)
+ balloon_alert(user, "onboard AI cannot fit in this card!")
+ return
+ if(!forced)
+ if(!open)
+ if(user && feedback)
+ balloon_alert(user, "open the suit panel!")
+ return FALSE
+ if(!do_after(user, 5 SECONDS, target = src))
+ if(user && feedback)
+ balloon_alert(user, "interrupted!")
+ return FALSE
+
+ remove_pai(feedback)
+
+ if(feedback && user)
+ balloon_alert(user, "pAI removed from the suit")
+
+/**
+ * Simple proc that handles the safe removal of the pAI from a MOD control unit.
+ *
+ * Arguments:
+ * * feedback - Whether or not we want to give balloon alert feedback to the ai. Defaults to FALSE.
+ */
+/obj/item/mod/control/proc/remove_pai(feedback = FALSE)
+ if(!ispAI(ai))
+ return
+ var/mob/living/silicon/pai/pai = ai
+ var/turf/drop_off = get_turf(src)
+ if(drop_off) // In case there's no drop_off, the pAI will simply get deleted.
+ pai.card.forceMove(drop_off)
+
+ for(var/datum/action/action as anything in actions)
+ if(action.owner == pai)
+ action.Remove(pai)
+
+ if(feedback)
+ balloon_alert(pai, "removed from a suit")
+ pai.remote_control = null
+ pai.canholo = TRUE
+ pai = null
+
+#define MOVE_DELAY 2
+#define WEARER_DELAY 1
+#define LONE_DELAY 5
+#define CELL_PER_STEP (DEFAULT_CHARGE_DRAIN * 2.5)
+#define AI_FALL_TIME (1 SECONDS)
+
+/*obj/item/mod/control/relaymove(mob/user, direction)
+ var/cell = get_cell()
+ if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE))
+ return FALSE
+ var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY)
+ if(wearer && !wearer.Process_Spacemove(direction))
+ return FALSE
+ else if(!wearer && (!has_gravity() || !isturf(loc)))
+ return FALSE
+ COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown)
+ cell.charge = max(0, cell.charge - CELL_PER_STEP)
+ playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE)
+ if(ismovable(wearer?.loc))
+ return wearer.loc.relaymove(wearer, direction)
+ else if(wearer)
+
+ var/atom/movable/mover = wearer || src
+ return step(mover, direction)
+
+#undef MOVE_DELAY
+#undef WEARER_DELAY
+#undef LONE_DELAY
+#undef CELL_PER_STEP
+#undef AI_FALL_TIME
+
+ return
+ REMOVE_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT)
+
+/obj/item/mod/control/ui_state(mob/user)
+ if(user == ai)
+ return GLOB.contained_state
+ return ..()
+*/
diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm
new file mode 100644
index 000000000000..7a9e710c9382
--- /dev/null
+++ b/code/modules/mod/mod_clothes.dm
@@ -0,0 +1,56 @@
+/obj/item/clothing/head/mod
+ name = "MOD helmet"
+ desc = "A helmet for a MODsuit."
+ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ icon_state = "standard-helmet"
+ base_icon_state = "helmet"
+ mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ body_parts_covered = HEAD
+ heat_protection = HEAD
+ cold_protection = HEAD
+ obj_flags = IMMUTABLE_SLOW
+ visor_flags = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|ALLOWINTERNALS
+
+/obj/item/clothing/suit/mod
+ name = "MOD chestplate"
+ desc = "A chestplate for a MODsuit."
+ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ icon_state = "standard-chestplate"
+ base_icon_state = "chestplate"
+ mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ blood_overlay_type = "armor"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ body_parts_covered = CHEST|GROIN
+ heat_protection = CHEST|GROIN
+ cold_protection = CHEST|GROIN
+ obj_flags = IMMUTABLE_SLOW
+
+/obj/item/clothing/gloves/mod
+ name = "MOD gauntlets"
+ desc = "A pair of gauntlets for a MODsuit."
+ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ icon_state = "standard-gauntlets"
+ base_icon_state = "gauntlets"
+ mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ body_parts_covered = HANDS|ARMS
+ heat_protection = HANDS|ARMS
+ cold_protection = HANDS|ARMS
+ obj_flags = IMMUTABLE_SLOW
+
+/obj/item/clothing/shoes/mod
+ name = "MOD boots"
+ desc = "A pair of boots for a MODsuit."
+ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ icon_state = "standard-boots"
+ base_icon_state = "boots"
+ mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ body_parts_covered = FEET|LEGS
+ heat_protection = FEET|LEGS
+ cold_protection = FEET|LEGS
+ obj_flags = IMMUTABLE_SLOW
+ supports_variations = DIGITIGRADE_VARIATION
+ can_be_tied = FALSE
+ visor_flags_inv = HIDESHOES
diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm
new file mode 100644
index 000000000000..0f37a4fd1f11
--- /dev/null
+++ b/code/modules/mod/mod_construction.dm
@@ -0,0 +1,275 @@
+/obj/item/mod/construction
+ desc = "A part used in MOD construction."
+ icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
+ item_state = "rack_parts"
+
+/obj/item/mod/construction/helmet
+ name = "MOD helmet"
+ icon_state = "helmet"
+
+/obj/item/mod/construction/helmet/examine(mob/user)
+ . = ..()
+ . += span_notice("You could insert these into a MOD shell...")
+
+/obj/item/mod/construction/chestplate
+ name = "MOD chestplate"
+ icon_state = "chestplate"
+
+/obj/item/mod/construction/chestplate/examine(mob/user)
+ . = ..()
+ . += span_notice("You could insert these into a MOD shell...")
+
+/obj/item/mod/construction/gauntlets
+ name = "MOD gauntlets"
+ icon_state = "gauntlets"
+
+/obj/item/mod/construction/gauntlets/examine(mob/user)
+ . = ..()
+ . += span_notice("You could insert these into a MOD shell...")
+
+/obj/item/mod/construction/boots
+ name = "MOD boots"
+ icon_state = "boots"
+
+/obj/item/mod/construction/boots/examine(mob/user)
+ . = ..()
+ . += span_notice("You could insert these into a MOD shell...")
+
+/obj/item/mod/construction/broken_core
+ name = "broken MOD core"
+ icon_state = "mod-core"
+ desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though."
+
+/obj/item/mod/construction/broken_core/examine(mob/user)
+ . = ..()
+ . += span_notice("You could repair it with a screwdriver...")
+
+/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool)
+ . = ..()
+ if(!tool.use_tool(src, user, 5 SECONDS, volume = 30))
+ return
+ new /obj/item/mod/core/standard(drop_location())
+ qdel(src)
+
+/obj/item/mod/construction/plating
+ name = "MOD external plating"
+ desc = "External plating used to finish a MOD control unit."
+ icon_state = "standard-plating"
+ var/datum/mod_theme/theme = /datum/mod_theme
+
+/obj/item/mod/construction/plating/Initialize(mapload)
+ . = ..()
+ var/datum/mod_theme/used_theme = GLOB.mod_themes[theme]
+ name = "MOD [used_theme.name] external plating"
+ desc = "[desc] [used_theme.desc]"
+ icon_state = "[used_theme.default_skin]-plating"
+
+/obj/item/mod/construction/plating/engineering
+ theme = /datum/mod_theme/engineering
+
+/obj/item/mod/construction/plating/atmospheric
+ theme = /datum/mod_theme/atmospheric
+
+/obj/item/mod/construction/plating/medical
+ theme = /datum/mod_theme/medical
+
+/obj/item/mod/construction/plating/security
+ theme = /datum/mod_theme/security
+
+#define START_STEP "start"
+#define CORE_STEP "core"
+#define SCREWED_CORE_STEP "screwed_core"
+#define HELMET_STEP "helmet"
+#define CHESTPLATE_STEP "chestplate"
+#define GAUNTLETS_STEP "gauntlets"
+#define BOOTS_STEP "boots"
+#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly"
+#define SCREWED_ASSEMBLY_STEP "screwed_assembly"
+
+/obj/item/mod/construction/shell
+ name = "MOD shell"
+ icon_state = "mod-construction_start"
+ desc = "A MOD shell."
+ var/obj/item/core
+ var/obj/item/helmet
+ var/obj/item/chestplate
+ var/obj/item/gauntlets
+ var/obj/item/boots
+ var/step = START_STEP
+
+/obj/item/mod/construction/shell/examine(mob/user)
+ . = ..()
+ var/display_text
+ switch(step)
+ if(START_STEP)
+ display_text = "It looks like it's missing a MOD core..."
+ if(CORE_STEP)
+ display_text = "The core seems loose..."
+ if(SCREWED_CORE_STEP)
+ display_text = "It looks like it's missing a helmet..."
+ if(HELMET_STEP)
+ display_text = "It looks like it's missing a chestplate..."
+ if(CHESTPLATE_STEP)
+ display_text = "It looks like it's missing gauntlets..."
+ if(GAUNTLETS_STEP)
+ display_text = "It looks like it's missing boots..."
+ if(BOOTS_STEP)
+ display_text = "The assembly seems unsecured..."
+ if(WRENCHED_ASSEMBLY_STEP)
+ display_text = "The assembly seems loose..."
+ if(SCREWED_ASSEMBLY_STEP)
+ display_text = "All it's missing is external plating..."
+ . += span_notice(display_text)
+
+/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params)
+ . = ..()
+ switch(step)
+ if(START_STEP)
+ if(!istype(part, /obj/item/mod/core))
+ return
+ if(!user.transferItemToLoc(part, src))
+ balloon_alert(user, "core stuck to your hand!")
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "core inserted")
+ core = part
+ step = CORE_STEP
+ if(CORE_STEP)
+ if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "core screwed")
+ step = SCREWED_CORE_STEP
+ else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ core.forceMove(drop_location())
+ balloon_alert(user, "core taken out")
+ step = START_STEP
+ if(SCREWED_CORE_STEP)
+ if(istype(part, /obj/item/mod/construction/helmet)) //Construct
+ if(!user.transferItemToLoc(part, src))
+ balloon_alert(user, "helmet stuck to your hand!")
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "helmet added")
+ helmet = part
+ step = HELMET_STEP
+ else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "core unscrewed")
+ step = CORE_STEP
+ if(HELMET_STEP)
+ if(istype(part, /obj/item/mod/construction/chestplate)) //Construct
+ if(!user.transferItemToLoc(part, src))
+ balloon_alert(user, "chestplate stuck to your hand!")
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "chestplate added")
+ chestplate = part
+ step = CHESTPLATE_STEP
+ else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ helmet.forceMove(drop_location())
+ balloon_alert(user, "helmet removed")
+ helmet = null
+ step = SCREWED_CORE_STEP
+ if(CHESTPLATE_STEP)
+ if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct
+ if(!user.transferItemToLoc(part, src))
+ balloon_alert(user, "gauntlets stuck to your hand!")
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "gauntlets added")
+ gauntlets = part
+ step = GAUNTLETS_STEP
+ else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ chestplate.forceMove(drop_location())
+ balloon_alert(user, "chestplate removed")
+ chestplate = null
+ step = HELMET_STEP
+ if(GAUNTLETS_STEP)
+ if(istype(part, /obj/item/mod/construction/boots)) //Construct
+ if(!user.transferItemToLoc(part, src))
+ balloon_alert(user, "boots added")
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "you fit [part] onto [src].")
+ boots = part
+ step = BOOTS_STEP
+ else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ gauntlets.forceMove(drop_location())
+ balloon_alert(user, "gauntlets removed")
+ gauntlets = null
+ step = CHESTPLATE_STEP
+ if(BOOTS_STEP)
+ if(part.tool_behaviour == TOOL_WRENCH) //Construct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "assembly secured")
+ step = WRENCHED_ASSEMBLY_STEP
+ else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ boots.forceMove(drop_location())
+ balloon_alert(user, "boots removed")
+ boots = null
+ step = GAUNTLETS_STEP
+ if(WRENCHED_ASSEMBLY_STEP)
+ if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "assembly screwed")
+ step = SCREWED_ASSEMBLY_STEP
+ else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "assembly unsecured")
+ step = BOOTS_STEP
+ if(SCREWED_ASSEMBLY_STEP)
+ if(istype(part, /obj/item/mod/construction/plating)) //Construct
+ var/obj/item/mod/construction/plating/external_plating = part
+ if(!user.transferItemToLoc(part, src))
+ return
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ balloon_alert(user, "suit finished")
+ var/obj/item/mod = new /obj/item/mod/control(drop_location(), external_plating.theme, null, core)
+ core = null
+ qdel(src)
+ user.put_in_hands(mod)
+ else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct
+ if(part.use_tool(src, user, 0, volume=30))
+ balloon_alert(user, "assembly unscrewed")
+ step = SCREWED_ASSEMBLY_STEP
+ update_icon_state()
+
+/obj/item/mod/construction/shell/update_icon_state()
+ . = ..()
+ icon_state = "mod-construction_[step]"
+
+/obj/item/mod/construction/shell/Destroy()
+ QDEL_NULL(core)
+ QDEL_NULL(helmet)
+ QDEL_NULL(chestplate)
+ QDEL_NULL(gauntlets)
+ QDEL_NULL(boots)
+ return ..()
+
+/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom)
+ if(deleted_atom == core)
+ core = null
+ if(deleted_atom == helmet)
+ helmet = null
+ if(deleted_atom == chestplate)
+ chestplate = null
+ if(deleted_atom == gauntlets)
+ gauntlets = null
+ if(deleted_atom == boots)
+ boots = null
+ return ..()
+
+#undef START_STEP
+#undef CORE_STEP
+#undef SCREWED_CORE_STEP
+#undef HELMET_STEP
+#undef CHESTPLATE_STEP
+#undef GAUNTLETS_STEP
+#undef BOOTS_STEP
+#undef WRENCHED_ASSEMBLY_STEP
+#undef SCREWED_ASSEMBLY_STEP
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
new file mode 100644
index 000000000000..0199662862f8
--- /dev/null
+++ b/code/modules/mod/mod_control.dm
@@ -0,0 +1,713 @@
+/// MODsuits, trade-off between armor and utility
+/obj/item/mod
+ name = "Base MOD"
+ desc = "You should not see this, yell at a coder!"
+ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+
+/obj/item/mod/control
+ name = "MOD control unit"
+ desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments."
+ icon_state = "control"
+ base_icon_state = "control"
+ item_state = "mod_control"
+ mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ strip_delay = 10 SECONDS
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "fire" = 0, "acid" = 0)
+ actions_types = list(
+ /datum/action/item_action/mod/deploy,
+ /datum/action/item_action/mod/activate,
+ /datum/action/item_action/mod/panel,
+ /datum/action/item_action/mod/module,
+ /datum/action/item_action/mod/deploy/ai,
+ /datum/action/item_action/mod/activate/ai,
+ /datum/action/item_action/mod/panel/ai,
+ /datum/action/item_action/mod/module/ai,
+ )
+ resistance_flags = NONE
+ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ siemens_coefficient = 0.5
+ //alternate_worn_layer = HAND_LAYER+0.1 //we want it to go above generally everything, but not hands
+ /// The MOD's theme, decides on some stuff like armor and statistics.
+ var/datum/mod_theme/theme = /datum/mod_theme
+ /// Looks of the MOD.
+ var/skin = "standard"
+ /// Theme of the MOD TGUI
+ var/ui_theme = "ntos"
+ /// If the suit is deployed and turned on.
+ var/active = FALSE
+ /// If the suit wire/module hatch is open.
+ var/open = FALSE
+ /// If the suit is ID locked.
+ var/locked = FALSE
+ /// If the suit is malfunctioning.
+ var/malfunctioning = FALSE
+ /// If the suit is currently activating/deactivating.
+ var/activating = FALSE
+ /// How long the MOD is electrified for.
+ var/seconds_electrified = MACHINE_NOT_ELECTRIFIED
+ /// If the suit interface is broken.
+ var/interface_break = FALSE
+ /// How much module complexity can this MOD carry.
+ var/complexity_max = DEFAULT_MAX_COMPLEXITY
+ /// How much module complexity this MOD is carrying.
+ var/complexity = 0
+ /// Power usage of the MOD.
+ var/charge_drain = DEFAULT_CHARGE_DRAIN
+ /// Slowdown of the MOD when not active.
+ var/slowdown_inactive = 1.25
+ /// Slowdown of the MOD when active.
+ var/slowdown_active = 0.75
+ /// How long this MOD takes each part to seal.
+ var/activation_step_time = MOD_ACTIVATION_STEP_TIME
+ /// Extended description of the theme.
+ var/extended_desc
+ /// MOD helmet.
+ var/obj/item/clothing/head/mod/helmet
+ /// MOD chestplate.
+ var/obj/item/clothing/suit/mod/chestplate
+ /// MOD gauntlets.
+ var/obj/item/clothing/gloves/mod/gauntlets
+ /// MOD boots.
+ var/obj/item/clothing/shoes/mod/boots
+ /// MOD core.
+ var/obj/item/mod/core/core
+ /// Associated list of parts (helmet, chestplate, gauntlets, boots) to their unsealed worn layer.
+ var/list/mod_parts = list()
+ /// Associated list of parts that can overslot to their overslot (overslot means the part can cover another layer of clothing).
+ var/list/overslotting_parts = list()
+ /// Modules the MOD should spawn with.
+ var/list/initial_modules = list()
+ /// Modules the MOD currently possesses.
+ var/list/modules = list()
+ /// Currently used module.
+ var/obj/item/mod/module/selected_module
+ /// AI mob inhabiting the MOD.
+ var/mob/living/silicon/ai/ai
+ /// Delay between moves as AI.
+ var/movedelay = 0
+ /// Cooldown for AI moves.
+ COOLDOWN_DECLARE(cooldown_mod_move)
+ /// Person wearing the MODsuit.
+ var/mob/living/carbon/human/wearer
+
+/obj/item/mod/control/Initialize(mapload, datum/mod_theme/new_theme, new_skin, obj/item/mod/core/new_core)
+ . = ..()
+ if(new_theme)
+ theme = new_theme
+ theme = GLOB.mod_themes[theme]
+ slot_flags = theme.slot_flags
+ extended_desc = theme.extended_desc
+ slowdown_inactive = theme.slowdown_inactive
+ slowdown_active = theme.slowdown_active
+ complexity_max = theme.complexity_max
+ ui_theme = theme.ui_theme
+ charge_drain = theme.charge_drain
+ initial_modules += theme.inbuilt_modules
+ wires = new /datum/wires/mod(src)
+ if(length(req_access))
+ locked = TRUE
+ new_core?.install(src)
+ helmet = new /obj/item/clothing/head/mod(src)
+ mod_parts += helmet
+ chestplate = new /obj/item/clothing/suit/mod(src)
+ chestplate.allowed = typecacheof(theme.allowed_suit_storage)
+ mod_parts += chestplate
+ gauntlets = new /obj/item/clothing/gloves/mod(src)
+ mod_parts += gauntlets
+ boots = new /obj/item/clothing/shoes/mod(src)
+ mod_parts += boots
+ var/list/all_parts = mod_parts + src
+ for(var/obj/item/part as anything in all_parts)
+ part.name = "[theme.name] [part.name]"
+ part.desc = "[part.desc] [theme.desc]"
+ part.armor = getArmor(arglist(theme.armor))
+ part.resistance_flags = theme.resistance_flags
+ part.flags_1 |= theme.atom_flags //flags like initialization or admin spawning are here, so we cant set, have to add
+ part.heat_protection = NONE
+ part.cold_protection = NONE
+ part.max_heat_protection_temperature = theme.max_heat_protection_temperature
+ part.min_cold_protection_temperature = theme.min_cold_protection_temperature
+ part.siemens_coefficient = theme.siemens_coefficient
+ for(var/obj/item/part as anything in mod_parts)
+ RegisterSignal(part, COMSIG_OBJ_DESTRUCTION, PROC_REF(on_part_destruction))
+ RegisterSignal(part, COMSIG_PARENT_QDELETING, PROC_REF(on_part_deletion))
+ set_mod_skin(new_skin || theme.default_skin)
+ update_speed()
+ for(var/obj/item/mod/module/module as anything in initial_modules)
+ module = new module(src)
+ install(module)
+ RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit))
+ movedelay = CONFIG_GET(number/movedelay/run_delay)
+
+/obj/item/mod/control/Destroy()
+ if(active)
+ STOP_PROCESSING(SSobj, src)
+ for(var/obj/item/mod/module/module as anything in modules)
+ uninstall(module, deleting = TRUE)
+ for(var/obj/item/part as anything in mod_parts)
+ overslotting_parts -= part
+ var/atom/deleting_atom
+ if(!QDELETED(helmet))
+ deleting_atom = helmet
+ helmet = null
+ mod_parts -= deleting_atom
+ qdel(deleting_atom)
+ if(!QDELETED(chestplate))
+ deleting_atom = chestplate
+ chestplate = null
+ mod_parts -= deleting_atom
+ qdel(deleting_atom)
+ if(!QDELETED(gauntlets))
+ deleting_atom = gauntlets
+ gauntlets = null
+ mod_parts -= deleting_atom
+ qdel(deleting_atom)
+ if(!QDELETED(boots))
+ deleting_atom = boots
+ boots = null
+ mod_parts -= deleting_atom
+ qdel(deleting_atom)
+ if(core)
+ QDEL_NULL(core)
+ QDEL_NULL(wires)
+ return ..()
+
+/obj/item/mod/control/obj_destruction(damage_flag)
+ for(var/obj/item/mod/module/module as anything in modules)
+ uninstall(module)
+ for(var/obj/item/part as anything in mod_parts)
+ if(!overslotting_parts[part])
+ continue
+ var/obj/item/overslot = overslotting_parts[part]
+ overslot.forceMove(drop_location())
+ overslotting_parts[part] = null
+ /*if(ai)
+ ai.controlled_equipment = null
+ ai.remote_control = null
+ for(var/datum/action/action as anything in actions)
+ if(action.owner == ai)
+ action.Remove(ai)
+ new /obj/item/mod/ai_minicard(drop_location(), ai)*/
+ return ..()
+
+/obj/item/mod/control/examine(mob/user)
+ . = ..()
+ if(active)
+ . += span_notice("Charge: [core ? "[get_charge_percent()]%" : "No core"].")
+ . += span_notice("Selected module: [selected_module || "None"].")
+ if(!open && !active)
+ . += span_notice("You could put it on your back to turn it on.")
+ . += span_notice("You could open the cover with a screwdriver.")
+ else if(open)
+ . += span_notice("You could close the cover with a screwdriver.")
+ . += span_notice("You could use modules on it to install them.")
+ . += span_notice("You could remove modules with a crowbar.")
+ . += span_notice("You could update the access lock with an ID.")
+ . += span_notice("You could access the wire panel with a wire tool.")
+ if(core)
+ . += span_notice("You could remove [core] with a wrench.")
+ else
+ . += span_notice("You could use a MOD core on it to install one.")
+ if(ai)
+ . += span_notice("You could remove [ai] with an intellicard.")
+ else
+ . += span_notice("You could install an AI with an intellicard.")
+
+/obj/item/mod/control/examine_more(mob/user)
+ . = ..()
+ . += "[extended_desc]"
+
+/obj/item/mod/control/process(delta_time)
+ if(seconds_electrified > MACHINE_NOT_ELECTRIFIED)
+ seconds_electrified--
+ if(!get_charge() && active && !activating)
+ power_off()
+ return PROCESS_KILL
+ var/malfunctioning_charge_drain = 0
+ if(malfunctioning)
+ malfunctioning_charge_drain = rand(1,20)
+ subtract_charge((charge_drain + malfunctioning_charge_drain)*delta_time)
+ update_charge_alert()
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(malfunctioning && module.active && DT_PROB(5, delta_time))
+ module.on_deactivation(display_message = TRUE)
+ module.on_process(delta_time)
+
+/obj/item/mod/control/equipped(mob/user, slot)
+ ..()
+ if(slot == slot_flags)
+ set_wearer(user)
+ else if(wearer)
+ unset_wearer()
+
+/obj/item/mod/control/dropped(mob/user)
+ . = ..()
+ if(!wearer)
+ return
+ clean_up()
+
+/obj/item/mod/control/item_action_slot_check(slot)
+ if(slot & slot_flags)
+ return TRUE
+
+/obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
+ . = ..()
+ if(!wearer || old_loc != wearer || loc == wearer)
+ return
+ clean_up()
+
+/obj/item/mod/control/allow_attack_hand_drop(mob/user)
+ if(user != wearer)
+ return ..()
+ for(var/obj/item/part as anything in mod_parts)
+ if(part.loc != src)
+ balloon_alert(user, "retract parts first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+
+/obj/item/mod/control/MouseDrop(atom/over_object)
+ if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand))
+ return ..()
+ for(var/obj/item/part as anything in mod_parts)
+ if(part.loc != src)
+ balloon_alert(wearer, "retract parts first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
+ return
+ if(!wearer.incapacitated())
+ var/atom/movable/screen/inventory/hand/ui_hand = over_object
+ if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index))
+ add_fingerprint(usr)
+ return ..()
+
+/obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench)
+ if(..())
+ return TRUE
+ if(seconds_electrified && get_charge() && shock(user))
+ return TRUE
+ if(open)
+ if(!core)
+ balloon_alert(user, "no core!")
+ return TRUE
+ balloon_alert(user, "removing core...")
+ wrench.play_tool_sound(src, 100)
+ if(!wrench.use_tool(src, user, 3 SECONDS) || !open)
+ balloon_alert(user, "interrupted!")
+ return TRUE
+ wrench.play_tool_sound(src, 100)
+ balloon_alert(user, "core removed")
+ core.forceMove(drop_location())
+ update_charge_alert()
+ return TRUE
+ return ..()
+
+/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver)
+ if(..())
+ return TRUE
+ if(active || activating)// || ai_controller)
+ balloon_alert(user, "deactivate suit first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ balloon_alert(user, "[open ? "closing" : "opening"] cover...")
+ screwdriver.play_tool_sound(src, 100)
+ if(screwdriver.use_tool(src, user, 1 SECONDS))
+ if(active || activating)
+ balloon_alert(user, "deactivate suit first!")
+ screwdriver.play_tool_sound(src, 100)
+ balloon_alert(user, "cover [open ? "closed" : "opened"]")
+ open = !open
+ else
+ balloon_alert(user, "interrupted!")
+ return TRUE
+
+/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar)
+ . = ..()
+ if(!open)
+ balloon_alert(user, "open the cover first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(!allowed(user))
+ balloon_alert(user, "insufficient access!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ if(SEND_SIGNAL(src, COMSIG_MOD_MODULE_REMOVAL, user) & MOD_CANCEL_REMOVAL)
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(length(modules))
+ var/list/removable_modules = list()
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.removable)
+ continue
+ removable_modules += module
+ var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules)
+ if(!module_to_remove?.mod)
+ return FALSE
+ uninstall(module_to_remove)
+ module_to_remove.forceMove(drop_location())
+ crowbar.play_tool_sound(src, 100)
+ return TRUE
+ balloon_alert(user, "no modules!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+
+/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params)
+ if(istype(attacking_item, /obj/item/mod/module))
+ if(!open)
+ balloon_alert(user, "open the cover first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ install(attacking_item, user)
+ return TRUE
+ else if(istype(attacking_item, /obj/item/mod/core))
+ if(!open)
+ balloon_alert(user, "open the cover first!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ if(core)
+ balloon_alert(user, "core already installed!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return FALSE
+ var/obj/item/mod/core/attacking_core = attacking_item
+ attacking_core.install(src)
+ balloon_alert(user, "core installed")
+ playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
+ update_charge_alert()
+ return TRUE
+ else if(is_wire_tool(attacking_item) && open)
+ wires.interact(user)
+ return TRUE
+ else if(open && attacking_item.GetID())
+ update_access(user, attacking_item.GetID())
+ return TRUE
+ else if(open && istype(attacking_item, /obj/item/stock_parts/cell) && istype(core, /obj/item/mod/core/standard))
+ var/obj/item/mod/core/standard/attacked_core = core
+ attacked_core.on_attackby(src, attacking_item, wearer)
+ return TRUE
+ return ..()
+
+/obj/item/mod/control/get_cell()
+ if(!open)
+ return
+ var/obj/item/stock_parts/cell/cell = get_charge_source()
+ if(!istype(cell))
+ return
+ return cell
+
+/obj/item/mod/control/GetAccess()
+ /*if(ai_controller)
+ return req_access.Copy()
+ else */
+ return ..()
+
+/obj/item/mod/control/emag_act(mob/user)
+ locked = !locked
+ balloon_alert(user, "suit access [locked ? "locked" : "unlocked"]")
+
+/obj/item/mod/control/emp_act(severity)
+ . = ..()
+ if(!active || !wearer)
+ return
+ to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!"))
+ if(. & EMP_PROTECT_CONTENTS)
+ return
+ selected_module?.on_deactivation(display_message = TRUE)
+ wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE)
+ to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly."))
+ if(wearer.stat < UNCONSCIOUS && prob(10))
+ wearer.emote("scream")
+
+/*obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
+ if(visuals_only)
+ set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped
+ quick_activation()*/
+
+/obj/item/mod/control/doStrip(mob/stripper, mob/owner)
+ if(active && !toggle_activate(stripper, force_deactivate = TRUE))
+ return
+ for(var/obj/item/part as anything in mod_parts)
+ if(part.loc == src)
+ continue
+ retract(null, part)
+ return ..()
+
+/obj/item/mod/control/worn_overlays(isinhands = FALSE, icon_file)
+ . = ..()
+ for(var/obj/item/mod/module/module as anything in modules)
+ var/list/module_icons = module.generate_worn_overlay(src.layer)
+ if(!length(module_icons))
+ continue
+ . += module_icons
+
+/obj/item/mod/control/update_icon_state()
+ item_state = "[skin]-control[active ? "-sealed" : ""]"
+ return ..()
+
+/obj/item/mod/control/proc/set_wearer(mob/user)
+ wearer = user
+ SEND_SIGNAL(src, COMSIG_MOD_WEARER_SET, wearer)
+ RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit))
+ RegisterSignal(wearer, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain))
+ update_charge_alert()
+ for(var/obj/item/mod/module/module as anything in modules)
+ module.on_equip()
+
+/obj/item/mod/control/proc/unset_wearer()
+ for(var/obj/item/mod/module/module as anything in modules)
+ module.on_unequip()
+ UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_SPECIES_GAIN))
+ wearer.clear_alert("mod_charge")
+ SEND_SIGNAL(src, COMSIG_MOD_WEARER_UNSET, wearer)
+ wearer = null
+
+/obj/item/mod/control/proc/clean_up()
+ if(active || activating)
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.active)
+ continue
+ module.on_deactivation(display_message = FALSE)
+ for(var/obj/item/part as anything in mod_parts)
+ seal_part(part, seal = FALSE)
+ for(var/obj/item/part as anything in mod_parts)
+ retract(null, part)
+ if(active)
+ finish_activation(on = FALSE)
+ var/mob/old_wearer = wearer
+ unset_wearer()
+ old_wearer.temporarilyRemoveItemFromInventory(src)
+
+/obj/item/mod/control/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species)
+ SIGNAL_HANDLER
+
+ var/list/all_parts = mod_parts + src
+ for(var/obj/item/part in all_parts)
+ if(!(part.slot_flags in new_species.no_equip) || is_type_in_list(new_species, part.species_exception))
+ continue
+ forceMove(drop_location())
+ return
+
+/obj/item/mod/control/proc/quick_module(mob/user)
+ if(!length(modules))
+ return
+ var/list/display_names = list()
+ var/list/items = list()
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(module.module_type == MODULE_PASSIVE)
+ continue
+ display_names[module.name] = REF(module)
+ var/image/module_image = image(icon = module.icon, icon_state = module.icon_state)
+ if(module == selected_module)
+ module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_selected")
+ else if(module.active)
+ module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_active")
+ if(!COOLDOWN_FINISHED(module, cooldown_timer))
+ module_image.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown"))
+ items += list(module.name = module_image)
+ if(!length(items))
+ return
+ var/radial_anchor = src
+ if(istype(user.loc, /obj/effect/dummy/phased_mob))
+ radial_anchor = get_turf(user.loc) //they're phased out via some module, anchor the radial on the turf so it may still display
+ var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
+ if(!pick)
+ return
+ var/module_reference = display_names[pick]
+ var/obj/item/mod/module/picked_module = locate(module_reference) in modules
+ if(!istype(picked_module))
+ return
+ picked_module.on_select()
+
+/obj/item/mod/control/proc/shock(mob/living/user)
+ if(!istype(user) || get_charge() < 1)
+ return FALSE
+ do_sparks(5, TRUE, src)
+ var/check_range = TRUE
+ return electrocute_mob(user, get_charge_source(), src, 0.7, check_range)
+
+/obj/item/mod/control/proc/install(obj/item/mod/module/new_module, mob/user)
+ for(var/obj/item/mod/module/old_module as anything in modules)
+ if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules))
+ if(user)
+ balloon_alert(user, "[new_module] incompatible with [old_module]!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ if(is_type_in_list(new_module, theme.module_blacklist))
+ if(user)
+ balloon_alert(user, "[src] doesn't accept [new_module]!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ var/complexity_with_module = complexity
+ complexity_with_module += new_module.complexity
+ if(complexity_with_module > complexity_max)
+ if(user)
+ balloon_alert(user, "[new_module] would make [src] too complex!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ new_module.forceMove(src)
+ modules += new_module
+ complexity += new_module.complexity
+ new_module.mod = src
+ new_module.on_install()
+ if(wearer)
+ new_module.on_equip()
+
+ if(user)
+ balloon_alert(user, "[new_module] added")
+ playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
+
+/obj/item/mod/control/proc/uninstall(obj/item/mod/module/old_module, deleting = FALSE)
+ modules -= old_module
+ complexity -= old_module.complexity
+ if(active)
+ old_module.on_suit_deactivation(deleting = deleting)
+ if(old_module.active)
+ old_module.on_deactivation(display_message = !deleting, deleting = deleting)
+ old_module.on_uninstall(deleting = deleting)
+ QDEL_LIST_ASSOC_VAL(old_module.pinned_to)
+ old_module.mod = null
+
+/// Intended for callbacks, don't use normally, just get wearer by itself.
+/obj/item/mod/control/proc/get_wearer()
+ return wearer
+
+/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card)
+ if(!allowed(user))
+ balloon_alert(user, "insufficient access!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ req_access = card.access.Copy()
+ balloon_alert(user, "access updated")
+
+/obj/item/mod/control/proc/get_charge_source()
+ return core?.charge_source()
+
+/obj/item/mod/control/proc/get_charge()
+ return core?.charge_amount() || 0
+
+/obj/item/mod/control/proc/get_max_charge()
+ return core?.max_charge_amount() || 1 //avoid dividing by 0
+
+/obj/item/mod/control/proc/get_charge_percent()
+ return ROUND_UP((get_charge() / get_max_charge()) * 100)
+
+/obj/item/mod/control/proc/add_charge(amount)
+ return core?.add_charge(amount) || FALSE
+
+/obj/item/mod/control/proc/subtract_charge(amount)
+ return core?.subtract_charge(amount) || FALSE
+
+/obj/item/mod/control/proc/check_charge(amount)
+ return core?.check_charge(amount) || FALSE
+
+/obj/item/mod/control/proc/update_charge_alert()
+ if(!wearer)
+ return
+ if(!core)
+ wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocore)
+ return
+ core.update_charge_alert()
+
+/obj/item/mod/control/proc/update_speed()
+ var/list/all_parts = mod_parts + src
+ for(var/obj/item/part as anything in all_parts)
+ part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(all_parts)
+ wearer?.update_equipment_speed_mods()
+
+/obj/item/mod/control/proc/power_off()
+ balloon_alert(wearer, "Нет энергии!")
+ toggle_activate(wearer, force_deactivate = TRUE)
+
+/obj/item/mod/control/proc/set_mod_color(new_color)
+ var/list/all_parts = mod_parts + src
+ for(var/obj/item/part as anything in all_parts)
+ part.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
+ part.add_atom_colour(new_color, FIXED_COLOUR_PRIORITY)
+ wearer?.regenerate_icons()
+
+/obj/item/mod/control/proc/set_mod_skin(new_skin)
+ if(active)
+ CRASH("[src] tried to set skin while active!")
+ skin = new_skin
+ var/list/used_skin = theme.skins[new_skin]
+ if(used_skin[CONTROL_LAYER])
+ alternate_worn_layer = used_skin[CONTROL_LAYER]
+ var/list/skin_updating = mod_parts + src
+ for(var/obj/item/part as anything in skin_updating)
+ part.icon = used_skin[MOD_ICON_OVERRIDE] || 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ //part.mob_overlay_icon = used_skin[MOD_WORN_ICON_OVERRIDE] || 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ part.icon_state = "[skin]-[part.base_icon_state]"
+ for(var/obj/item/clothing/part as anything in mod_parts)
+ var/used_category
+ if(part == helmet)
+ used_category = HELMET_FLAGS
+ if(part == chestplate)
+ used_category = CHESTPLATE_FLAGS
+ if(part == gauntlets)
+ used_category = GAUNTLETS_FLAGS
+ if(part == boots)
+ used_category = BOOTS_FLAGS
+ var/list/category = used_skin[used_category]
+ part.clothing_flags = category[UNSEALED_CLOTHING] || NONE
+ part.visor_flags = category[SEALED_CLOTHING] || NONE
+ part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE
+ part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE
+ part.flags_cover = category[UNSEALED_COVER] || NONE
+ part.visor_flags_cover = category[SEALED_COVER] || NONE
+ part.alternate_worn_layer = category[UNSEALED_LAYER]
+ mod_parts[part] = part.alternate_worn_layer
+ if(!category[CAN_OVERSLOT])
+ if(overslotting_parts[part])
+ var/obj/item/overslot = overslotting_parts[part]
+ overslot.forceMove(drop_location())
+ overslotting_parts -= part
+ continue
+ overslotting_parts |= part
+ wearer?.regenerate_icons()
+
+/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction)
+ SIGNAL_HANDLER
+
+ if(part.loc == src)
+ return
+ if(part == core)
+ core.uninstall()
+ update_charge_alert()
+ return
+ if(part.loc == wearer)
+ return
+ if(part in modules)
+ uninstall(part)
+ return
+ if(part in mod_parts)
+ if(!wearer)
+ part.forceMove(src)
+ return
+ retract(wearer, part)
+ if(active)
+ INVOKE_ASYNC(src, PROC_REF(toggle_activate), wearer, TRUE)
+
+/obj/item/mod/control/proc/on_part_destruction(obj/item/part, damage_flag)
+ SIGNAL_HANDLER
+
+ if(overslotting_parts[part])
+ var/obj/item/overslot = overslotting_parts[part]
+ overslot.forceMove(drop_location())
+ overslotting_parts[part] = null
+ if(QDELETED(src))
+ return
+ obj_destruction(damage_flag)
+
+/obj/item/mod/control/proc/on_part_deletion(obj/item/part)
+ SIGNAL_HANDLER
+
+ if(QDELETED(src))
+ return
+ qdel(src)
+
+/obj/item/mod/control/proc/on_overslot_exit(datum/source, atom/movable/overslot, direction)
+ SIGNAL_HANDLER
+
+ if(overslot != overslotting_parts[source])
+ return
+ overslotting_parts[source] = null
diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm
new file mode 100644
index 000000000000..4c9d16ef7b7d
--- /dev/null
+++ b/code/modules/mod/mod_core.dm
@@ -0,0 +1,357 @@
+/obj/item/mod/core
+ name = "MOD core"
+ desc = "A non-functional MOD core. Inform the admins if you see this."
+ icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
+ icon_state = "mod-core"
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ /// MOD unit we are powering.
+ var/obj/item/mod/control/mod
+
+/obj/item/mod/core/Destroy()
+ if(mod)
+ uninstall()
+ return ..()
+
+/obj/item/mod/core/proc/install(obj/item/mod/control/mod_unit)
+ mod = mod_unit
+ mod.core = src
+ forceMove(mod)
+
+/obj/item/mod/core/proc/uninstall()
+ mod.core = null
+ mod = null
+
+/obj/item/mod/core/proc/charge_source()
+ return
+
+/obj/item/mod/core/proc/charge_amount()
+ return 0
+
+/obj/item/mod/core/proc/max_charge_amount()
+ return 1
+
+/obj/item/mod/core/proc/add_charge(amount)
+ return FALSE
+
+/obj/item/mod/core/proc/subtract_charge(amount)
+ return FALSE
+
+/obj/item/mod/core/proc/check_charge(amount)
+ return FALSE
+
+/obj/item/mod/core/proc/update_charge_alert()
+ mod.wearer.clear_alert("mod_charge")
+
+/obj/item/mod/core/infinite
+ name = "MOD infinite core"
+ icon_state = "mod-core-infinite"
+ desc = "A fusion core using the rare Fixium to sustain enough energy for the lifetime of the MOD's user. \
+ This might be because of the slowly killing poison inside, but those are just rumors."
+
+/obj/item/mod/core/infinite/charge_source()
+ return src
+
+/obj/item/mod/core/infinite/charge_amount()
+ return INFINITY
+
+/obj/item/mod/core/infinite/max_charge_amount()
+ return INFINITY
+
+/obj/item/mod/core/infinite/add_charge(amount)
+ return TRUE
+
+/obj/item/mod/core/infinite/subtract_charge(amount)
+ return TRUE
+
+/obj/item/mod/core/infinite/check_charge(amount)
+ return TRUE
+
+/obj/item/mod/core/standard
+ name = "MOD standard core"
+ icon_state = "mod-core-standard"
+ desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \
+ These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the \
+ Ethereals, owing to their appearance; which is exactly similar to that of an Ethereal's heart.\n\
+ Which one you have in your suit is unclear, but either way, \
+ it's been repurposed to be an internal power source for a Modular Outerwear Device."
+ /// Installed cell.
+ var/obj/item/stock_parts/cell/cell
+
+/obj/item/mod/core/standard/Destroy()
+ if(cell)
+ QDEL_NULL(cell)
+ return ..()
+
+/obj/item/mod/core/standard/install(obj/item/mod/control/mod_unit)
+ . = ..()
+ if(cell)
+ install_cell(cell)
+ RegisterSignal(mod, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(mod, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand))
+ RegisterSignal(mod, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby))
+ RegisterSignal(mod, COMSIG_MOD_WEARER_SET, PROC_REF(on_wearer_set))
+ if(mod.wearer)
+ on_wearer_set(mod, mod.wearer)
+
+/obj/item/mod/core/standard/uninstall()
+ if(!QDELETED(cell))
+ cell.forceMove(drop_location())
+ UnregisterSignal(mod, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY, COMSIG_MOD_WEARER_SET))
+ if(mod.wearer)
+ on_wearer_unset(mod, mod.wearer)
+ return ..()
+
+/obj/item/mod/core/standard/charge_source()
+ return cell
+
+/obj/item/mod/core/standard/charge_amount()
+ var/obj/item/stock_parts/cell/charge_source = charge_source()
+ return charge_source?.charge || 0
+
+/obj/item/mod/core/standard/max_charge_amount(amount)
+ var/obj/item/stock_parts/cell/charge_source = charge_source()
+ return charge_source?.maxcharge || 1
+
+/obj/item/mod/core/standard/add_charge(amount)
+ var/obj/item/stock_parts/cell/charge_source = charge_source()
+ if(!charge_source)
+ return FALSE
+ return charge_source.give(amount)
+
+/obj/item/mod/core/standard/subtract_charge(amount)
+ var/obj/item/stock_parts/cell/charge_source = charge_source()
+ if(!charge_source)
+ return FALSE
+ return charge_source.use(amount, TRUE)
+
+/obj/item/mod/core/standard/check_charge(amount)
+ return charge_amount() >= amount
+
+/obj/item/mod/core/standard/update_charge_alert()
+ var/obj/item/stock_parts/cell/charge_source = charge_source()
+ if(!charge_source)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell)
+ return
+ var/remaining_cell = charge_amount() / max_charge_amount()
+ switch(remaining_cell)
+ if(0.75 to INFINITY)
+ mod.wearer.clear_alert("mod_charge")
+ if(0.5 to 0.75)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1)
+ if(0.25 to 0.5)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2)
+ if(0.01 to 0.25)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3)
+ else
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell)
+
+/obj/item/mod/core/standard/proc/install_cell(new_cell)
+ cell = new_cell
+ cell.forceMove(src)
+ RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit))
+
+/obj/item/mod/core/standard/proc/uninstall_cell()
+ if(!cell)
+ return
+ cell = null
+ UnregisterSignal(src, COMSIG_ATOM_EXITED)
+
+/obj/item/mod/core/standard/proc/on_exit(datum/source, obj/item/stock_parts/cell, direction)
+ SIGNAL_HANDLER
+
+ if(!istype(cell) || cell.loc == src)
+ return
+ uninstall_cell()
+
+/obj/item/mod/core/standard/proc/on_examine(datum/source, mob/examiner, list/examine_text)
+ SIGNAL_HANDLER
+
+ if(!mod.open)
+ return
+ examine_text += cell ? "You could remove the cell with an empty hand." : "You could use a cell on it to install one."
+
+/obj/item/mod/core/standard/proc/on_attack_hand(datum/source, mob/living/user)
+ SIGNAL_HANDLER
+
+ if(mod.seconds_electrified && charge_amount() && mod.shock(user))
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+ if(mod.open && mod.loc == user)
+ INVOKE_ASYNC(src, PROC_REF(mod_uninstall_cell), user)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+ return NONE
+
+/obj/item/mod/core/standard/proc/mod_uninstall_cell(mob/living/user)
+ if(!cell)
+ mod.balloon_alert(user, "no cell!")
+ return
+ mod.balloon_alert(user, "removing cell...")
+ if(!do_after(user, 1.5 SECONDS, target = mod))
+ mod.balloon_alert(user, "interrupted!")
+ return
+ mod.balloon_alert(user, "cell removed")
+ playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
+ var/obj/item/cell_to_move = cell
+ cell_to_move.forceMove(drop_location())
+ user.put_in_hands(cell_to_move)
+ mod.update_charge_alert()
+
+/obj/item/mod/core/standard/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user)
+ SIGNAL_HANDLER
+
+ if(istype(attacking_item, /obj/item/stock_parts/cell))
+ if(!mod.open)
+ mod.balloon_alert(user, "open the cover first!")
+ playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return NONE
+ if(cell)
+ mod.balloon_alert(user, "cell already installed!")
+ playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return COMPONENT_NO_AFTERATTACK
+ install_cell(attacking_item)
+ mod.balloon_alert(user, "cell installed")
+ playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
+ mod.update_charge_alert()
+ return COMPONENT_NO_AFTERATTACK
+ return NONE
+
+/obj/item/mod/core/standard/proc/on_wearer_set(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ RegisterSignal(mod.wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(on_borg_charge))
+ RegisterSignal(mod, COMSIG_MOD_WEARER_UNSET, PROC_REF(on_wearer_unset))
+
+/obj/item/mod/core/standard/proc/on_wearer_unset(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ UnregisterSignal(mod.wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)
+ UnregisterSignal(mod, COMSIG_MOD_WEARER_UNSET)
+
+/obj/item/mod/core/standard/proc/on_borg_charge(datum/source, amount)
+ SIGNAL_HANDLER
+
+ add_charge(amount)
+ mod.update_charge_alert()
+
+/obj/item/mod/core/ethereal
+ name = "MOD ethereal core"
+ icon_state = "mod-core-ethereal"
+ desc = "A reverse engineered core of a Modular Outerwear Device. Using natural liquid electricity from Ethereals, \
+ preventing the need to use external sources to convert electric charge."
+ /// A modifier to all charge we use, ethereals don't need to spend as much energy as normal suits.
+ var/charge_modifier = 0.1
+
+/obj/item/mod/core/ethereal/charge_source()
+ var/obj/item/organ/stomach/ethereal/ethereal_stomach = mod.wearer.getorganslot(ORGAN_SLOT_STOMACH)
+ if(!istype(ethereal_stomach))
+ return
+ return ethereal_stomach
+
+/obj/item/mod/core/ethereal/charge_amount()
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
+ return charge_source?.crystal_charge || ELZUOSE_CHARGE_NONE
+
+/obj/item/mod/core/ethereal/max_charge_amount()
+ return ELZUOSE_CHARGE_FULL
+
+/obj/item/mod/core/ethereal/add_charge(amount)
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
+ if(!charge_source)
+ return FALSE
+ charge_source.adjust_charge(amount*charge_modifier)
+ return TRUE
+
+/obj/item/mod/core/ethereal/subtract_charge(amount)
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
+ if(!charge_source)
+ return FALSE
+ charge_source.adjust_charge(-amount*charge_modifier)
+ return TRUE
+
+/obj/item/mod/core/ethereal/check_charge(amount)
+ return charge_amount() >= amount*charge_modifier
+
+/obj/item/mod/core/ethereal/update_charge_alert()
+ var/obj/item/organ/stomach/ethereal/charge_source = charge_source()
+ if(charge_source)
+ mod.wearer.clear_alert("mod_charge")
+ return
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell)
+
+/obj/item/mod/core/plasma
+ name = "MOD plasma core"
+ icon_state = "mod-core-plasma"
+ desc = "Nanotrasen's attempt at capitalizing on their plasma research. These plasma cores are refueled \
+ through plasma ore, allowing for easy continued use by their mining squads."
+ /// How much charge we can store.
+ var/maxcharge = 10000
+ /// How much charge we are currently storing.
+ var/charge = 10000
+ /// Associated list of charge sources and how much they charge, only stacks allowed.
+ var/list/charger_list = list(/obj/item/stack/ore/plasma = 1500, /obj/item/stack/sheet/mineral/plasma = 2000)
+
+/obj/item/mod/core/plasma/install(obj/item/mod/control/mod_unit)
+ . = ..()
+ RegisterSignal(mod, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby))
+
+/obj/item/mod/core/plasma/uninstall()
+ UnregisterSignal(mod, COMSIG_PARENT_ATTACKBY)
+ return ..()
+
+/obj/item/mod/core/plasma/attackby(obj/item/attacking_item, mob/user, params)
+ if(charge_plasma(attacking_item, user))
+ return TRUE
+ return ..()
+
+/obj/item/mod/core/plasma/charge_source()
+ return src
+
+/obj/item/mod/core/plasma/charge_amount()
+ return charge
+
+/obj/item/mod/core/plasma/max_charge_amount()
+ return maxcharge
+
+/obj/item/mod/core/plasma/add_charge(amount)
+ charge = min(maxcharge, charge + amount)
+ return TRUE
+
+/obj/item/mod/core/plasma/subtract_charge(amount)
+ charge = max(0, charge - amount)
+ return TRUE
+
+/obj/item/mod/core/plasma/check_charge(amount)
+ return charge_amount() >= amount
+
+/obj/item/mod/core/plasma/update_charge_alert()
+ var/remaining_plasma = charge_amount() / max_charge_amount()
+ switch(remaining_plasma)
+ if(0.75 to INFINITY)
+ mod.wearer.clear_alert("mod_charge")
+ if(0.5 to 0.75)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell/plasma, 1)
+ if(0.25 to 0.5)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell/plasma, 2)
+ if(0.01 to 0.25)
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell/plasma, 3)
+ else
+ mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell/plasma)
+
+/obj/item/mod/core/plasma/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user)
+ SIGNAL_HANDLER
+
+ if(charge_plasma(attacking_item, user))
+ return COMPONENT_NO_AFTERATTACK
+ return NONE
+
+/obj/item/mod/core/plasma/proc/charge_plasma(obj/item/stack/plasma, mob/user)
+ var/charge_given = is_type_in_list(plasma, charger_list, zebra = TRUE)
+ if(!charge_given)
+ return FALSE
+ var/uses_needed = min(plasma.amount, ROUND_UP((max_charge_amount() - charge_amount()) / charge_given))
+ if(!plasma.use(uses_needed))
+ return FALSE
+ add_charge(uses_needed * charge_given)
+ balloon_alert(user, "core refueled")
+ return TRUE
diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm
new file mode 100644
index 000000000000..aead577224bc
--- /dev/null
+++ b/code/modules/mod/mod_paint.dm
@@ -0,0 +1,192 @@
+#define MODPAINT_MAX_COLOR_VALUE 1.25
+#define MODPAINT_MIN_COLOR_VALUE 0
+#define MODPAINT_MAX_SECTION_COLORS 2
+#define MODPAINT_MIN_SECTION_COLORS 0.25
+#define MODPAINT_MAX_OVERALL_COLORS 4
+#define MODPAINT_MIN_OVERALL_COLORS 1.5
+
+/obj/item/mod/paint
+ name = "MOD paint kit"
+ desc = "This kit will repaint your MODsuit to something unique."
+ icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
+ icon_state = "paintkit"
+ var/obj/item/mod/control/editing_mod
+ var/atom/movable/screen/map_view/proxy_view
+ var/list/current_color
+
+/obj/item/mod/paint/Initialize(mapload)
+ . = ..()
+ current_color = color_matrix_identity()
+
+/obj/item/mod/paint/examine(mob/user)
+ . = ..()
+ . += span_notice("Left-click a MODsuit to change skin.")
+ //. += span_notice("Right-click a MODsuit to recolor.")
+
+/obj/item/mod/paint/pre_attack(atom/attacked_atom, mob/living/user, params)
+ if(!istype(attacked_atom, /obj/item/mod/control))
+ return ..()
+ var/obj/item/mod/control/mod = attacked_atom
+ if(mod.active || mod.activating)
+ balloon_alert(user, "suit is active!")
+ return TRUE
+ paint_skin(mod, user)
+
+/*obj/item/mod/paint/pre_attack_secondary(atom/attacked_atom, mob/living/user, params)
+ if(!istype(attacked_atom, /obj/item/mod/control))
+ return .()
+ var/obj/item/mod/control/mod = attacked_atom
+ if(mod.active || mod.activating)
+ balloon_alert(user, "suit is active!")
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ if(editing_mod)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ editing_mod = mod
+ proxy_view = new()
+ proxy_view.generate_view("color_matrix_proxy_[REF(user.client)]")
+
+ proxy_view.appearance = editing_mod.appearance
+ proxy_view.color = null
+ proxy_view.display_to(user)
+ ui_interact(user)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN*/
+
+/obj/item/mod/paint/ui_interact(mob/user, datum/tgui/ui)
+ if(!editing_mod)
+ return
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "MODpaint", name)
+ ui.open()
+
+/obj/item/mod/paint/ui_host()
+ return editing_mod
+
+/obj/item/mod/paint/ui_close(mob/user)
+ . = ..()
+ editing_mod = null
+ QDEL_NULL(proxy_view)
+ current_color = color_matrix_identity()
+
+/obj/item/mod/paint/ui_status(mob/user)
+ if(check_menu(editing_mod, user))
+ return ..()
+ return UI_CLOSE
+
+/obj/item/mod/paint/ui_static_data(mob/user)
+ var/list/data = list()
+ data["mapRef"] = proxy_view.assigned_map
+ return data
+
+/obj/item/mod/paint/ui_data(mob/user)
+ var/list/data = list()
+ data["currentColor"] = current_color
+ return data
+
+/obj/item/mod/paint/ui_act(action, list/params)
+ . = ..()
+ if(.)
+ return
+ switch(action)
+ if("transition_color")
+ current_color = params["color"]
+ animate(proxy_view, time = 0.5 SECONDS, color = current_color)
+ if("confirm")
+ if(length(current_color) != 20) //20 is the length of a matrix identity list
+ return
+ for(var/color_value in current_color)
+ if(isnum(color_value))
+ continue
+ return
+ var/total_color_value = 0
+ var/list/total_colors = current_color.Copy()
+ total_colors.Cut(13, length(total_colors)) // 13 to 20 are just a and c, dont want to count them
+ var/red_value = current_color[1] + current_color[5] + current_color[9] //rr + gr + br
+ var/green_value = current_color[2] + current_color[6] + current_color[10] //rg + gg + bg
+ var/blue_value = current_color[3] + current_color[7] + current_color[11] //rb + gb + bb
+ if(red_value > MODPAINT_MAX_SECTION_COLORS)
+ balloon_alert(usr, "total red too high! ([red_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)")
+ return
+ else if(red_value < MODPAINT_MIN_SECTION_COLORS)
+ balloon_alert(usr, "total red too low! ([red_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)")
+ return
+ if(green_value > MODPAINT_MAX_SECTION_COLORS)
+ balloon_alert(usr, "total green too high! ([green_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)")
+ return
+ else if(green_value < MODPAINT_MIN_SECTION_COLORS)
+ balloon_alert(usr, "total green too low! ([green_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)")
+ return
+ if(blue_value > MODPAINT_MAX_SECTION_COLORS)
+ balloon_alert(usr, "total blue too high! ([blue_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)")
+ return
+ else if(blue_value < MODPAINT_MIN_SECTION_COLORS)
+ balloon_alert(usr, "total blue too low! ([blue_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)")
+ return
+ for(var/color_value in total_colors)
+ total_color_value += color_value
+ if(color_value > MODPAINT_MAX_COLOR_VALUE)
+ balloon_alert(usr, "one of colors too high! ([color_value*100]%/[MODPAINT_MAX_COLOR_VALUE*100]%")
+ return
+ else if(color_value < MODPAINT_MIN_COLOR_VALUE)
+ balloon_alert(usr, "one of colors too low! ([color_value*100]%/[MODPAINT_MIN_COLOR_VALUE*100]%")
+ return
+ if(total_color_value > MODPAINT_MAX_OVERALL_COLORS)
+ balloon_alert(usr, "total colors too high! ([total_color_value*100]%/[MODPAINT_MAX_OVERALL_COLORS*100]%)")
+ return
+ else if(total_color_value < MODPAINT_MIN_OVERALL_COLORS)
+ balloon_alert(usr, "total colors too low! ([total_color_value*100]%/[MODPAINT_MIN_OVERALL_COLORS*100]%)")
+ return
+ editing_mod.set_mod_color(current_color)
+ SStgui.close_uis(src)
+
+/obj/item/mod/paint/proc/paint_skin(obj/item/mod/control/mod, mob/user)
+ if(length(mod.theme.skins) <= 1)
+ balloon_alert(user, "no alternate skins!")
+ return
+ var/list/skins = list()
+ for(var/mod_skin in mod.theme.skins)
+ skins[mod_skin] = image(icon = mod.icon, icon_state = "[mod_skin]-control")
+ var/pick = show_radial_menu(user, mod, skins, custom_check = CALLBACK(src, PROC_REF(check_menu), mod, user), require_near = TRUE)
+ if(!pick)
+ balloon_alert(user, "no skin picked!")
+ return
+ mod.set_mod_skin(pick)
+
+/obj/item/mod/paint/proc/check_menu(obj/item/mod/control/mod, mob/user)
+ if(user.incapacitated() || !user.is_holding(src) || !mod || mod.active || mod.activating)
+ return FALSE
+ return TRUE
+
+#undef MODPAINT_MAX_COLOR_VALUE
+#undef MODPAINT_MIN_COLOR_VALUE
+#undef MODPAINT_MAX_SECTION_COLORS
+#undef MODPAINT_MIN_SECTION_COLORS
+#undef MODPAINT_MAX_OVERALL_COLORS
+#undef MODPAINT_MIN_OVERALL_COLORS
+
+/obj/item/mod/skin_applier
+ name = "MOD skin applier"
+ desc = "This one-use skin applier will add a skin to MODsuits of a specific type."
+ icon = 'icons/obj/clothing/modsuit/mod_construction.dmi'
+ icon_state = "skinapplier"
+ var/skin = "civilian"
+ var/compatible_theme = /datum/mod_theme
+
+/obj/item/mod/skin_applier/Initialize(mapload)
+ . = ..()
+ name = "MOD [skin] skin applier"
+
+/obj/item/mod/skin_applier/pre_attack(atom/attacked_atom, mob/living/user, params)
+ if(!istype(attacked_atom, /obj/item/mod/control))
+ return ..()
+ var/obj/item/mod/control/mod = attacked_atom
+ if(mod.active || mod.activating)
+ balloon_alert(user, "suit is active!")
+ return TRUE
+ if(!istype(mod.theme, compatible_theme))
+ balloon_alert(user, "incompatible theme!")
+ return TRUE
+ mod.set_mod_skin(skin)
+ balloon_alert(user, "skin applied")
+ qdel(src)
+ return TRUE
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
new file mode 100644
index 000000000000..2e6325df919f
--- /dev/null
+++ b/code/modules/mod/mod_theme.dm
@@ -0,0 +1,1154 @@
+/// Global proc that sets up all MOD themes as singletons in a list and returns it.
+/proc/setup_mod_themes()
+ . = list()
+ for(var/path in typesof(/datum/mod_theme))
+ var/datum/mod_theme/new_theme = new path()
+ .[path] = new_theme
+
+/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics.
+/datum/mod_theme
+ /// Theme name for the MOD.
+ var/name = "standard"
+ /// Description added to the MOD.
+ var/desc = "A MOD suit. Placeholder Desc"
+ /// Extended description on examine_more
+ var/extended_desc = "Placeholder Desc"
+ /// Default skin of the MOD.
+ var/default_skin = "standard"
+ /// The slot this mod theme fits on
+ var/slot_flags = ITEM_SLOT_BACK
+ /// Armor shared across the MOD parts.
+ var/armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 100, "fire" = 25, "acid" = 25)
+ /// Resistance flags shared across the MOD parts.
+ var/resistance_flags = NONE
+ /// Atom flags shared across the MOD parts.
+ var/atom_flags = NONE
+ /// Max heat protection shared across the MOD parts.
+ var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
+ /// Max cold protection shared across the MOD parts.
+ var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ /// Siemens shared across the MOD parts.
+ var/siemens_coefficient = 0.5
+ /// How much modules can the MOD carry without malfunctioning.
+ var/complexity_max = DEFAULT_MAX_COMPLEXITY
+ /// How much battery power the MOD uses by just being on
+ var/charge_drain = DEFAULT_CHARGE_DRAIN
+ /// Slowdown of the MOD when not active.
+ var/slowdown_inactive = 1.25
+ /// Slowdown of the MOD when active.
+ var/slowdown_active = 0.75
+ /// Theme used by the MOD TGUI.
+ var/ui_theme = "ntos"
+ /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity.
+ var/list/inbuilt_modules = list()
+ /// Modules blacklisted from the MOD.
+ var/list/module_blacklist = list()
+ /// Allowed items in the chestplate's suit storage.
+ var/list/allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ )
+ /// List of skins with their appropriate clothing flags.
+ var/list/skins = list(
+ "standard" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ "civilian" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/engineering
+ name = "engineering"
+ default_skin = "engineering"
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 20, "energy" = 10, "bomb" = 10, "bio" = 100, "fire" = 100, "acid" = 25)
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 1.5
+ slowdown_active = 1
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/construction/rcd,
+ /obj/item/storage/bag/construction,
+ )
+ skins = list(
+ "engineering" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/atmospheric
+ name = "atmospheric"
+ default_skin = "atmospheric"
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 15, "bomb" = 10, "bio" = 100, "fire" = 100, "acid" = 75)
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ slowdown_inactive = 1.5
+ slowdown_active = 1
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/analyzer,
+ /obj/item/t_scanner,
+ /obj/item/pipe_dispenser,
+ )
+ skins = list(
+ "atmospheric" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR,
+ UNSEALED_COVER = HEADCOVERSMOUTH,
+ SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/advanced
+ name = "advanced"
+ default_skin = "advanced"
+ armor = list("melee" = 15, "bullet" = 5, "laser" = 20, "energy" = 15, "bomb" = 50, "bio" = 100, "fire" = 100, "acid" = 90)
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 1
+ slowdown_active = 0.5
+ inbuilt_modules = list(/obj/item/mod/module/magboot/advanced)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/analyzer,
+ /obj/item/t_scanner,
+ /obj/item/pipe_dispenser,
+ /obj/item/construction/rcd,
+ /obj/item/storage/bag/construction,
+ /obj/item/melee/classic_baton/telescopic,
+ )
+ skins = list(
+ "advanced" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/mining
+ name = "mining"
+ default_skin = "mining"
+ armor = list("melee" = 15, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 30, "bio" = 100, "fire" = 100, "acid" = 75)
+ resistance_flags = FIRE_PROOF|LAVA_PROOF
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ complexity_max = DEFAULT_MAX_COMPLEXITY - 5
+ charge_drain = DEFAULT_CHARGE_DRAIN * 2
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/resonator,
+ /obj/item/mining_scanner,
+ /obj/item/t_scanner/adv_mining_scanner,
+ /obj/item/pickaxe,
+ /obj/item/kinetic_crusher,
+ /obj/item/stack/ore/plasma,
+ /obj/item/storage/bag/ore,
+ )
+ inbuilt_modules = list()
+ skins = list(
+ "mining" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ "asteroid" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/loader
+ name = "loader"
+ default_skin = "loader"
+ armor = list("melee" = 15, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 10, "bio" = 10, "fire" = 25, "acid" = 25)
+ max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
+ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
+ siemens_coefficient = 0.25
+ complexity_max = DEFAULT_MAX_COMPLEXITY - 5
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/paper
+ )
+ inbuilt_modules = list(/obj/item/mod/module/clamp/loader, /obj/item/mod/module/magnet)
+ skins = list(
+ "loader" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
+ SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ ),
+ GAUNTLETS_FLAGS = list(
+ SEALED_CLOTHING = THICKMATERIAL,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ SEALED_CLOTHING = THICKMATERIAL,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/medical
+ name = "medical"
+ default_skin = "medical"
+ armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 10, "bio" = 100, "fire" = 60, "acid" = 75)
+ charge_drain = DEFAULT_CHARGE_DRAIN * 1.5
+ slowdown_inactive = 1
+ slowdown_active = 0.5
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/healthanalyzer,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/reagent_containers/pill,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/stack/medical,
+ /obj/item/sensor_device,
+ /obj/item/storage/pill_bottle,
+ /obj/item/storage/bag/chemistry,
+ /obj/item/storage/bag/bio,
+ )
+ skins = list(
+ "medical" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ "corpsman" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/rescue
+ name = "rescue"
+ default_skin = "rescue"
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 5, "energy" = 5, "bomb" = 10, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ charge_drain = DEFAULT_CHARGE_DRAIN * 1.5
+ slowdown_inactive = 0.75
+ slowdown_active = 0.25
+ inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/healthanalyzer,
+ /obj/item/reagent_containers/dropper,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/hypospray,
+ /obj/item/reagent_containers/pill,
+ /obj/item/reagent_containers/syringe,
+ /obj/item/stack/medical,
+ /obj/item/sensor_device,
+ /obj/item/storage/pill_bottle,
+ /obj/item/storage/bag/chemistry,
+ /obj/item/storage/bag/bio,
+ /obj/item/melee/classic_baton/telescopic,
+ )
+ skins = list(
+ "rescue" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/research
+ name = "research"
+ default_skin = "research"
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 5, "energy" = 5, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ complexity_max = DEFAULT_MAX_COMPLEXITY + 5
+ slowdown_inactive = 1.75
+ slowdown_active = 1.25
+ inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/analyzer,
+ /obj/item/dnainjector,
+ /obj/item/storage/bag/bio,
+ /obj/item/melee/classic_baton/telescopic,
+ )
+ skins = list(
+ "research" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/security
+ name = "security"
+ default_skin = "security"
+ armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 25, "bio" = 100, "fire" = 75, "acid" = 75)
+ complexity_max = DEFAULT_MAX_COMPLEXITY - 3
+ slowdown_inactive = 1
+ slowdown_active = 0.5
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/reagent_containers/spray/pepper,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ )
+ skins = list(
+ "security" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
+ UNSEALED_COVER = HEADCOVERSMOUTH,
+ SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/safeguard
+ name = "safeguard"
+ default_skin = "safeguard"
+ armor = list("melee" = 15, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 40, "bio" = 100, "fire" = 100, "acid" = 95)
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ slowdown_inactive = 0.75
+ slowdown_active = 0.25
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/reagent_containers/spray/pepper,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ )
+ skins = list(
+ "safeguard" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/magnate
+ name = "magnate"
+ default_skin = "magnate"
+ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 15, "bomb" = 50, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ complexity_max = DEFAULT_MAX_COMPLEXITY + 5
+ slowdown_inactive = 0.75
+ slowdown_active = 0.25
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ )
+ skins = list(
+ "magnate" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/syndicate
+ name = "syndicate"
+ default_skin = "syndicate"
+ armor = list("melee" = 15, "bullet" = 20, "laser" = 15, "energy" = 15, "bomb" = 35, "bio" = 100, "fire" = 50, "acid" = 90)
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 1
+ slowdown_active = 0.5
+ ui_theme = "syndicate"
+ inbuilt_modules = list(/obj/item/mod/module/armor_booster)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ /obj/item/melee/transforming/energy/sword,
+ /obj/item/shield/energy,
+ )
+ skins = list(
+ "syndicate" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/elite
+ name = "elite"
+ default_skin = "elite"
+ armor = list("melee" = 35, "bullet" = 30, "laser" = 35, "energy" = 35, "bomb" = 55, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 1
+ slowdown_active = 0.5
+ ui_theme = "syndicate"
+ inbuilt_modules = list(/obj/item/mod/module/armor_booster)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ /obj/item/melee/transforming/energy/sword,
+ /obj/item/shield/energy,
+ )
+ skins = list(
+ "elite" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/ninja
+ name = "ninja"
+ default_skin = "ninja"
+ armor = list("melee" = 40, "bullet" = 30, "laser" = 20, "energy" = 30, "bomb" = 30, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = LAVA_PROOF|FIRE_PROOF|ACID_PROOF
+ charge_drain = DEFAULT_CHARGE_DRAIN * 0.5
+ siemens_coefficient = 0
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ ui_theme = "hackerman"
+ inbuilt_modules = list(/obj/item/mod/module/welding/camera_vision, /obj/item/mod/module/hacker, /obj/item/mod/module/weapon_recall, /obj/item/mod/module/adrenaline_boost, /obj/item/mod/module/energy_net)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/gun,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/melee/baton,
+ /obj/item/restraints/handcuffs,
+ )
+ skins = list(
+ "ninja" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
+ SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/prototype
+ name = "prototype"
+ default_skin = "prototype"
+ armor = list("melee" = 20, "bullet" = 5, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "fire" = 100, "acid" = 75)
+ resistance_flags = FIRE_PROOF
+ siemens_coefficient = 0
+ complexity_max = DEFAULT_MAX_COMPLEXITY + 5
+ charge_drain = DEFAULT_CHARGE_DRAIN * 2
+ slowdown_inactive = 2
+ slowdown_active = 1.5
+ ui_theme = "hackerman"
+ //inbuilt_modules = list(/obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype)
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/analyzer,
+ /obj/item/t_scanner,
+ /obj/item/pipe_dispenser,
+ /obj/item/construction/rcd,
+ )
+ skins = list(
+ "prototype" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/responsory
+ name = "responsory"
+ default_skin = "responsory"
+ armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "fire" = 100, "acid" = 90)
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ resistance_flags = FIRE_PROOF
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ )
+ skins = list(
+ "responsory" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ "inquisitory" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/apocryphal
+ name = "apocryphal"
+ default_skin = "apocryphal"
+ armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 60, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ complexity_max = DEFAULT_MAX_COMPLEXITY + 10
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ /obj/item/melee/transforming/energy/sword,
+ /obj/item/shield/energy,
+ )
+ skins = list(
+ "apocryphal" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR,
+ SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/corporate
+ name = "corporate"
+ default_skin = "corporate"
+ armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ siemens_coefficient = 0
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/ammo_box,
+ /obj/item/ammo_casing,
+ /obj/item/restraints/handcuffs,
+ /obj/item/assembly/flash,
+ /obj/item/melee/baton,
+ )
+ skins = list(
+ "corporate" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/chrono
+ name = "chrono"
+ default_skin = "chrono"
+ armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ complexity_max = DEFAULT_MAX_COMPLEXITY - 10
+ slowdown_inactive = 0
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/restraints/handcuffs,
+ )
+ skins = list(
+ "chrono" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = NECK_LAYER,
+ UNSEALED_CLOTHING = SNUG_FIT,
+ SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT,
+ SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/debug
+ name = "debug"
+ default_skin = "debug"
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ complexity_max = 50
+ siemens_coefficient = 0
+ slowdown_inactive = 0.5
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/gun,
+ )
+ skins = list(
+ "debug" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
+ UNSEALED_COVER = HEADCOVERSMOUTH,
+ SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL,
+ SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
+
+/datum/mod_theme/administrative
+ name = "administrative"
+ default_skin = "debug"
+ armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF
+ atom_flags = PREVENT_CONTENTS_EXPLOSION_1
+ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ complexity_max = 1000
+ charge_drain = DEFAULT_CHARGE_DRAIN * 0
+ siemens_coefficient = 0
+ slowdown_inactive = 0
+ slowdown_active = 0
+ allowed_suit_storage = list(
+ /obj/item/flashlight,
+ /obj/item/tank/internals,
+ /obj/item/gun,
+ )
+ skins = list(
+ "debug" = list(
+ HELMET_FLAGS = list(
+ UNSEALED_LAYER = null,
+ UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT,
+ UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT,
+ SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE,
+ UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF,
+ ),
+ CHESTPLATE_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN,
+ SEALED_INVISIBILITY = HIDEJUMPSUIT,
+ ),
+ GAUNTLETS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ BOOTS_FLAGS = list(
+ UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
+ CAN_OVERSLOT = TRUE,
+ ),
+ ),
+ )
diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm
new file mode 100644
index 000000000000..6cd33197e423
--- /dev/null
+++ b/code/modules/mod/mod_types.dm
@@ -0,0 +1,331 @@
+/obj/item/mod/control/pre_equipped
+ /// The skin we apply to the suit, defaults to the default_skin of the theme.
+ var/applied_skin
+ /// The MOD core we apply to the suit.
+ var/applied_core = /obj/item/mod/core/standard
+ /// The cell we apply to the core. Only applies to standard core suits.
+ var/applied_cell = /obj/item/stock_parts/cell/high
+
+/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin, new_core)
+ new_skin = applied_skin
+ new_core = new applied_core(src)
+ if(istype(new_core, /obj/item/mod/core/standard))
+ var/obj/item/mod/core/standard/cell_core = new_core
+ cell_core.cell = new applied_cell()
+ return ..()
+
+/obj/item/mod/control/pre_equipped/standard
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ )
+
+/obj/item/mod/control/pre_equipped/engineering
+ theme = /datum/mod_theme/engineering
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/magboot,
+ )
+
+/obj/item/mod/control/pre_equipped/atmospheric
+ theme = /datum/mod_theme/atmospheric
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/t_ray,
+ )
+
+/obj/item/mod/control/pre_equipped/advanced
+ theme = /datum/mod_theme/advanced
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/jetpack,
+ )
+
+/obj/item/mod/control/pre_equipped/loader
+ theme = /datum/mod_theme/loader
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/paper_dispenser,
+ /obj/item/mod/module/stamp,
+ )
+
+/obj/item/mod/control/pre_equipped/mining
+ theme = /datum/mod_theme/mining
+ applied_core = /obj/item/mod/core/plasma
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/gps,
+ /obj/item/mod/module/orebag,
+ /obj/item/mod/module/clamp,
+ /obj/item/mod/module/drill,
+ )
+
+/obj/item/mod/control/pre_equipped/medical
+ theme = /datum/mod_theme/medical
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/health_analyzer,
+ /obj/item/mod/module/quick_carry,
+ )
+
+/obj/item/mod/control/pre_equipped/rescue
+ theme = /datum/mod_theme/rescue
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/health_analyzer,
+ /obj/item/mod/module/injector,
+ )
+
+/obj/item/mod/control/pre_equipped/research
+ theme = /datum/mod_theme/research
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ //obj/item/mod/module/circuit,
+ /obj/item/mod/module/t_ray,
+ )
+
+/obj/item/mod/control/pre_equipped/security
+ theme = /datum/mod_theme/security
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/flashlight,
+ )
+
+/obj/item/mod/control/pre_equipped/safeguard
+ theme = /datum/mod_theme/safeguard
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/megaphone,
+ )
+
+/obj/item/mod/control/pre_equipped/magnate
+ theme = /datum/mod_theme/magnate
+ applied_cell = /obj/item/stock_parts/cell/hyper
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/hat_stabilizer,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack/advanced,
+ )
+
+/obj/item/mod/control/pre_equipped/traitor
+ theme = /datum/mod_theme/syndicate
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage/syndicate,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/dna_lock,
+ )
+
+/obj/item/mod/control/pre_equipped/traitor_elite
+ theme = /datum/mod_theme/elite
+ applied_cell = /obj/item/stock_parts/cell/bluespace
+ initial_modules = list(
+ /obj/item/mod/module/storage/syndicate,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack/advanced,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/dna_lock,
+ )
+
+/obj/item/mod/control/pre_equipped/nuclear
+ theme = /datum/mod_theme/syndicate
+ applied_cell = /obj/item/stock_parts/cell/hyper
+ req_access = list(ACCESS_SYNDICATE)
+ initial_modules = list(
+ /obj/item/mod/module/storage/syndicate,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack/advanced,
+ /obj/item/mod/module/flashlight,
+ )
+
+/obj/item/mod/control/pre_equipped/elite
+ theme = /datum/mod_theme/elite
+ applied_cell = /obj/item/stock_parts/cell/bluespace
+ req_access = list(ACCESS_SYNDICATE)
+ initial_modules = list(
+ /obj/item/mod/module/storage/syndicate,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack/advanced,
+ /obj/item/mod/module/flashlight,
+ )
+
+/obj/item/mod/control/pre_equipped/elite/flamethrower
+ initial_modules = list(
+ /obj/item/mod/module/storage/syndicate,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/thermal_regulator,
+ /obj/item/mod/module/jetpack/advanced,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/flamethrower,
+ )
+
+/obj/item/mod/control/pre_equipped/ninja
+ theme = /datum/mod_theme/ninja
+ applied_cell = /obj/item/stock_parts/cell/super
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/noslip,
+ /obj/item/mod/module/status_readout,
+ /obj/item/mod/module/stealth/ninja,
+ /obj/item/mod/module/dispenser/ninja,
+ /obj/item/mod/module/dna_lock/reinforced,
+ /obj/item/mod/module/emp_shield/pulse,
+ )
+
+/obj/item/mod/control/pre_equipped/prototype
+ theme = /datum/mod_theme/prototype
+ req_access = list(ACCESS_AWAY_GENERAL)
+ initial_modules = list(
+ /obj/item/mod/module/storage,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/tether,
+ )
+
+/obj/item/mod/control/pre_equipped/responsory
+ theme = /datum/mod_theme/responsory
+ applied_cell = /obj/item/stock_parts/cell/hyper
+ req_access = list(ACCESS_CENT_GENERAL)
+ initial_modules = list(
+ /obj/item/mod/module/storage/large_capacity,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/flashlight,
+ )
+ /// The insignia type, insignias show what sort of member of the ERT you're dealing with.
+ var/insignia_type = /obj/item/mod/module/insignia
+ /// Additional module we add, as a treat.
+ var/additional_module = /obj/item/mod/module
+
+/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin, new_core)
+ initial_modules.Insert(1, insignia_type)
+ initial_modules.Add(additional_module)
+ return ..()
+
+/obj/item/mod/control/pre_equipped/responsory/commander
+ insignia_type = /obj/item/mod/module/insignia/commander
+ additional_module = /obj/item/mod/module/power_kick
+
+/obj/item/mod/control/pre_equipped/responsory/security
+ insignia_type = /obj/item/mod/module/insignia/security
+ additional_module = /obj/item/mod/module/megaphone
+
+/obj/item/mod/control/pre_equipped/responsory/engineer
+ insignia_type = /obj/item/mod/module/insignia/engineer
+ additional_module = /obj/item/mod/module/magboot
+
+/obj/item/mod/control/pre_equipped/responsory/medic
+ insignia_type = /obj/item/mod/module/insignia/medic
+ additional_module = /obj/item/mod/module/quick_carry
+
+/obj/item/mod/control/pre_equipped/responsory/janitor
+ insignia_type = /obj/item/mod/module/insignia/janitor
+ additional_module = /obj/item/mod/module/clamp
+
+/obj/item/mod/control/pre_equipped/responsory/chaplain
+ insignia_type = /obj/item/mod/module/insignia/chaplain
+ additional_module = /obj/item/mod/module/injector
+
+/obj/item/mod/control/pre_equipped/apocryphal
+ theme = /datum/mod_theme/apocryphal
+ applied_cell = /obj/item/stock_parts/cell/bluespace
+ req_access = list(ACCESS_CENT_SPECOPS)
+ initial_modules = list(
+ /obj/item/mod/module/storage/bluespace,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/emp_shield/advanced,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/jetpack,
+ )
+
+/obj/item/mod/control/pre_equipped/corporate
+ theme = /datum/mod_theme/corporate
+ applied_core = /obj/item/mod/core/infinite
+ req_access = list(ACCESS_CENT_SPECOPS)
+ initial_modules = list(
+ /obj/item/mod/module/storage/bluespace,
+ /obj/item/mod/module/hat_stabilizer,
+ /obj/item/mod/module/magnetic_harness,
+ /obj/item/mod/module/emp_shield/advanced,
+ )
+
+/*obj/item/mod/control/pre_equipped/chrono
+ theme = /datum/mod_theme/chrono
+ applied_core = /obj/item/mod/core/infinite
+ initial_modules = list(
+ /obj/item/mod/module/eradication_lock,
+ /obj/item/mod/module/emp_shield,
+ /obj/item/mod/module/timeline_jumper,
+ /obj/item/mod/module/timestopper,
+ /obj/item/mod/module/rewinder,
+ /obj/item/mod/module/tem,
+ /obj/item/mod/module/anomaly_locked/kinesis/plus,
+ )*/
+
+/obj/item/mod/control/pre_equipped/debug
+ theme = /datum/mod_theme/debug
+ applied_core = /obj/item/mod/core/infinite
+ initial_modules = list(
+ /obj/item/mod/module/storage/bluespace,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/flashlight,
+ /obj/item/mod/module/tether,
+ /obj/item/mod/module/injector,
+ )
+
+/obj/item/mod/control/pre_equipped/administrative
+ theme = /datum/mod_theme/administrative
+ applied_core = /obj/item/mod/core/infinite
+ initial_modules = list(
+ /obj/item/mod/module/storage/bluespace,
+ /obj/item/mod/module/emp_shield/advanced,
+ /obj/item/mod/module/welding,
+ /obj/item/mod/module/stealth/ninja,
+ /obj/item/mod/module/quick_carry/advanced,
+ /obj/item/mod/module/magboot/advanced,
+ /obj/item/mod/module/jetpack/advanced,
+ //obj/item/mod/module/anomaly_locked/kinesis/plus,
+ )
+
+//these exist for the prefs menu
+/obj/item/mod/control/pre_equipped/empty
+
+/obj/item/mod/control/pre_equipped/empty/syndicate
+ theme = /datum/mod_theme/syndicate
+
+/obj/item/mod/control/pre_equipped/empty/elite
+ theme = /datum/mod_theme/elite
+
+/obj/item/mod/control/pre_equipped/empty/ninja
+ theme = /datum/mod_theme/ninja
+
+INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/empty)
diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm
new file mode 100644
index 000000000000..3bfa930dea7e
--- /dev/null
+++ b/code/modules/mod/mod_ui.dm
@@ -0,0 +1,86 @@
+/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "MODsuit", name)
+ ui.open()
+
+/obj/item/mod/control/ui_data(mob/user)
+ var/data = list()
+ data["interface_break"] = interface_break
+ data["malfunctioning"] = malfunctioning
+ data["open"] = open
+ data["active"] = active
+ data["locked"] = locked
+ data["complexity"] = complexity
+ data["selected_module"] = selected_module?.name
+ data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant"
+ data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job"
+ //data[JOB_AI] = ai?.name
+ data["core"] = core?.name
+ data["charge"] = get_charge_percent()
+ data["modules"] = list()
+ for(var/obj/item/mod/module/module as anything in modules)
+ var/list/module_data = list(
+ "module_name" = module.name,
+ "description" = module.desc,
+ "module_type" = module.module_type,
+ "module_active" = module.active,
+ "pinned" = module.pinned_to[user],
+ "idle_power" = module.idle_power_cost,
+ "active_power" = module.active_power_cost,
+ "use_power" = module.use_power_cost,
+ "module_complexity" = module.complexity,
+ "cooldown_time" = module.cooldown_time,
+ "cooldown" = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS),
+ "id" = module.tgui_id,
+ "ref" = REF(module),
+ "configuration_data" = module.get_configuration()
+ )
+ module_data += module.add_ui_data()
+ data["modules"] += list(module_data)
+ return data
+
+/obj/item/mod/control/ui_static_data(mob/user)
+ var/data = list()
+ data["ui_theme"] = ui_theme
+ data["control"] = name
+ data["complexity_max"] = complexity_max
+ data["helmet"] = helmet?.name
+ data["chestplate"] = chestplate?.name
+ data["gauntlets"] = gauntlets?.name
+ data["boots"] = boots?.name
+ return data
+
+/obj/item/mod/control/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
+ if(locked && !allowed(usr))
+ balloon_alert(usr, "insufficient access!")
+ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
+ if(malfunctioning && prob(75))
+ balloon_alert(usr, "button malfunctions!")
+ return
+ switch(action)
+ if("lock")
+ locked = !locked
+ balloon_alert(usr, "[locked ? "locked" : "unlocked"]!")
+ if("activate")
+ toggle_activate(usr)
+ if("select")
+ var/obj/item/mod/module/module = locate(params["ref"]) in modules
+ if(!module)
+ return
+ module.on_select()
+ if("configure")
+ var/obj/item/mod/module/module = locate(params["ref"]) in modules
+ if(!module)
+ return
+ module.configure_edit(params["key"], params["value"])
+ if("pin")
+ var/obj/item/mod/module/module = locate(params["ref"]) in modules
+ if(!module)
+ return
+ module.pin(usr)
+ return TRUE
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
new file mode 100644
index 000000000000..7264066e5d1a
--- /dev/null
+++ b/code/modules/mod/modules/_module.dm
@@ -0,0 +1,399 @@
+///MOD Module - A special device installed in a MODsuit allowing the suit to do new stuff.
+/obj/item/mod/module
+ name = "MOD module"
+ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
+ icon_state = "module"
+ /// If it can be removed
+ var/removable = TRUE
+ /// If it's passive, togglable, usable or active
+ var/module_type = MODULE_PASSIVE
+ /// Is the module active
+ var/active = FALSE
+ /// How much space it takes up in the MOD
+ var/complexity = 0
+ /// Power use when idle
+ var/idle_power_cost = DEFAULT_CHARGE_DRAIN * 0
+ /// Power use when active
+ var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0
+ /// Power use when used, we call it manually
+ var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0
+ /// ID used by their TGUI
+ var/tgui_id
+ /// Linked MODsuit
+ var/obj/item/mod/control/mod
+ /// If we're an active module, what item are we?
+ var/obj/item/device
+ /// Overlay given to the user when the module is inactive
+ var/overlay_state_inactive
+ /// Overlay given to the user when the module is active
+ var/overlay_state_active
+ /// Overlay given to the user when the module is used, lasts until cooldown finishes
+ var/overlay_state_use
+ /// Icon file for the overlay.
+ var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi'
+ /// Does the overlay use the control unit's colors?
+ var/use_mod_colors = FALSE
+ /// What modules are we incompatible with?
+ var/list/incompatible_modules = list()
+ /// Cooldown after use
+ var/cooldown_time = 0
+ /// The mouse button needed to use this module
+ var/used_signal
+ /// List of REF()s mobs we are pinned to, linked with their action buttons
+ var/list/pinned_to = list()
+ /// If we're allowed to use this module while phased out.
+ var/allowed_in_phaseout = FALSE
+ /// If we're allowed to use this module while the suit is disabled.
+ var/allowed_inactive = FALSE
+ /// Timer for the cooldown
+ COOLDOWN_DECLARE(cooldown_timer)
+
+/obj/item/mod/module/Initialize(mapload)
+ . = ..()
+ if(module_type != MODULE_ACTIVE)
+ return
+ if(ispath(device))
+ device = new device(src)
+ ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT)
+ RegisterSignal(device, COMSIG_PARENT_QDELETING, PROC_REF(on_device_deletion))
+ RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit))
+
+/obj/item/mod/module/Destroy()
+ mod?.uninstall(src)
+ if(device)
+ UnregisterSignal(device, COMSIG_PARENT_QDELETING)
+ QDEL_NULL(device)
+ return ..()
+
+/obj/item/mod/module/examine(mob/user)
+ . = ..()
+ if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD))
+ . += span_notice("Complexity level: [complexity]")
+
+
+/// Called when the module is selected from the TGUI, radial or the action button
+/obj/item/mod/module/proc/on_select()
+ if(((!mod.active || mod.activating) && !allowed_inactive) || module_type == MODULE_PASSIVE)
+ if(mod.wearer)
+ balloon_alert(mod.wearer, "not active!")
+ return
+ if(module_type != MODULE_USABLE)
+ if(active)
+ on_deactivation()
+ else
+ on_activation()
+ else
+ on_use()
+ SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src)
+
+/// Called when the module is activated
+/obj/item/mod/module/proc/on_activation()
+ if(!COOLDOWN_FINISHED(src, cooldown_timer))
+ balloon_alert(mod.wearer, "on cooldown!")
+ return FALSE
+ if(!mod.active || mod.activating || !mod.get_charge())
+ balloon_alert(mod.wearer, "unpowered!")
+ return FALSE
+ if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob))
+ //specifically a to_chat because the user is phased out.
+ to_chat(mod.wearer, span_warning("You cannot activate this right now."))
+ return FALSE
+ if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
+ return FALSE
+ if(module_type == MODULE_ACTIVE)
+ if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE))
+ return FALSE
+ mod.selected_module = src
+ if(device)
+ if(mod.wearer.put_in_hands(device))
+ balloon_alert(mod.wearer, "[device] extended")
+ RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit))
+ RegisterSignal(mod.wearer, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(dropkey))
+ else
+ balloon_alert(mod.wearer, "can't extend [device]!")
+ mod.wearer.transferItemToLoc(device, src, force = TRUE)
+ return FALSE
+ else
+ var/used_button = MIDDLE_CLICK
+ update_signal(used_button)
+ balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use")
+ active = TRUE
+ COOLDOWN_START(src, cooldown_timer, cooldown_time)
+ mod.wearer.update_inv_back(mod.slot_flags)
+ SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED)
+ return TRUE
+
+/// Called when the module is deactivated
+/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE)
+ active = FALSE
+ if(module_type == MODULE_ACTIVE)
+ mod.selected_module = null
+ if(display_message)
+ balloon_alert(mod.wearer, device ? "[device] retracted" : "[src] deactivated")
+ if(device)
+ mod.wearer.transferItemToLoc(device, src, force = TRUE)
+ UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED)
+ UnregisterSignal(mod.wearer, COMSIG_KB_MOB_DROPITEM_DOWN)
+ else
+ UnregisterSignal(mod.wearer, used_signal)
+ used_signal = null
+ mod.wearer.update_inv_back(mod.slot_flags)
+ SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED)
+ return TRUE
+
+/// Called when the module is used
+/obj/item/mod/module/proc/on_use()
+ if(!COOLDOWN_FINISHED(src, cooldown_timer))
+ balloon_alert(mod.wearer, "on cooldown!")
+ return FALSE
+ if(!check_power(use_power_cost))
+ balloon_alert(mod.wearer, "not enough charge!")
+ return FALSE
+ if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob))
+ //specifically a to_chat because the user is phased out.
+ to_chat(mod.wearer, span_warning("You cannot activate this right now."))
+ return FALSE
+ if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE)
+ return FALSE
+ COOLDOWN_START(src, cooldown_timer, cooldown_time)
+ addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_inv_back), mod.slot_flags), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts
+ mod.wearer.update_inv_back(mod.slot_flags)
+ SEND_SIGNAL(src, COMSIG_MODULE_USED)
+ return TRUE
+
+/// Called when an activated module without a device is used
+/obj/item/mod/module/proc/on_select_use(atom/target)
+ if(mod.wearer.incapacitated(IGNORE_GRAB))
+ return FALSE
+ mod.wearer.face_atom(target)
+ if(!on_use())
+ return FALSE
+ return TRUE
+
+/// Called when an activated module without a device is active and the user alt/middle-clicks
+/obj/item/mod/module/proc/on_special_click(mob/source, atom/target)
+ SIGNAL_HANDLER
+ on_select_use(target)
+ return COMSIG_MOB_CANCEL_CLICKON
+
+/// Called on the MODsuit's process
+/obj/item/mod/module/proc/on_process(delta_time)
+ if(active)
+ if(!drain_power(active_power_cost * delta_time))
+ on_deactivation()
+ return FALSE
+ on_active_process(delta_time)
+ else
+ drain_power(idle_power_cost * delta_time)
+ return TRUE
+
+/// Called on the MODsuit's process if it is an active module
+/obj/item/mod/module/proc/on_active_process(delta_time)
+ return
+
+/// Called from MODsuit's install() proc, so when the module is installed.
+/obj/item/mod/module/proc/on_install()
+ return
+
+/// Called from MODsuit's uninstall() proc, so when the module is uninstalled.
+/obj/item/mod/module/proc/on_uninstall(deleting = FALSE)
+ return
+
+/// Called when the MODsuit is activated
+/obj/item/mod/module/proc/on_suit_activation()
+ return
+
+/// Called when the MODsuit is deactivated
+/obj/item/mod/module/proc/on_suit_deactivation(deleting = FALSE)
+ return
+
+/// Called when the MODsuit is equipped
+/obj/item/mod/module/proc/on_equip()
+ return
+
+/// Called when the MODsuit is unequipped
+/obj/item/mod/module/proc/on_unequip()
+ return
+
+/// Drains power from the suit charge
+/obj/item/mod/module/proc/drain_power(amount)
+ if(!check_power(amount))
+ return FALSE
+ mod.subtract_charge(amount)
+ mod.update_charge_alert()
+ return TRUE
+
+/// Checks if there is enough power in the suit
+/obj/item/mod/module/proc/check_power(amount)
+ return mod.check_charge(amount)
+
+/// Adds additional things to the MODsuit ui_data()
+/obj/item/mod/module/proc/add_ui_data()
+ return list()
+
+/// Creates a list of configuring options for this module
+/obj/item/mod/module/proc/get_configuration()
+ return list()
+
+/// Generates an element of the get_configuration list with a display name, type and value
+/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values)
+ return list("display_name" = display_name, "type" = type, "value" = value, "values" = values)
+
+/// Receives configure edits from the TGUI and edits the vars
+/obj/item/mod/module/proc/configure_edit(key, value)
+ return
+
+/// Called when the device moves to a different place on active modules
+/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction)
+ SIGNAL_HANDLER
+
+ if(!active)
+ return
+ if(part.loc == src)
+ return
+ if(part.loc == mod.wearer)
+ return
+ if(part == device)
+ on_deactivation(display_message = FALSE)
+
+/// Called when the device gets deleted on active modules
+/obj/item/mod/module/proc/on_device_deletion(datum/source)
+ SIGNAL_HANDLER
+
+ if(source == device)
+ device = null
+ qdel(src)
+
+/// Generates an icon to be used for the suit's worn overlays
+/obj/item/mod/module/proc/generate_worn_overlay(mod_layer)
+ . = list()
+ if(!mod.active)
+ return
+ var/used_overlay
+ if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer))
+ used_overlay = overlay_state_use
+ else if(overlay_state_active && active)
+ used_overlay = overlay_state_active
+ else if(overlay_state_inactive)
+ used_overlay = overlay_state_inactive
+ else
+ return
+ var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = mod_layer + 0.1)
+ if(!use_mod_colors)
+ module_icon.appearance_flags |= RESET_COLOR
+ . += module_icon
+
+/// Updates the signal used by active modules to be activated
+/obj/item/mod/module/proc/update_signal(value)
+ switch(value)
+ if(MIDDLE_CLICK)
+ mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON
+ if(ALT_CLICK)
+ mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON
+ RegisterSignal(mod.wearer, mod.selected_module.used_signal, TYPE_PROC_REF(/obj/item/mod/module, on_special_click))
+
+/// Pins the module to the user's action buttons
+/obj/item/mod/module/proc/pin(mob/user)
+ var/datum/action/item_action/mod/pinned_module/existing_action = pinned_to[REF(user)]
+ if(existing_action)
+ mod.remove_item_action(existing_action)
+ return
+
+ var/datum/action/item_action/mod/pinned_module/new_action = new(mod, src, user)
+ mod.add_item_action(new_action)
+
+/// On drop key, concels a device item.
+/obj/item/mod/module/proc/dropkey(mob/living/user)
+ SIGNAL_HANDLER
+
+ if(user.get_active_held_item() != device)
+ return
+ on_deactivation()
+ return COMSIG_KB_ACTIVATED
+
+///Anomaly Locked - Causes the module to not function without an anomaly.
+/obj/item/mod/module/anomaly_locked
+ name = "MOD anomaly locked module"
+ desc = "A form of a module, locked behind an anomalous core to function."
+ incompatible_modules = list(/obj/item/mod/module/anomaly_locked)
+ /// The core item the module runs off.
+ var/obj/item/assembly/signaler/anomaly/core
+ /// Accepted types of anomaly cores.
+ var/list/accepted_anomalies = list(/obj/item/assembly/signaler/anomaly)
+ /// If this one starts with a core in.
+ var/prebuilt = FALSE
+
+/obj/item/mod/module/anomaly_locked/Initialize(mapload)
+ . = ..()
+ if(!prebuilt || !length(accepted_anomalies))
+ return
+ var/core_path = pick(accepted_anomalies)
+ core = new core_path(src)
+ update_icon_state()
+
+/obj/item/mod/module/anomaly_locked/Destroy()
+ QDEL_NULL(core)
+ return ..()
+
+/obj/item/mod/module/anomaly_locked/examine(mob/user)
+ . = ..()
+ if(!length(accepted_anomalies))
+ return
+ if(core)
+ . += span_notice("There is a [core.name] installed in it. You could remove it with a screwdriver...")
+ else
+ var/list/core_list = list()
+ for(var/path in accepted_anomalies)
+ var/atom/core_path = path
+ core_list += initial(core_path.name)
+ . += span_notice("You need to insert \a [english_list(core_list, and_text = " or ")] for this module to function.")
+
+/obj/item/mod/module/anomaly_locked/on_select()
+ if(!core)
+ balloon_alert(mod.wearer, "no core!")
+ return
+ return ..()
+
+/obj/item/mod/module/anomaly_locked/on_process(delta_time)
+ . = ..()
+ if(!core)
+ return FALSE
+
+/obj/item/mod/module/anomaly_locked/on_active_process(delta_time)
+ if(!core)
+ return FALSE
+ return TRUE
+
+/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, params)
+ if(item.type in accepted_anomalies)
+ if(core)
+ balloon_alert(user, "core already in!")
+ return
+ if(!user.transferItemToLoc(item, src))
+ return
+ core = item
+ balloon_alert(user, "core installed")
+ playsound(src, 'sound/machines/click.ogg', 30, TRUE)
+ update_icon_state()
+ else
+ return ..()
+
+/obj/item/mod/module/anomaly_locked/screwdriver_act(mob/living/user, obj/item/tool)
+ . = ..()
+ if(!core)
+ balloon_alert(user, "no core!")
+ return
+ balloon_alert(user, "removing core...")
+ if(!do_after(user, 3 SECONDS, target = src))
+ balloon_alert(user, "interrupted!")
+ return
+ balloon_alert(user, "core removed")
+ core.forceMove(drop_location())
+ if(Adjacent(user) && !issilicon(user))
+ user.put_in_hands(core)
+ core = null
+ update_icon_state()
+
+/obj/item/mod/module/anomaly_locked/update_icon_state()
+ icon_state = initial(icon_state) + (core ? "-core" : "")
+ return ..()
diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm
new file mode 100644
index 000000000000..33edd75e173f
--- /dev/null
+++ b/code/modules/mod/modules/modules_antag.dm
@@ -0,0 +1,398 @@
+//Antag modules for MODsuits
+
+///Armor Booster - Grants your suit more armor and speed in exchange for EVA protection. Also acts as a welding screen.
+/obj/item/mod/module/armor_booster
+ name = "MOD armor booster module"
+ desc = "A retrofitted series of retractable armor plates, allowing the suit to function as essentially power armor, \
+ giving the user incredible protection against conventional firearms, or everyday attacks in close-quarters. \
+ However, the additional plating cannot deploy alongside parts of the suit used for vacuum sealing, \
+ so this extra armor provides zero ability for extravehicular activity while deployed."
+ icon_state = "armor_booster"
+ module_type = MODULE_TOGGLE
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ removable = TRUE
+ incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/welding)
+ cooldown_time = 0.5 SECONDS
+ overlay_state_inactive = "module_armorbooster_off"
+ overlay_state_active = "module_armorbooster_on"
+ use_mod_colors = TRUE
+ /// Whether or not this module removes pressure protection.
+ var/remove_pressure_protection = TRUE
+ /// Speed added to the control unit.
+ var/speed_added = 0.5
+ /// Speed that we actually added.
+ var/actual_speed_added = 0
+ /// Armor values added to the suit parts.
+ var/list/armor_values = list("melee" = 25, "bullet" = 30, "laser" = 15, "energy" = 15)
+ /// List of parts of the suit that are spaceproofed, for giving them back the pressure protection.
+ var/list/spaceproofed = list()
+
+/obj/item/mod/module/armor_booster/on_suit_activation()
+ mod.helmet.flash_protect = FLASH_PROTECTION_WELDER
+
+/obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE)
+ if(deleting)
+ return
+ mod.helmet.flash_protect = initial(mod.helmet.flash_protect)
+
+/obj/item/mod/module/armor_booster/on_activation()
+ . = ..()
+ if(!.)
+ return
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ actual_speed_added = max(0, min(mod.slowdown_active, speed_added))
+ mod.slowdown -= actual_speed_added
+ mod.wearer.update_equipment_speed_mods()
+ var/list/parts = mod.mod_parts + mod
+ for(var/obj/item/part as anything in parts)
+ part.armor = part.armor.modifyRating(arglist(armor_values))
+ if(!remove_pressure_protection || !isclothing(part))
+ continue
+ var/obj/item/clothing/clothing_part = part
+ if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE)
+ clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE
+ spaceproofed[clothing_part] = TRUE
+
+/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ if(!deleting)
+ playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ mod.slowdown += actual_speed_added
+ mod.wearer.update_equipment_speed_mods()
+ var/list/parts = mod.mod_parts + mod
+ var/list/removed_armor = armor_values.Copy()
+ for(var/armor_type in removed_armor)
+ removed_armor[armor_type] = -removed_armor[armor_type]
+ for(var/obj/item/part as anything in parts)
+ part.armor = part.armor.modifyRating(arglist(removed_armor))
+ if(!remove_pressure_protection || !isclothing(part))
+ continue
+ var/obj/item/clothing/clothing_part = part
+ if(spaceproofed[clothing_part])
+ clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE
+ spaceproofed = list()
+
+/obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing)
+ overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
+ overlay_state_active = "[initial(overlay_state_active)]-[mod.skin]"
+ return ..()
+
+///Energy Shield - Gives you a rechargeable energy shield that nullifies attacks.
+/obj/item/mod/module/energy_shield
+ name = "MOD energy shield module"
+ desc = "A personal, protective forcefield typically seen in military applications. \
+ This advanced deflector shield is essentially a scaled down version of those seen on starships, \
+ and the power cost can be an easy indicator of this. However, it is capable of blocking nearly any incoming attack, \
+ though with its' low amount of separate charges, the user remains mortal."
+ icon_state = "energy_shield"
+ complexity = 3
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 2
+ incompatible_modules = list(/obj/item/mod/module/energy_shield)
+ /// Max charges of the shield.
+ var/max_charges = 3
+ /// The time it takes for the first charge to recover.
+ var/recharge_start_delay = 20 SECONDS
+ /// How much time it takes for charges to recover after they started recharging.
+ var/charge_increment_delay = 1 SECONDS
+ /// How much charge is recovered per recovery.
+ var/charge_recovery = 1
+ /// Whether or not this shield can lose multiple charges.
+ var/lose_multiple_charges = FALSE
+ /// The item path to recharge this shielkd.
+ var/recharge_path = null
+ /// The icon file of the shield.
+ var/shield_icon_file = 'icons/effects/effects.dmi'
+ /// The icon_state of the shield.
+ var/shield_icon = "shield-red"
+ /// Charges the shield should start with.
+ var/charges
+
+/obj/item/mod/module/energy_shield/Initialize(mapload)
+ . = ..()
+ charges = max_charges
+
+/obj/item/mod/module/energy_shield/on_suit_activation()
+ mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \
+ charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon)
+ RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(shield_reaction))
+
+/obj/item/mod/module/energy_shield/on_suit_deactivation(deleting = FALSE)
+ var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded)
+ charges = shield.current_charges
+ qdel(shield)
+ UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS)
+
+/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0)
+ if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_HIT_REACTION_BLOCK)
+ drain_power(use_power_cost)
+ return SHIELD_BLOCK
+ return NONE
+
+///Insignia - Gives you a skin specific stripe.
+/obj/item/mod/module/insignia
+ name = "MOD insignia module"
+ desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \
+ the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \
+ they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \
+ color patterns to and from the suit."
+ icon_state = "insignia"
+ removable = FALSE
+ incompatible_modules = list(/obj/item/mod/module/insignia)
+ overlay_state_inactive = "module_insignia"
+
+/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing)
+ overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
+ . = ..()
+ for(var/mutable_appearance/appearance as anything in .)
+ appearance.color = color
+
+/obj/item/mod/module/insignia/commander
+ color = "#4980a5"
+
+/obj/item/mod/module/insignia/security
+ color = "#b30d1e"
+
+/obj/item/mod/module/insignia/engineer
+ color = "#e9c80e"
+
+/obj/item/mod/module/insignia/medic
+ color = "#ebebf5"
+
+/obj/item/mod/module/insignia/janitor
+ color = "#7925c7"
+
+/obj/item/mod/module/insignia/chaplain
+ color = "#f0a00c"
+
+///Anti Slip - Prevents you from slipping on water.
+/obj/item/mod/module/noslip
+ name = "MOD anti slip module"
+ desc = "These are a modified variant of standard magnetic boots, utilizing piezoelectric crystals on the soles. \
+ The two plates on the bottom of the boots automatically extend and magnetize as the user steps; \
+ a pull that's too weak to offer them the ability to affix to a hull, but just strong enough to \
+ protect against the fact that you didn't read the wet floor sign. Honk Co. has come out numerous times \
+ in protest of these modules being legal."
+ icon_state = "noslip"
+ complexity = 1
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.1
+ incompatible_modules = list(/obj/item/mod/module/noslip)
+
+/obj/item/mod/module/noslip/on_suit_activation()
+ mod.boots.clothing_flags |= NOSLIP
+
+/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE)
+ mod.boots.clothing_flags &= ~NOSLIP
+
+//Bite of 87 Springlock - Equips faster, disguised as DNA lock.
+/obj/item/mod/module/springlock/bite_of_87
+
+/obj/item/mod/module/springlock/bite_of_87/Initialize(mapload)
+ . = ..()
+ var/obj/item/mod/module/dna_lock/the_dna_lock_behind_the_slaughter = /obj/item/mod/module/dna_lock
+ name = initial(the_dna_lock_behind_the_slaughter.name)
+ desc = initial(the_dna_lock_behind_the_slaughter.desc)
+ icon_state = initial(the_dna_lock_behind_the_slaughter.icon_state)
+ complexity = initial(the_dna_lock_behind_the_slaughter.complexity)
+ use_power_cost = initial(the_dna_lock_behind_the_slaughter.use_power_cost)
+
+/obj/item/mod/module/springlock/bite_of_87/on_install()
+ mod.activation_step_time *= 0.1
+
+/obj/item/mod/module/springlock/bite_of_87/on_uninstall(deleting = FALSE)
+ mod.activation_step_time *= 10
+
+/obj/item/mod/module/springlock/bite_of_87/on_suit_activation()
+ ..()
+ if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS] || prob(1))
+ mod.set_mod_color("#b17f00")
+ mod.wearer.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) // turns purple guy purple
+ mod.wearer.add_atom_colour("#704b96", FIXED_COLOUR_PRIORITY)
+
+///Flamethrower - Launches fire across the area.
+/obj/item/mod/module/flamethrower
+ name = "MOD flamethrower module"
+ desc = "A custom-manufactured flamethrower, used to burn through your path. Burn well."
+ icon_state = "flamethrower"
+ module_type = MODULE_ACTIVE
+ complexity = 3
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 3
+ incompatible_modules = list(/obj/item/mod/module/flamethrower)
+ cooldown_time = 2.5 SECONDS
+ overlay_state_inactive = "module_flamethrower"
+ overlay_state_active = "module_flamethrower_on"
+
+/obj/item/mod/module/flamethrower/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ var/obj/projectile/flame = new /obj/projectile/bullet/incendiary(mod.wearer.loc)
+ flame.preparePixelProjectile(target, mod.wearer)
+ flame.firer = mod.wearer
+ playsound(src, 'sound/items/modsuit/flamethrower.ogg', 75, TRUE)
+ INVOKE_ASYNC(flame, TYPE_PROC_REF(/obj/projectile, fire))
+ drain_power(use_power_cost)
+
+///Power kick - Lets the user launch themselves at someone to kick them.
+/obj/item/mod/module/power_kick
+ name = "MOD power kick module"
+ desc = "This module uses high-power myomer to generate an incredible amount of energy, transferred into the power of a kick."
+ icon_state = "power_kick"
+ module_type = MODULE_ACTIVE
+ removable = FALSE
+ use_power_cost = DEFAULT_CHARGE_DRAIN*5
+ incompatible_modules = list(/obj/item/mod/module/power_kick)
+ cooldown_time = 5 SECONDS
+ /// Damage on kick.
+ var/damage = 20
+ /// The wound bonus of the kick.
+ var/wounding_power = 35
+ /// How long we knockdown for on the kick.
+ var/knockdown_time = 2 SECONDS
+
+/obj/item/mod/module/power_kick/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ mod.wearer.visible_message(span_warning("[mod.wearer] starts charging a kick!"), \
+ blind_message = span_hear("You hear a charging sound."))
+ playsound(src, 'sound/items/modsuit/loader_charge.ogg', 75, TRUE)
+ balloon_alert(mod.wearer, "you start charging...")
+ animate(mod.wearer, 0.3 SECONDS, pixel_z = 16, flags = ANIMATION_RELATIVE, easing = SINE_EASING|EASE_OUT)
+ addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/atom, SpinAnimation), 3, 2), 0.3 SECONDS)
+ if(!do_after(mod.wearer, 1 SECONDS, target = mod))
+ animate(mod.wearer, 0.2 SECONDS, pixel_z = -16, flags = ANIMATION_RELATIVE, easing = SINE_EASING|EASE_OUT)
+ return
+ animate(mod.wearer)
+ drain_power(use_power_cost)
+ playsound(src, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE)
+ var/angle = get_angle(mod.wearer, target) + 180
+ mod.wearer.transform = mod.wearer.transform.Turn(angle)
+ RegisterSignal(mod.wearer, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact))
+ mod.wearer.throw_at(target, range = 7, speed = 2, thrower = mod.wearer, spin = FALSE, gentle = TRUE, callback = CALLBACK(src, PROC_REF(on_throw_end), mod.wearer, -angle))
+
+/obj/item/mod/module/power_kick/proc/on_throw_end(mob/user, angle)
+ if(!user)
+ return
+ user.transform = user.transform.Turn(angle)
+ animate(user, 0.2 SECONDS, pixel_z = -16, flags = ANIMATION_RELATIVE, easing = SINE_EASING|EASE_OUT)
+
+/obj/item/mod/module/power_kick/proc/on_throw_impact(mob/living/source, obj/target, datum/thrownthing/thrownthing)
+ SIGNAL_HANDLER
+
+ UnregisterSignal(source, COMSIG_MOVABLE_IMPACT)
+ if(!mod?.wearer)
+ return
+ if(isliving(target))
+ var/mob/living/living_target = target
+ living_target.apply_damage(damage, BRUTE, mod.wearer.zone_selected)
+ living_target.Knockdown(knockdown_time)
+ else if(target.obj_integrity)
+ target.take_damage(damage, BRUTE)
+ else
+ return
+ mod.wearer.do_attack_animation(target, ATTACK_EFFECT_SMASH)
+
+///Chameleon - lets the suit disguise as any item that would fit on that slot.
+/obj/item/mod/module/chameleon
+ name = "MOD chameleon module"
+ desc = "A module using chameleon technology to disguise the suit as another object."
+ icon_state = "chameleon"
+ module_type = MODULE_USABLE
+ complexity = 2
+ incompatible_modules = list(/obj/item/mod/module/chameleon)
+ cooldown_time = 0.5 SECONDS
+ allowed_inactive = TRUE
+ /// A list of all the items the suit can disguise as.
+ var/list/possible_disguises = list()
+ /// The path of the item we're disguised as.
+ var/obj/item/current_disguise
+
+/obj/item/mod/module/chameleon/on_install()
+ var/list/all_disguises = sortList(subtypesof(get_path_by_slot(mod.slot_flags)), GLOBAL_PROC_REF(cmp_typepaths_asc))
+ for(var/clothing_path in all_disguises)
+ var/obj/item/clothing = clothing_path
+ if(!initial(clothing.icon_state))
+ continue
+ var/chameleon_item_name = "[initial(clothing.name)] ([initial(clothing.icon_state)])"
+ possible_disguises[chameleon_item_name] = clothing_path
+
+/obj/item/mod/module/chameleon/on_uninstall(deleting = FALSE)
+ if(current_disguise)
+ return_look()
+ possible_disguises = null
+
+/obj/item/mod/module/chameleon/on_use()
+ if(mod.active || mod.activating)
+ balloon_alert(mod.wearer, "suit active!")
+ return
+ . = ..()
+ if(!.)
+ return
+ if(current_disguise)
+ return_look()
+ return
+ var/picked_name = tgui_input_list(mod.wearer, "Select look to change into", "Chameleon Settings", possible_disguises)
+ if(!possible_disguises[picked_name] || mod.active || mod.activating)
+ return
+ current_disguise = possible_disguises[picked_name]
+ update_look()
+
+/obj/item/mod/module/chameleon/proc/update_look()
+ mod.name = initial(current_disguise.name)
+ mod.desc = initial(current_disguise.desc)
+ mod.icon_state = initial(current_disguise.icon_state)
+ mod.icon = initial(current_disguise.icon)
+ mod.mob_overlay_icon = initial(current_disguise.mob_overlay_icon)
+ mod.alternate_worn_layer = initial(current_disguise.alternate_worn_layer)
+ mod.lefthand_file = initial(current_disguise.lefthand_file)
+ mod.righthand_file = initial(current_disguise.righthand_file)
+ //mod.mob_overlay_state = initial(current_disguise.mob_overlay_state)
+ mod.item_state = initial(current_disguise.item_state)
+ mod.wearer.update_inv_back(mod.slot_flags)
+ RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(return_look))
+
+/obj/item/mod/module/chameleon/proc/return_look()
+ mod.name = "[mod.theme.name] [initial(mod.name)]"
+ mod.desc = "[initial(mod.desc)] [mod.theme.desc]"
+ mod.icon_state = "[mod.skin]-[initial(mod.icon_state)]"
+ var/list/mod_skin = mod.theme.skins[mod.skin]
+ mod.icon = mod_skin[MOD_ICON_OVERRIDE] || 'icons/obj/clothing/modsuit/mod_clothing.dmi'
+ mod.mob_overlay_icon = mod_skin[MOD_WORN_ICON_OVERRIDE] || 'icons/mob/clothing/modsuit/mod_clothing.dmi'
+ mod.alternate_worn_layer = mod_skin[CONTROL_LAYER]
+ mod.lefthand_file = initial(mod.lefthand_file)
+ mod.righthand_file = initial(mod.righthand_file)
+ //___callbacknewmod.worn_icon_state = null
+ mod.item_state = null
+ mod.wearer.update_inv_back(mod.slot_flags)
+ current_disguise = null
+ UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
+
+///Plate Compression - Compresses the suit to normal size
+/obj/item/mod/module/plate_compression
+ name = "MOD plate compression module"
+ desc = "A module that keeps the suit in a very tightly fit state, lowering the overall size. \
+ Due to the pressure on all the parts, typical storage modules do not fit."
+ icon_state = "plate_compression"
+ complexity = 2
+ incompatible_modules = list(/obj/item/mod/module/plate_compression, /obj/item/mod/module/storage)
+ /// The size we set the suit to.
+ var/new_size = WEIGHT_CLASS_NORMAL
+ /// The suit's size before the module is installed.
+ var/old_size
+
+/obj/item/mod/module/plate_compression/on_install()
+ old_size = mod.w_class
+ mod.w_class = new_size
+
+/obj/item/mod/module/plate_compression/on_uninstall(deleting = FALSE)
+ mod.w_class = old_size
+ old_size = null
+ if(!mod.loc)
+ return
+ var/datum/component/storage/concrete/holding_storage = mod.GetComponent(/datum/component/storage/concrete)
+ if(!holding_storage || holding_storage.max_combined_w_class >= mod.w_class)
+ return
+ mod.forceMove(drop_location())
diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm
new file mode 100644
index 000000000000..4905b3ae691f
--- /dev/null
+++ b/code/modules/mod/modules/modules_engineering.dm
@@ -0,0 +1,169 @@
+//Engineering modules for MODsuits
+
+///Welding Protection - Makes the helmet protect from flashes and welding.
+/obj/item/mod/module/welding
+ name = "MOD welding protection module"
+ desc = "A module installed into the visor of the suit, this projects a \
+ polarized, holographic overlay in front of the user's eyes. It's rated high enough for \
+ immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights."
+ icon_state = "welding"
+ complexity = 1
+ incompatible_modules = list(/obj/item/mod/module/welding, /obj/item/mod/module/armor_booster)
+ overlay_state_inactive = "module_welding"
+
+/obj/item/mod/module/welding/on_suit_activation()
+ mod.helmet.flash_protect = FLASH_PROTECTION_WELDER
+
+/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE)
+ if(deleting)
+ return
+ mod.helmet.flash_protect = initial(mod.helmet.flash_protect)
+
+///T-Ray Scan - Scans the terrain for undertile objects.
+/obj/item/mod/module/t_ray
+ name = "MOD t-ray scan module"
+ desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \
+ to essentially echolocate things beneath the floor, mostly cables and pipes. \
+ A staple of atmospherics work, and counter-smuggling work."
+ icon_state = "tray"
+ module_type = MODULE_TOGGLE
+ complexity = 1
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ incompatible_modules = list(/obj/item/mod/module/t_ray)
+ cooldown_time = 0.5 SECONDS
+ /// T-ray scan range.
+ var/range = 4
+
+/obj/item/mod/module/t_ray/on_active_process(delta_time)
+ t_ray_scan(mod.wearer, 0.8 SECONDS, range)
+
+///Magnetic Stability - Gives the user a slowdown but makes them negate gravity and be immune to slips.
+/obj/item/mod/module/magboot
+ name = "MOD magnetic stability module"
+ desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \
+ excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \
+ However, these basic models do not feature computerized systems to automatically toggle them on and off, \
+ so numerous users report a certain stickiness to their steps."
+ icon_state = "magnet"
+ module_type = MODULE_TOGGLE
+ complexity = 2
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ incompatible_modules = list(/obj/item/mod/module/magboot)
+ cooldown_time = 0.5 SECONDS
+ /// Slowdown added onto the suit.
+ var/slowdown_active = 0.5
+
+/obj/item/mod/module/magboot/on_activation()
+ . = ..()
+ if(!.)
+ return
+ ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT)
+ mod.slowdown += slowdown_active
+ mod.wearer.update_gravity(mod.wearer.has_gravity())
+ mod.wearer.update_equipment_speed_mods()
+
+/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT)
+ mod.slowdown -= slowdown_active
+ mod.wearer.update_gravity(mod.wearer.has_gravity())
+ mod.wearer.update_equipment_speed_mods()
+
+/obj/item/mod/module/magboot/advanced
+ name = "MOD advanced magnetic stability module"
+ removable = FALSE
+ complexity = 0
+ slowdown_active = 0
+
+///Emergency Tether - Shoots a grappling hook projectile in 0g that throws the user towards it.
+/obj/item/mod/module/tether
+ name = "MOD emergency tether module"
+ desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \
+ While some older models of cargo-oriented grapples have capacities of a few tons, \
+ these are only capable of working in zero-gravity environments, a blessing to some Engineers."
+ icon_state = "tether"
+ module_type = MODULE_ACTIVE
+ complexity = 3
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/tether)
+ cooldown_time = 1.5 SECONDS
+
+/obj/item/mod/module/tether/on_use()
+ if(mod.wearer.has_gravity(get_turf(src)))
+ balloon_alert(mod.wearer, "too much gravity!!")
+ playsound(src, 'sound/weapons/gun/general/dry_fire.ogg', 25, TRUE)
+ return FALSE
+ return ..()
+
+/obj/item/mod/module/tether/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ var/obj/projectile/tether = new /obj/projectile/tether(mod.wearer.loc)
+ tether.preparePixelProjectile(target, mod.wearer)
+ tether.firer = mod.wearer
+ playsound(src, 'sound/weapons/batonextend.ogg', 25, TRUE)
+ INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/projectile, fire))
+ drain_power(use_power_cost)
+
+/obj/projectile/tether
+ name = "tether"
+ icon_state = "tether_projectile"
+ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
+ damage = 0
+ nodamage = TRUE
+ range = 10
+ hitsound = 'sound/weapons/batonextend.ogg'
+ suppressed = SUPPRESSED_VERY
+ //hit_threshhold = LATTICE_LAYER
+ /// Reference to the beam following the projectile.
+ var/line
+
+/obj/projectile/tether/fire(setAngle)
+ if(firer)
+ line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi')
+ ..()
+
+/obj/projectile/tether/on_hit(atom/target)
+ . = ..()
+ if(firer)
+ firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE)
+
+/obj/projectile/tether/Destroy()
+ QDEL_NULL(line)
+ return ..()
+
+///Mister - Sprays water over an area.
+/obj/item/mod/module/mister
+ name = "MOD water mister module"
+ desc = "A module containing a mister, able to spray it over areas."
+ icon_state = "mister"
+ module_type = MODULE_ACTIVE
+ complexity = 2
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ device = /obj/item/reagent_containers/spray/mister
+ incompatible_modules = list(/obj/item/mod/module/mister)
+ cooldown_time = 0.5 SECONDS
+ /// Volume of our reagent holder.
+ var/volume = 500
+
+/obj/item/mod/module/mister/Initialize(mapload)
+ create_reagents(volume, OPENCONTAINER)
+ return ..()
+
+///Resin Mister - Sprays resin over an area.
+/obj/item/mod/module/mister/atmos
+ name = "MOD resin mister module"
+ desc = "An atmospheric resin mister, able to fix up areas quickly."
+ device = /obj/item/extinguisher/mini/nozzle/mod
+ volume = 250
+
+/obj/item/mod/module/mister/atmos/Initialize(mapload)
+ . = ..()
+ reagents.add_reagent(/datum/reagent/water, volume)
+
+/obj/item/extinguisher/mini/nozzle/mod
+ name = "MOD atmospheric mister"
+ desc = "An atmospheric resin mister with three modes, mounted as a module."
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
new file mode 100644
index 000000000000..8c5f9e27cf55
--- /dev/null
+++ b/code/modules/mod/modules/modules_general.dm
@@ -0,0 +1,445 @@
+//General modules for MODsuits
+
+///Ion Jetpack - Lets the user fly freely through space using battery charge.
+/obj/item/mod/module/jetpack
+ name = "MOD ion jetpack module"
+ desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \
+ Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \
+ charge from the suit's charge. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits."
+ icon_state = "jetpack"
+ module_type = MODULE_TOGGLE
+ complexity = 3
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/jetpack)
+ cooldown_time = 0.5 SECONDS
+ overlay_state_inactive = "module_jetpack"
+ overlay_state_active = "module_jetpack_on"
+ /// Do we stop the wearer from gliding in space.
+ var/stabilizers = FALSE
+ /// Do we give the wearer a speed buff.
+ var/full_speed = FALSE
+ var/datum/callback/get_mover
+ var/datum/callback/check_on_move
+
+/obj/item/mod/module/jetpack/Initialize(mapload)
+ . = ..()
+ get_mover = CALLBACK(src, PROC_REF(get_user))
+ check_on_move = CALLBACK(src, PROC_REF(allow_thrust))
+ refresh_jetpack()
+
+/obj/item/mod/module/jetpack/Destroy()
+ get_mover = null
+ check_on_move = null
+ return ..()
+
+/obj/item/mod/module/jetpack/proc/refresh_jetpack()
+ AddComponent(/datum/component/jetpack, stabilizers, COMSIG_MODULE_TRIGGERED, COMSIG_MODULE_DEACTIVATED, MOD_ABORT_USE, get_mover, check_on_move, /datum/effect_system/trail_follow/ion/grav_allowed)
+
+/obj/item/mod/module/jetpack/proc/set_stabilizers(new_stabilizers)
+ if(stabilizers == new_stabilizers)
+ return
+ stabilizers = new_stabilizers
+ refresh_jetpack()
+
+/obj/item/mod/module/jetpack/on_activation()
+ . = ..()
+ if(!.)
+ return
+ if(full_speed)
+ mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
+
+/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(full_speed)
+ mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed)
+
+/obj/item/mod/module/jetpack/get_configuration()
+ . = ..()
+ .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers)
+
+/obj/item/mod/module/jetpack/configure_edit(key, value)
+ switch(key)
+ if("stabilizers")
+ set_stabilizers(text2num(value))
+
+/obj/item/mod/module/jetpack/proc/allow_thrust(use_fuel = TRUE)
+ if(!use_fuel)
+ return check_power(use_power_cost)
+ if(!drain_power(use_power_cost))
+ return FALSE
+ return TRUE
+
+/obj/item/mod/module/jetpack/proc/get_user()
+ return mod.wearer
+
+/obj/item/mod/module/jetpack/advanced
+ name = "MOD advanced ion jetpack module"
+ desc = "An improvement on the previous model of electric thrusters. This one achieves higher speeds through \
+ mounting of more jets and a red paint applied on it."
+ icon_state = "jetpack_advanced"
+ overlay_state_inactive = "module_jetpackadv"
+ overlay_state_active = "module_jetpackadv_on"
+ full_speed = TRUE
+
+///Eating Apparatus - Lets the user eat/drink with the suit on.
+/obj/item/mod/module/mouthhole
+ name = "MOD eating apparatus module"
+ desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \
+ to allow eating and drinking while retaining protection and atmosphere. However, it won't free you from masks, \
+ and it will do nothing to improve the taste of a goliath steak."
+ icon_state = "apparatus"
+ complexity = 1
+ incompatible_modules = list(/obj/item/mod/module/mouthhole)
+ overlay_state_inactive = "module_apparatus"
+ /// Former flags of the helmet.
+ var/former_flags = NONE
+ /// Former visor flags of the helmet.
+ var/former_visor_flags = NONE
+
+/obj/item/mod/module/mouthhole/on_install()
+ former_flags = mod.helmet.flags_cover
+ former_visor_flags = mod.helmet.visor_flags_cover
+ mod.helmet.flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF
+ mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF
+
+/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE)
+ if(deleting)
+ return
+ mod.helmet.flags_cover |= former_flags
+ mod.helmet.visor_flags_cover |= former_visor_flags
+
+///EMP Shield - Protects the suit from EMPs.
+/obj/item/mod/module/emp_shield
+ name = "MOD EMP shield module"
+ desc = "A field inhibitor installed into the suit, protecting it against feedback such as \
+ electromagnetic pulses that would otherwise damage the electronic systems of the suit or devices on the wearer. \
+ However, it will take from the suit's power to do so. Luckily, your PDA already has one of these."
+ icon_state = "empshield"
+ complexity = 1
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/emp_shield)
+
+/obj/item/mod/module/emp_shield/on_install()
+ mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS)
+
+/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE)
+ mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS)
+
+/obj/item/mod/module/emp_shield/advanced
+ name = "MOD advanced EMP shield module"
+ desc = "An enhnanced field inhibitor installed into the suit, protecting it against feedback such as \
+ electromagnetic pulses that would otherwise damage the electronic systems of the suit or devices on the wearer \
+ including augmentations. However, it will take from the suit's power to do so. Luckily, your PDA already has one of these."
+ complexity = 2
+
+/obj/item/mod/module/emp_shield/advanced/on_suit_activation()
+ mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
+
+/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting)
+ mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS)
+
+///Flashlight - Gives the suit a customizable flashlight.
+/obj/item/mod/module/flashlight
+ name = "MOD flashlight module"
+ desc = "A simple pair of flashlights installed on the left and right sides of the helmet."
+ icon_state = "flashlight"
+ module_type = MODULE_TOGGLE
+ complexity = 1
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/flashlight)
+ cooldown_time = 0.5 SECONDS
+ overlay_state_inactive = "module_light"
+ light_system = MOVABLE_LIGHT_DIRECTIONAL
+ light_color = COLOR_WHITE
+ light_range = 4
+ light_power = 1
+ light_on = FALSE
+ /// Charge drain per range amount.
+ var/base_power = DEFAULT_CHARGE_DRAIN * 0.1
+
+/obj/item/mod/module/flashlight/on_activation()
+ . = ..()
+ if(!.)
+ return
+ set_light_flags(light_flags | LIGHT_ATTACHED)
+ set_light_on(active)
+ active_power_cost = base_power * light_range
+
+/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ set_light_flags(light_flags & ~LIGHT_ATTACHED)
+ set_light_on(active)
+
+/obj/item/mod/module/flashlight/on_process(delta_time)
+ active_power_cost = base_power * light_range
+ return ..()
+
+/obj/item/mod/module/flashlight/generate_worn_overlay(mutable_appearance/standing)
+ . = ..()
+ if(!active)
+ return
+ var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on", layer = standing + 0.2)
+ light_icon.appearance_flags = RESET_COLOR
+ light_icon.color = light_color
+ . += light_icon
+
+///Dispenser - Dispenses an item after a time passes.
+/obj/item/mod/module/dispenser
+ name = "MOD burger dispenser module"
+ desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \
+ This can draw incredible amounts of power from the suit's charge to create edible organic matter in the \
+ palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \
+ Notably, all attempts to get it to dispense Earl Grey tea have failed."
+ icon_state = "dispenser"
+ module_type = MODULE_USABLE
+ complexity = 3
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 2
+ incompatible_modules = list(/obj/item/mod/module/dispenser)
+ cooldown_time = 5 SECONDS
+ /// Path we dispense.
+ var/dispense_type = /obj/item/reagent_containers/food/snacks/burger
+ /// Time it takes for us to dispense.
+ var/dispense_time = 0 SECONDS
+
+/obj/item/mod/module/dispenser/on_use()
+ . = ..()
+ if(!.)
+ return
+ if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod))
+ balloon_alert(mod.wearer, "interrupted!")
+ return FALSE
+ var/obj/item/dispensed = new dispense_type(mod.wearer.loc)
+ mod.wearer.put_in_hands(dispensed)
+ balloon_alert(mod.wearer, "[dispensed] dispensed")
+ playsound(src, 'sound/machines/click.ogg', 100, TRUE)
+ drain_power(use_power_cost)
+ return dispensed
+
+///Thermal Regulator - Regulates the wearer's core temperature.
+/obj/item/mod/module/thermal_regulator
+ name = "MOD thermal regulator module"
+ desc = "Advanced climate control, using an inner body glove interwoven with thousands of tiny, \
+ flexible cooling lines. This circulates coolant at various user-controlled temperatures, \
+ ensuring they're comfortable; even if they're some that like it hot."
+ icon_state = "regulator"
+ module_type = MODULE_TOGGLE
+ complexity = 2
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/thermal_regulator)
+ cooldown_time = 0.5 SECONDS
+ /// The temperature we are regulating to.
+ var/temperature_setting = BODYTEMP_NORMAL
+ /// Minimum temperature we can set.
+ var/min_temp = 293.15
+ /// Maximum temperature we can set.
+ var/max_temp = 318.15
+
+/obj/item/mod/module/thermal_regulator/get_configuration()
+ . = ..()
+ .["temperature_setting"] = add_ui_configuration("Temperature", "number", temperature_setting - T0C)
+
+/obj/item/mod/module/thermal_regulator/configure_edit(key, value)
+ switch(key)
+ if("temperature_setting")
+ temperature_setting = clamp(value + T0C, min_temp, max_temp)
+
+/obj/item/mod/module/thermal_regulator/on_active_process(delta_time)
+ mod.wearer.adjust_bodytemperature(get_temp_change_amount((temperature_setting - mod.wearer.bodytemperature), 0.08 * delta_time))
+
+///DNA Lock - Prevents people without the set DNA from activating the suit.
+/obj/item/mod/module/dna_lock
+ name = "MOD DNA lock module"
+ desc = "A module which engages with the various locks and seals tied to the suit's systems, \
+ enabling it to only be worn by someone corresponding with the user's exact DNA profile; \
+ however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed."
+ icon_state = "dnalock"
+ module_type = MODULE_USABLE
+ complexity = 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 3
+ incompatible_modules = list(/obj/item/mod/module/dna_lock/*, obj/item/mod/module/eradication_lock*/)
+ cooldown_time = 0.5 SECONDS
+ /// The DNA we lock with.
+ var/dna = null
+
+/obj/item/mod/module/dna_lock/on_install()
+ RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_mod_activation))
+ RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, PROC_REF(on_mod_removal))
+ RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp))
+ RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag))
+
+/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE)
+ UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
+ UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL)
+ UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT)
+ UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT)
+
+/obj/item/mod/module/dna_lock/on_use()
+ . = ..()
+ if(!.)
+ return
+ dna = mod.wearer.dna.unique_enzymes
+ balloon_alert(mod.wearer, "dna updated")
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/dna_lock/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ on_emp(src, severity)
+
+/obj/item/mod/module/dna_lock/emag_act(mob/user, obj/item/card/emag/emag_card)
+ . = ..()
+ on_emag(src, user, emag_card)
+
+/obj/item/mod/module/dna_lock/proc/dna_check(mob/user)
+ if(!iscarbon(user))
+ return FALSE
+ var/mob/living/carbon/carbon_user = user
+ if(!dna || (carbon_user.has_dna() && carbon_user.dna.unique_enzymes == dna))
+ return TRUE
+ balloon_alert(user, "dna locked!")
+ return FALSE
+
+/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity)
+ SIGNAL_HANDLER
+
+ dna = null
+
+/obj/item/mod/module/dna_lock/proc/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card)
+ SIGNAL_HANDLER
+
+ dna = null
+
+/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ if(!dna_check(user))
+ return MOD_CANCEL_ACTIVATE
+
+/obj/item/mod/module/dna_lock/proc/on_mod_removal(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ if(!dna_check(user))
+ return MOD_CANCEL_REMOVAL
+
+///Plasma Stabilizer - Prevents plasmamen from igniting in the suit
+/obj/item/mod/module/plasma_stabilizer
+ name = "MOD plasma stabilizer module"
+ desc = "This system essentially forms an atmosphere of its' own inside the suit, \
+ safely ejecting oxygen from the inside and allowing the wearer, a plasmaman, \
+ to have their internal plasma circulate around them somewhat like a sauna. \
+ This prevents them from self-igniting, and leads to greater comfort overall. \
+ The purple glass of the visor seems to be constructed for nostalgic purposes."
+ icon_state = "plasma_stabilizer"
+ complexity = 1
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer)
+ overlay_state_inactive = "module_plasma"
+
+/obj/item/mod/module/plasma_stabilizer/on_equip()
+ ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION_HEAD_ONLY, MOD_TRAIT)
+
+/obj/item/mod/module/plasma_stabilizer/on_unequip()
+ REMOVE_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION_HEAD_ONLY, MOD_TRAIT)
+
+
+//Finally, https://pipe.miroware.io/5b52ba1d94357d5d623f74aa/mspfa/Nuke%20Ops/Panels/0648.gif can be real:
+///Hat Stabilizer - Allows displaying a hat over the MOD-helmet, à la plasmamen helmets.
+/obj/item/mod/module/hat_stabilizer
+ name = "MOD hat stabilizer module"
+ desc = "A simple set of deployable stands, directly atop one's head; \
+ these will deploy under a select few hats to keep them from falling off, allowing them to be worn atop the sealed helmet. \
+ You still need to take the hat off your head while the helmet deploys, though. \
+ This is a must-have for Nanotrasen Captains, enabling them to show off their authoritative hat even while in their MODsuit."
+ icon_state = "hat_holder"
+ incompatible_modules = list(/obj/item/mod/module/hat_stabilizer)
+ /*Intentionally left inheriting 0 complexity and removable = TRUE;
+ even though it comes inbuilt into the Magnate/Corporate MODS and spawns in maints, I like the idea of stealing them*/
+ /// Currently "stored" hat. No armor or function will be inherited, ONLY the icon.
+ var/obj/item/clothing/head/attached_hat
+ /// Whitelist of attachable hats, read note in Initialize() below this line
+ var/static/list/attachable_hats_list
+
+/obj/item/mod/module/hat_stabilizer/Initialize(mapload)
+ . = ..()
+ attachable_hats_list = typecacheof(
+ //List of attachable hats. Make sure these and their subtypes are all tested, so they dont appear janky.
+ //This list should also be gimmicky, so captains can have fun. I.E. the Santahat, Pirate hat, Tophat, Chefhat...
+ //Yes, I said it, the captain should have fun.
+ list(
+ /obj/item/clothing/head/caphat,
+ /obj/item/clothing/head/crown,
+ /obj/item/clothing/head/centhat,
+ /obj/item/clothing/head/pirate,
+ /obj/item/clothing/head/santa,
+ /obj/item/clothing/head/hardhat/reindeer,
+ /obj/item/clothing/head/sombrero,
+ /obj/item/clothing/head/kitty,
+ /obj/item/clothing/head/rabbitears,
+ /obj/item/clothing/head/festive,
+ /obj/item/clothing/head/powdered_wig,
+ /obj/item/clothing/head/that,
+ /obj/item/clothing/head/nursehat,
+ /obj/item/clothing/head/chefhat,
+ /obj/item/clothing/head/papersack,
+ ))
+
+/obj/item/mod/module/hat_stabilizer/on_suit_activation()
+ RegisterSignal(mod.helmet, COMSIG_PARENT_EXAMINE, PROC_REF(add_examine))
+ RegisterSignal(mod.helmet, COMSIG_PARENT_ATTACKBY, PROC_REF(place_hat))
+ RegisterSignal(mod.helmet, COMSIG_CLICK_ALT, PROC_REF(remove_hat))
+
+/obj/item/mod/module/hat_stabilizer/on_suit_deactivation(deleting = FALSE)
+ if(deleting)
+ return
+ if(attached_hat) //knock off the helmet if its on their head. Or, technically, auto-rightclick it for them; that way it saves us code, AND gives them the bubble
+ remove_hat(src, mod.wearer)
+ UnregisterSignal(mod.helmet, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(mod.helmet, COMSIG_PARENT_ATTACKBY)
+ UnregisterSignal(mod.helmet, COMSIG_CLICK_ALT)
+
+/obj/item/mod/module/hat_stabilizer/proc/add_examine(datum/source, mob/user, list/base_examine)
+ SIGNAL_HANDLER
+ if(attached_hat)
+ base_examine += span_notice("There's \a [attached_hat] placed on the helmet. Alt-click to remove it.")
+ else
+ base_examine += span_notice("There's nothing placed on the helmet. Yet.")
+
+/obj/item/mod/module/hat_stabilizer/proc/place_hat(datum/source, obj/item/hitting_item, mob/user)
+ SIGNAL_HANDLER
+ if(!istype(hitting_item, /obj/item/clothing/head))
+ return
+ if(!mod.active)
+ balloon_alert(user, "suit must be active!")
+ return
+ if(!is_type_in_typecache(hitting_item, attachable_hats_list))
+ balloon_alert(user, "this hat won't fit!")
+ return
+ if(attached_hat)
+ balloon_alert(user, "hat already attached!")
+ return
+ if(mod.wearer.transferItemToLoc(hitting_item, src, force = FALSE, silent = TRUE))
+ attached_hat = hitting_item
+ balloon_alert(user, "hat attached, alt-click to remove")
+ mod.wearer.update_inv_back(mod.slot_flags)
+
+/obj/item/mod/module/hat_stabilizer/generate_worn_overlay()
+ . = ..()
+ if(attached_hat)
+ . += attached_hat.build_worn_icon(default_layer = ABOVE_MOB_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi')
+
+/obj/item/mod/module/hat_stabilizer/proc/remove_hat(datum/source, mob/user)
+ SIGNAL_HANDLER
+ . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ if(!attached_hat)
+ return
+ attached_hat.forceMove(drop_location())
+ if(user.put_in_active_hand(attached_hat))
+ balloon_alert(user, "hat removed")
+ else
+ balloon_alert_to_viewers("the hat falls to the floor!")
+ attached_hat = null
+ mod.wearer.update_inv_back(mod.slot_flags)
diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm
new file mode 100644
index 000000000000..e735654ef2c5
--- /dev/null
+++ b/code/modules/mod/modules/modules_maint.dm
@@ -0,0 +1,148 @@
+//Maint modules for MODsuits
+
+///Springlock Mechanism - allows your modsuit to activate faster, but reagents are very dangerous.
+/obj/item/mod/module/springlock
+ name = "MOD springlock module"
+ desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \
+ This mechanical exoskeleton pushes out of the way when the user enters and it helps in booting \
+ up, but was taken out of modern suits because of the springlock's tendency to \"snap\" back \
+ into place when exposed to humidity. You know what it's like to have an entire exoskeleton enter you?"
+ icon_state = "springlock"
+ complexity = 3 // it is inside every part of your suit, so
+ incompatible_modules = list(/obj/item/mod/module/springlock)
+
+/obj/item/mod/module/springlock/on_install()
+ mod.activation_step_time *= 0.5
+
+/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE)
+ mod.activation_step_time *= 2
+
+/obj/item/mod/module/springlock/on_suit_activation()
+ RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed))
+
+/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE)
+ UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS)
+
+///Signal fired when wearer is exposed to reagents
+/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message)
+ SIGNAL_HANDLER
+
+ if(!(methods & (VAPOR|PATCH|TOUCH)))
+ return //remove non-touch reagent exposure
+ to_chat(mod.wearer, span_danger("[src] makes an ominous click sound..."))
+ playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE)
+ addtimer(CALLBACK(src, PROC_REF(snap_shut)), rand(3 SECONDS, 5 SECONDS))
+ RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_spring_block))
+
+///Signal fired when wearer attempts to activate/deactivate suits
+/obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user)
+ SIGNAL_HANDLER
+
+ balloon_alert(user, "springlocks aren't responding...?")
+ return MOD_CANCEL_ACTIVATE
+
+///Delayed death proc of the suit after the wearer is exposed to reagents
+/obj/item/mod/module/springlock/proc/snap_shut()
+ UnregisterSignal(mod, COMSIG_MOD_ACTIVATE)
+ if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc
+ return
+ mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*"))
+ mod.wearer.emote("scream")
+ playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
+ playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
+ mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE) //boggers, bogchamp, etc
+ if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH))
+ mod.wearer.death() //just in case, for some reason, they're still alive
+ flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS)
+
+///Balloon Blower - Blows a balloon.
+/obj/item/mod/module/balloon
+ name = "MOD balloon blower module"
+ desc = "A strange module invented years ago by some ingenious mimes. It blows balloons."
+ icon_state = "bloon"
+ module_type = MODULE_USABLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ incompatible_modules = list(/obj/item/mod/module/balloon)
+ cooldown_time = 15 SECONDS
+
+/obj/item/mod/module/balloon/on_use()
+ . = ..()
+ if(!.)
+ return
+ if(!do_after(mod.wearer, 10 SECONDS, target = mod))
+ return FALSE
+ mod.wearer.adjustOxyLoss(20)
+ playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE)
+ var/obj/item/toy/balloon/balloon = new(get_turf(src))
+ mod.wearer.put_in_hands(balloon)
+ drain_power(use_power_cost)
+
+///Paper Dispenser - Dispenses (sometimes burning) paper sheets.
+/obj/item/mod/module/paper_dispenser
+ name = "MOD paper dispenser module"
+ desc = "A simple module designed by the bureaucrats of Torch Bay. \
+ It dispenses 'warm, clean, and crisp sheets of paper' onto a nearby table. Usually."
+ icon_state = "paper_maker"
+ module_type = MODULE_USABLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ incompatible_modules = list(/obj/item/mod/module/paper_dispenser)
+ cooldown_time = 5 SECONDS
+ /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire.
+ var/num_sheets_dispensed = 0
+
+/obj/item/mod/module/paper_dispenser/on_use()
+ . = ..()
+ if(!.)
+ return
+ if(!do_after(mod.wearer, 1 SECONDS, target = mod))
+ return FALSE
+
+ var/obj/item/paper/crisp_paper = new(get_turf(src))
+ crisp_paper.desc = "It's crisp and warm to the touch. Must be fresh."
+
+ var/obj/structure/table/nearby_table = locate() in range(1, mod.wearer)
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
+ balloon_alert(mod.wearer, "dispensed paper[nearby_table ? " onto table":""]")
+
+ mod.wearer.put_in_hands(crisp_paper)
+ if(nearby_table)
+ mod.wearer.transferItemToLoc(crisp_paper, nearby_table.drop_location(), silent = FALSE)
+
+ // Up to a 30% chance to set the sheet on fire, +2% per sheet made
+ if(prob(min(num_sheets_dispensed * 2, 30)))
+ if(crisp_paper in mod.wearer.held_items)
+ mod.wearer.dropItemToGround(crisp_paper, force = TRUE)
+ crisp_paper.balloon_alert(mod.wearer, "pc load letter!")
+ crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!"))
+ crisp_paper.fire_act(1000, 100)
+
+ drain_power(use_power_cost)
+ num_sheets_dispensed++
+
+
+///Stamper - Extends a stamp that can switch between accept/deny modes.
+/obj/item/mod/module/stamp
+ name = "MOD stamper module"
+ desc = "A module installed into the wrist of the suit, this functions as a high-power stamp, \
+ able to switch between accept and deny modes."
+ icon_state = "stamp"
+ module_type = MODULE_ACTIVE
+ complexity = 1
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ device = /obj/item/stamp/mod
+ incompatible_modules = list(/obj/item/mod/module/stamp)
+ cooldown_time = 0.5 SECONDS
+
+/obj/item/stamp/mod
+ name = "MOD electronic stamp"
+ desc = "A high-power stamp, able to switch between accept and deny mode when used."
+
+/obj/item/stamp/mod/attack_self(mob/user, modifiers)
+ . = ..()
+ if(icon_state == "stamp-ok")
+ icon_state = "stamp-deny"
+ else
+ icon_state = "stamp-ok"
+ balloon_alert(user, "switched mode")
diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm
new file mode 100644
index 000000000000..798f065ffe7f
--- /dev/null
+++ b/code/modules/mod/modules/modules_medical.dm
@@ -0,0 +1,110 @@
+//Medical modules for MODsuits
+
+#define HEALTH_SCAN "Health"
+#define WOUND_SCAN "Wound"
+#define CHEM_SCAN "Chemical"
+
+///Health Analyzer - Gives the user a ranged health analyzer and their health status in the panel.
+/obj/item/mod/module/health_analyzer
+ name = "MOD health analyzer module"
+ desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \
+ allowing the user indepth information on the vitals and injuries of others even at a distance, \
+ all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \
+ but it's up to you to do something with it."
+ icon_state = "health"
+ module_type = MODULE_ACTIVE
+ complexity = 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/health_analyzer)
+ cooldown_time = 0.5 SECONDS
+ tgui_id = "health_analyzer"
+ /// Scanning mode, changes how we scan something.
+ var/mode = HEALTH_SCAN
+ /// List of all scanning modes.
+ var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN)
+
+/obj/item/mod/module/health_analyzer/add_ui_data()
+ . = ..()
+ .["userhealth"] = mod.wearer?.health || 0
+ .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0
+ .["userbrute"] = mod.wearer?.getBruteLoss() || 0
+ .["userburn"] = mod.wearer?.getFireLoss() || 0
+ .["usertoxin"] = mod.wearer?.getToxLoss() || 0
+ .["useroxy"] = mod.wearer?.getOxyLoss() || 0
+
+/obj/item/mod/module/health_analyzer/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(!isliving(target) || !mod.wearer.can_read(src))
+ return
+ switch(mode)
+ if(HEALTH_SCAN)
+ healthscan(mod.wearer, target)
+ if(CHEM_SCAN)
+ chemscan(mod.wearer, target)
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/health_analyzer/get_configuration()
+ . = ..()
+ .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes)
+
+/obj/item/mod/module/health_analyzer/configure_edit(key, value)
+ switch(key)
+ if("mode")
+ mode = value
+
+#undef HEALTH_SCAN
+#undef WOUND_SCAN
+#undef CHEM_SCAN
+
+///Quick Carry - Lets the user carry bodies quicker.
+/obj/item/mod/module/quick_carry
+ name = "MOD quick carry module"
+ desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \
+ or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat."
+ icon_state = "carry"
+ complexity = 1
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/quick_carry)
+
+/obj/item/mod/module/quick_carry/on_suit_activation()
+ ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT)
+
+/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE)
+ REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT)
+
+/obj/item/mod/module/quick_carry/advanced
+ name = "MOD advanced quick carry module"
+ removable = FALSE
+ complexity = 0
+
+/obj/item/mod/module/quick_carry/on_suit_activation()
+ ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT)
+ ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT)
+
+/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE)
+ REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT)
+ REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT)
+
+///Injector - Gives the suit an extendable large-capacity piercing syringe.
+/obj/item/mod/module/injector
+ name = "MOD injector module"
+ desc = "A module installed into the wrist of the suit, this functions as a high-capacity syringe, \
+ with a tip fine enough to locate the emergency injection ports on any suit of armor, \
+ penetrating it with ease. Even yours."
+ icon_state = "injector"
+ module_type = MODULE_ACTIVE
+ complexity = 1
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ device = /obj/item/reagent_containers/syringe/mod
+ incompatible_modules = list(/obj/item/mod/module/injector)
+ cooldown_time = 0.5 SECONDS
+
+/obj/item/reagent_containers/syringe/mod
+ name = "MOD injector syringe"
+ desc = "A high-capacity syringe, with a tip fine enough to locate \
+ the emergency injection ports on any suit of armor, penetrating it with ease. Even yours."
+ amount_per_transfer_from_this = 30
+ possible_transfer_amounts = list(5, 10, 15, 20, 30)
+ volume = 30
diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm
new file mode 100644
index 000000000000..69da2287eb72
--- /dev/null
+++ b/code/modules/mod/modules/modules_ninja.dm
@@ -0,0 +1,446 @@
+//Ninja modules for MODsuits
+
+///Cloaking - Lowers the user's visibility, can be interrupted by being touched or attacked.
+/obj/item/mod/module/stealth
+ name = "MOD prototype cloaking module"
+ desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \
+ to bend light around the user, as well as mimetic materials to make the surface of the suit match the \
+ surroundings based off sensor data. For some reason, this tech is rarely seen."
+ icon_state = "cloak"
+ module_type = MODULE_TOGGLE
+ complexity = 4
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 10
+ incompatible_modules = list(/obj/item/mod/module/stealth)
+ cooldown_time = 5 SECONDS
+ /// Whether or not the cloak turns off on bumping.
+ var/bumpoff = TRUE
+ /// The alpha applied when the cloak is on.
+ var/stealth_alpha = 50
+
+/obj/item/mod/module/stealth/on_activation()
+ . = ..()
+ if(!.)
+ return
+ if(bumpoff)
+ RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth))
+ RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(on_unarmed_attack))
+ RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act))
+ RegisterSignal(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND/*, COMSIG_ATOM_HITBY*/, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth))
+ animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS)
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ if(bumpoff)
+ UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP)
+ UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT/*, COMSIG_ATOM_HITBY*/, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED))
+ animate(mod.wearer, alpha = 255, time = 1.5 SECONDS)
+
+/obj/item/mod/module/stealth/proc/unstealth(datum/source)
+ SIGNAL_HANDLER
+
+ to_chat(mod.wearer, span_warning("[src] gets discharged from contact!"))
+ do_sparks(2, TRUE, src)
+ drain_power(use_power_cost)
+ on_deactivation(display_message = TRUE, deleting = FALSE)
+
+/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target)
+ SIGNAL_HANDLER
+
+ if(!isliving(target))
+ return
+ unstealth(source)
+
+/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/projectile/projectile)
+ SIGNAL_HANDLER
+
+ if(projectile.nodamage)
+ return
+ unstealth(source)
+
+//Advanced Cloaking - Doesn't turf off on bump, less power drain, more stealthy.
+/obj/item/mod/module/stealth/ninja
+ name = "MOD advanced cloaking module"
+ desc = "The latest in stealth technology, this module is a definite upgrade over previous versions. \
+ The field has been tuned to be even more responsive and fast-acting, with enough stability to \
+ continue operation of the field even if the user bumps into others. \
+ The power draw has been reduced drastically, making this perfect for activities like \
+ standing near sentry turrets for extended periods of time."
+ icon_state = "cloak_ninja"
+ bumpoff = FALSE
+ stealth_alpha = 20
+ active_power_cost = DEFAULT_CHARGE_DRAIN
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 5
+ cooldown_time = 3 SECONDS
+
+///Camera Vision - Prevents flashes, blocks tracking.
+/obj/item/mod/module/welding/camera_vision
+ name = "MOD camera vision module"
+ desc = "A module installed into the suit's helmet. This specialized piece of technology is built for subterfuge, \
+ replacing the standard visor with a nanotech display; capable of displaying specialized imagery at \
+ just the right frequency to jam all known forms of camera tracking and facial recognition, \
+ as well as automatically dimming incoming flashes of light to protect the user's eyes. Become the unseen."
+ icon_state = "welding_camera"
+ removable = FALSE
+ complexity = 0
+ overlay_state_inactive = null
+
+/obj/item/mod/module/welding/camera_vision/on_suit_activation()
+ . = ..()
+ RegisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track))
+
+/obj/item/mod/module/welding/camera_vision/on_suit_deactivation(deleting = FALSE)
+ . = ..()
+ UnregisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK)
+
+/obj/item/mod/module/welding/camera_vision/proc/can_track(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ return COMPONENT_CANT_TRACK
+
+//Ninja Star Dispenser - Dispenses ninja stars.
+/obj/item/mod/module/dispenser/ninja
+ name = "MOD ninja star dispenser module"
+ desc = "This piece of Spider Clan technology can exploit known energy-matter equivalence principles, \
+ using the nanites already hosted in the wearer's suit to transmute into monomolecular shuriken. \
+ While these lack the intense bleeding edge of conventional throwing stars, \
+ they have been set to electrify fleeing targets; and branded with the Spider Clan symbol."
+ dispense_type = /obj/item/throwing_star/stamina
+ cooldown_time = 0.5 SECONDS
+
+///Hacker - This module hooks onto your right-clicks with empty hands and causes ninja actions.
+/obj/item/mod/module/hacker
+ name = "MOD hacker module"
+ desc = "Built for one purpose, electronic warfare, this module is built into the hands. \
+ Using near-field communication alongside precise electro-stimulation of the wires in machines, \
+ this decker's dream is normally used to pass through doors like a phantom. \
+ It's also capable of non-precise electro-stimulation of an assassin-saboteur's opponents on disarming attacks."
+ icon_state = "hacker"
+ removable = FALSE
+ incompatible_modules = list(/obj/item/mod/module/hacker)
+ /// Minimum amount of power we can drain in a single drain action
+ var/mindrain = 200
+ /// Maximum amount of power we can drain in a single drain action
+ var/maxdrain = 400
+ /// Whether or not the communication console hack was used to summon another antagonist.
+ var/communication_console_hack_success = FALSE
+ /// How many times the module has been used to force open doors.
+ var/door_hack_counter = 0
+ ///Used for the research objective (see antagonist file)
+ var/datum/techweb/stored_research
+
+/obj/item/mod/module/hacker/on_suit_activation()
+ RegisterSignal(mod.wearer, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(hack))
+
+/obj/item/mod/module/hacker/on_suit_deactivation(deleting = FALSE)
+ UnregisterSignal(mod.wearer, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
+
+/obj/item/mod/module/hacker/proc/hack(mob/living/carbon/human/source, atom/target, proximity, modifiers)
+ SIGNAL_HANDLER
+
+ if(!LAZYACCESS(modifiers, RIGHT_CLICK) || !proximity)
+ return NONE
+ target.add_fingerprint(mod.wearer)
+ return target.ninjadrain_act(mod.wearer, src)
+
+/obj/item/mod/module/hacker/proc/charge_message(atom/drained_atom, drain_amount)
+ if(drain_amount)
+ to_chat(mod.wearer, span_notice("Получено [drain_amount] единиц энергии с [drained_atom]."))
+ else
+ to_chat(mod.wearer, span_warning("[drained_atom] истощен, необходимо найти другой источник питания!"))
+
+///Weapon Recall - Teleports your katana to you, prevents gun use.
+/obj/item/mod/module/weapon_recall
+ name = "MOD weapon recall module"
+ desc = "The cornerstone of a clanmember's life as a blademaster, and a module symbolizing their eternal bond with their weapon. \
+ This hooks to the micro bluespace drive inside an energy katana's handle, capable of recalling it to the user's \
+ skilled hands wherever they are. However, those that make such a bond with their weapon are cursed to \
+ fusing their existence with acts of combat, with a singular purpose; Cutting Down Their Opponent. \
+ Their hand a hand that is cutting, their body a body that is cutting, their mind, a mind that is cutting. \
+ Ranged weapons are forbidden."
+ icon_state = "recall"
+ removable = FALSE
+ module_type = MODULE_USABLE
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 2
+ incompatible_modules = list(/obj/item/mod/module/weapon_recall)
+ cooldown_time = 0.5 SECONDS
+ /// The item linked to the module that will get recalled.
+ var/obj/item/linked_weapon
+ /// The accepted typepath we can link to.
+ var/accepted_type = /obj/item/energy_katana
+
+/obj/item/mod/module/weapon_recall/on_suit_activation()
+ ADD_TRAIT(mod.wearer, TRAIT_NOGUNS, MOD_TRAIT)
+
+/obj/item/mod/module/weapon_recall/on_suit_deactivation(deleting = FALSE)
+ REMOVE_TRAIT(mod.wearer, TRAIT_NOGUNS, MOD_TRAIT)
+
+/obj/item/mod/module/weapon_recall/on_use()
+ . = ..()
+ if(!.)
+ return
+ if(!linked_weapon)
+ var/obj/item/weapon_to_link = mod.wearer.is_holding_item_of_type(accepted_type)
+ if(!weapon_to_link)
+ balloon_alert(mod.wearer, "can't locate weapon!")
+ return
+ set_weapon(weapon_to_link)
+ balloon_alert(mod.wearer, "[linked_weapon.name] linked")
+ return
+ if(linked_weapon in mod.wearer.get_all_contents())
+ balloon_alert(mod.wearer, "already on self!")
+ return
+ var/distance = get_dist(mod.wearer, linked_weapon)
+ var/in_view = (linked_weapon in view(mod.wearer))
+ if(!in_view && !drain_power(use_power_cost * distance))
+ balloon_alert(mod.wearer, "not enough charge!")
+ return
+ linked_weapon.forceMove(linked_weapon.drop_location())
+ if(in_view)
+ do_sparks(5, FALSE, linked_weapon)
+ mod.wearer.visible_message(span_danger("[linked_weapon] flies towards [mod.wearer]!"),span_warning("You hold out your hand and [linked_weapon] flies towards you!"))
+ linked_weapon.throw_at(mod.wearer, distance+1, linked_weapon.throw_speed, mod.wearer)
+ else
+ recall_weapon()
+
+/obj/item/mod/module/weapon_recall/proc/set_weapon(obj/item/weapon)
+ linked_weapon = weapon
+ RegisterSignal(linked_weapon, COMSIG_MOVABLE_IMPACT, PROC_REF(catch_weapon))
+ RegisterSignal(linked_weapon, COMSIG_PARENT_QDELETING, PROC_REF(deleted_weapon))
+
+/obj/item/mod/module/weapon_recall/proc/recall_weapon(caught = FALSE)
+ linked_weapon.forceMove(get_turf(src))
+ var/alert = ""
+ if(mod.wearer.put_in_hands(linked_weapon))
+ alert = "[linked_weapon.name] teleports to your hand"
+ else if(mod.wearer.equip_to_slot_if_possible(linked_weapon, ITEM_SLOT_BELT, disable_warning = TRUE))
+ alert = "[linked_weapon.name] sheathes itself in your belt"
+ else
+ alert = "[linked_weapon.name] teleports under you"
+ if(caught)
+ if(mod.wearer.is_holding(linked_weapon))
+ alert = "you catch [linked_weapon.name]"
+ else
+ alert = "[linked_weapon.name] lands under you"
+ else
+ do_sparks(5, FALSE, linked_weapon)
+ if(alert)
+ balloon_alert(mod.wearer, alert)
+
+/obj/item/mod/module/weapon_recall/proc/catch_weapon(obj/item/source, atom/hit_atom, datum/thrownthing/thrownthing)
+ SIGNAL_HANDLER
+
+ if(!mod)
+ return
+ if(hit_atom != mod.wearer)
+ return
+ INVOKE_ASYNC(src, PROC_REF(recall_weapon), TRUE)
+ return COMPONENT_MOVABLE_IMPACT_NEVERMIND
+
+/obj/item/mod/module/weapon_recall/proc/deleted_weapon(obj/item/source)
+ SIGNAL_HANDLER
+
+ linked_weapon = null
+
+//Reinforced DNA Lock - Gibs if wrong DNA, emp-proof.
+/obj/item/mod/module/dna_lock/reinforced
+ name = "MOD reinforced DNA lock module"
+ desc = "A module which engages with the various locks and seals tied to the suit's systems, \
+ enabling it to only be worn by someone corresponding with the user's exact DNA profile. \
+ Due to utilizing a skintight dampening shield, this one is entirely sealed against electromagnetic interference; \
+ it also dutifully protects the secrets of the Spider Clan from unknowing outsiders."
+ icon_state = "dnalock_ninja"
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+
+/obj/item/mod/module/dna_lock/reinforced/on_mod_activation(datum/source, mob/user)
+ . = ..()
+ if(. != MOD_CANCEL_ACTIVATE || !isliving(user))
+ return
+ var/mob/living/living_user = user
+ to_chat(living_user, span_danger("fATaL EERRoR: 382200-*#00CODE RED\nUNAUTHORIZED USE DETECteD\nCoMMENCING SUB-R0UTIN3 13...\nTERMInATING U-U-USER..."))
+ living_user.gib()
+
+/obj/item/mod/module/dna_lock/reinforced/on_emp(datum/source, severity)
+ return
+
+//EMP Pulse - In addition to normal shielding, can also launch an EMP itself.
+/obj/item/mod/module/emp_shield/pulse
+ name = "MOD EMP pulse module"
+ desc = "This module is normally set to activate on dramatic gestures, inverting and expanding the suit's \
+ EMP dampening shield to cause an electromagnetic pulse of its own. While this won't interfere with the wearer, \
+ it will piss off everyone around them."
+ icon_state = "emp_pulse"
+ module_type = MODULE_USABLE
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 10
+ cooldown_time = 8 SECONDS
+
+/obj/item/mod/module/emp_shield/pulse/on_use()
+ . = ..()
+ if(!.)
+ return
+ playsound(src, 'sound/effects/empulse.ogg', 60, TRUE)
+ empulse(src, heavy_range = 4, light_range = 6)
+ drain_power(use_power_cost)
+
+///Status Readout - Puts a lot of information including health, nutrition, fingerprints, temperature to the suit TGUI.
+/obj/item/mod/module/status_readout
+ name = "MOD status readout module"
+ desc = "A once-common module, this technology went unfortunately out of fashion; \
+ and right into the arachnid grip of the Spider Clan. This hooks into the suit's spine, \
+ capable of capturing and displaying all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \
+ and even useful information such as their overall health and wellness."
+ icon_state = "status"
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1
+ incompatible_modules = list(/obj/item/mod/module/status_readout)
+ tgui_id = "status_readout"
+
+/obj/item/mod/module/status_readout/add_ui_data()
+ . = ..()
+ .["statustime"] = station_time_timestamp()
+ .["statusid"] = GLOB.round_id
+ .["statushealth"] = mod.wearer?.health || 0
+ .["statusmaxhealth"] = mod.wearer?.getMaxHealth() || 0
+ .["statusbrute"] = mod.wearer?.getBruteLoss() || 0
+ .["statusburn"] = mod.wearer?.getFireLoss() || 0
+ .["statustoxin"] = mod.wearer?.getToxLoss() || 0
+ .["statusoxy"] = mod.wearer?.getOxyLoss() || 0
+ .["statustemp"] = mod.wearer?.bodytemperature || 0
+ .["statusnutrition"] = mod.wearer?.nutrition || 0
+ //.["statusfingerprints"] = mod.wearer ? md5(mod.wearer.dna.unique_identity) : null
+ .["statusdna"] = mod.wearer?.dna.unique_enzymes
+ .["statusviruses"] = null
+ if(!length(mod.wearer?.diseases))
+ return
+ var/list/viruses = list()
+ for(var/datum/disease/virus as anything in mod.wearer.diseases)
+ var/list/virus_data = list()
+ virus_data["name"] = virus.name
+ virus_data["type"] = virus.spread_text
+ virus_data["stage"] = virus.stage
+ virus_data["maxstage"] = virus.max_stages
+ virus_data["cure"] = virus.cure_text
+ viruses += list(virus_data)
+ .["statusviruses"] = viruses
+
+///Energy Net - Ensnares enemies in a net that prevents movement.
+/obj/item/mod/module/energy_net
+ name = "MOD energy net module"
+ desc = "A custom-built net-thrower. While conventional implementations of this capturing device \
+ tilize monomolecular fibers or cutting razorwire, this uses hardlight technology to deploy a \
+ trapping field capable of immobilizing even the strongest opponents."
+ icon_state = "energy_net"
+ removable = FALSE
+ module_type = MODULE_ACTIVE
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 6
+ incompatible_modules = list(/obj/item/mod/module/energy_net)
+ cooldown_time = 1.5 SECONDS
+
+/obj/item/mod/module/energy_net/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(!isliving(target))
+ balloon_alert(mod.wearer, "invalid target!")
+ return
+ var/mob/living/living_target = target
+ if(locate(/obj/structure/energy_net) in get_turf(living_target))
+ balloon_alert(mod.wearer, "already trapped!")
+ return
+ for(var/turf/between_turf as anything in get_line(get_turf(mod.wearer), get_turf(living_target)))
+ if(between_turf.density)
+ balloon_alert(mod.wearer, "not through obstacles!")
+ return
+ //if(IS_SPACE_NINJA(mod.wearer))
+ // mod.wearer.say("Get over here!", forced = type)
+ mod.wearer.Beam(living_target, "n_beam", time = 1.5 SECONDS)
+ var/obj/structure/energy_net/net = new /obj/structure/energy_net(living_target.drop_location())
+ net.affecting = living_target
+ mod.wearer.visible_message(span_danger("[mod.wearer] caught [living_target] with an energy net!"), span_notice("You caught [living_target] with an energy net!"))
+ if(living_target.buckled)
+ living_target.buckled.unbuckle_mob(living_target, force = TRUE)
+ net.buckle_mob(living_target, force = TRUE)
+ drain_power(use_power_cost)
+
+///Adrenaline Boost - Stops all stuns the ninja is affected with, increases his speed.
+/obj/item/mod/module/adrenaline_boost
+ name = "MOD adrenaline boost module"
+ desc = "The secrets of the Spider Clan are many. The exact specifications of their suits, \
+ the techniques they use to make every singular cut make their enemies weep with admiration, \
+ but one of their greatest mysteries is the chemical compound their assassin-saboteurs use in times of need. \
+ It's capable of clearing any fatigue whatsoever from the user, any immobilizing effect, and can even \
+ cure total paralysis. All that's known is that the fluid requires radiation to properly 'cook,' \
+ so this module demands radium to be refilled with."
+ icon_state = "adrenaline_boost"
+ removable = FALSE
+ module_type = MODULE_USABLE
+ incompatible_modules = list(/obj/item/mod/module/adrenaline_boost)
+ cooldown_time = 12 SECONDS
+ /// What reagent we need to refill?
+ var/reagent_required = /datum/reagent/uranium/radium
+ /// How much of a reagent we need to refill the boost.
+ var/reagent_required_amount = 20
+
+/obj/item/mod/module/adrenaline_boost/Initialize(mapload)
+ . = ..()
+ create_reagents(reagent_required_amount)
+ reagents.add_reagent(reagent_required, reagent_required_amount)
+
+/obj/item/mod/module/adrenaline_boost/on_use()
+ if(!reagents.has_reagent(reagent_required, reagent_required_amount))
+ balloon_alert(mod.wearer, "no charge!")
+ return
+ . = ..()
+ if(!.)
+ return
+ //if(IS_SPACE_NINJA(mod.wearer))
+ // mod.wearer.say(pick_list_replacements(NINJA_FILE, "lines"), forced = type)
+ to_chat(mod.wearer, span_notice("You have used the adrenaline boost."))
+ mod.wearer.SetUnconscious(0)
+ mod.wearer.SetStun(0)
+ mod.wearer.SetKnockdown(0)
+ mod.wearer.SetImmobilized(0)
+ mod.wearer.SetParalyzed(0)
+ mod.wearer.adjustStaminaLoss(-200)
+ mod.wearer.stuttering = 0
+ mod.wearer.reagents.add_reagent(/datum/reagent/medicine/stimulants, 5)
+ reagents.remove_reagent(reagent_required, reagents.total_volume * 0.75)
+ addtimer(CALLBACK(src, PROC_REF(boost_aftereffects), mod.wearer), 7 SECONDS)
+
+/obj/item/mod/module/adrenaline_boost/on_install()
+ RegisterSignal(mod, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby))
+
+/obj/item/mod/module/adrenaline_boost/on_uninstall(deleting)
+ UnregisterSignal(mod, COMSIG_PARENT_ATTACKBY)
+
+/obj/item/mod/module/adrenaline_boost/attackby(obj/item/attacking_item, mob/user, params)
+ if(charge_boost(attacking_item, user))
+ return TRUE
+ return ..()
+
+/obj/item/mod/module/adrenaline_boost/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user)
+ SIGNAL_HANDLER
+
+ if(charge_boost(attacking_item, user))
+ return COMPONENT_NO_AFTERATTACK
+ return NONE
+
+/obj/item/mod/module/adrenaline_boost/proc/charge_boost(obj/item/attacking_item, mob/user)
+ if(!attacking_item.is_open_container())
+ return FALSE
+ if(reagents.has_reagent(reagent_required, reagent_required_amount))
+ balloon_alert(mod.wearer, "already charged!")
+ return FALSE
+ if(!attacking_item.reagents.trans_id_to(src, reagent_required, reagent_required_amount))
+ return FALSE
+ balloon_alert(mod.wearer, "charge [reagents.has_reagent(reagent_required, reagent_required_amount) ? "fully" : "partially"] reloaded")
+ return TRUE
+
+/obj/item/mod/module/adrenaline_boost/proc/boost_aftereffects(mob/affected_mob)
+ if(!affected_mob)
+ return
+ reagents.trans_to(affected_mob, reagents.total_volume)
+ to_chat(affected_mob, span_danger("You are beginning to feel the after-effect of the injection."))
diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm
new file mode 100644
index 000000000000..02025ea1b420
--- /dev/null
+++ b/code/modules/mod/modules/modules_science.dm
@@ -0,0 +1,132 @@
+//Science modules for MODsuits
+
+///Reagent Scanner - Lets the user scan reagents.
+/obj/item/mod/module/reagent_scanner
+ name = "MOD reagent scanner module"
+ desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \
+ containers and projecting the information in an easy-to-read format on the wearer's display. \
+ It cannot detect flavors, so that's up to you."
+ icon_state = "scanner"
+ module_type = MODULE_TOGGLE
+ complexity = 1
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
+ incompatible_modules = list(/obj/item/mod/module/reagent_scanner)
+ cooldown_time = 0.5 SECONDS
+
+/obj/item/mod/module/reagent_scanner/on_activation()
+ . = ..()
+ if(!.)
+ return
+ mod.helmet.clothing_flags |= SCAN_REAGENTS
+
+/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ mod.helmet.clothing_flags &= ~SCAN_REAGENTS
+
+/obj/item/mod/module/reagent_scanner/advanced
+ name = "MOD advanced reagent scanner module"
+ complexity = 0
+ removable = FALSE
+ var/explosion_detection_dist = 21
+
+/obj/item/mod/module/reagent_scanner/advanced/on_activation()
+ . = ..()
+ if(!.)
+ return
+ mod.helmet.clothing_flags |= SCAN_REAGENTS
+ RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion))
+
+/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ mod.helmet.clothing_flags |= SCAN_REAGENTS
+ UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION)
+
+/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter,
+ devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
+ SIGNAL_HANDLER
+ var/turf/wearer_turf = get_turf(mod.wearer)
+ if(wearer_turf.z != epicenter.z)
+ return
+ if(get_dist(epicenter, wearer_turf) > explosion_detection_dist)
+ return
+ to_chat(mod.wearer, span_notice("Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]"))
+
+///Anti-Gravity - Makes the user weightless.
+/obj/item/mod/module/anomaly_locked/antigrav
+ name = "MOD anti-gravity module"
+ desc = "A module that uses a gravitational core to make the user completely weightless."
+ icon_state = "antigrav"
+ module_type = MODULE_TOGGLE
+ complexity = 3
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.7
+ incompatible_modules = list(/obj/item/mod/module/anomaly_locked)
+ cooldown_time = 0.5 SECONDS
+ accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav)
+
+/obj/item/mod/module/anomaly_locked/antigrav/on_activation()
+ . = ..()
+ if(!.)
+ return
+ if(mod.wearer.has_gravity())
+ new /obj/effect/temp_visual/mook_dust(get_turf(src))
+ mod.wearer.AddElement(/datum/element/forced_gravity, 0)
+ mod.wearer.update_gravity(mod.wearer.has_gravity())
+ playsound(src, 'sound/effects/gravhit.ogg', 50)
+
+/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ mod.wearer.RemoveElement(/datum/element/forced_gravity, 0)
+ mod.wearer.update_gravity(mod.wearer.has_gravity())
+ if(deleting)
+ return
+ if(mod.wearer.has_gravity())
+ new /obj/effect/temp_visual/mook_dust(get_turf(src))
+ playsound(src, 'sound/effects/gravhit.ogg', 50)
+
+/obj/item/mod/module/anomaly_locked/antigrav/prebuilt
+ prebuilt = TRUE
+
+///Teleporter - Lets the user teleport to a nearby location.
+/obj/item/mod/module/anomaly_locked/teleporter
+ name = "MOD teleporter module"
+ desc = "A module that uses a bluespace core to let the user transport their particles elsewhere."
+ icon_state = "teleporter"
+ module_type = MODULE_ACTIVE
+ complexity = 3
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 5
+ cooldown_time = 5 SECONDS
+ accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace)
+ /// Time it takes to teleport
+ var/teleport_time = 3 SECONDS
+
+/obj/item/mod/module/anomaly_locked/teleporter/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ var/turf/open/target_turf = get_turf(target)
+ if(!istype(target_turf) || target_turf.is_blocked_turf() || !(target_turf in view(mod.wearer)))
+ balloon_alert(mod.wearer, "invalid target!")
+ return
+ balloon_alert(mod.wearer, "teleporting...")
+ var/matrix/pre_matrix = matrix()
+ pre_matrix.Scale(4, 0.25)
+ var/matrix/post_matrix = matrix()
+ post_matrix.Scale(0.25, 4)
+ animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT)
+ if(!do_after(mod.wearer, teleport_time, target = mod))
+ balloon_alert(mod.wearer, "interrupted!")
+ animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT)
+ return
+ animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT)
+ if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg'))
+ return
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/anomaly_locked/teleporter/prebuilt
+ prebuilt = TRUE
diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm
new file mode 100644
index 000000000000..d3ac53846461
--- /dev/null
+++ b/code/modules/mod/modules/modules_security.dm
@@ -0,0 +1,136 @@
+//Security modules for MODsuits
+
+///Magnetic Harness - Automatically puts guns in your suit storage when you drop them.
+/obj/item/mod/module/magnetic_harness
+ name = "MOD magnetic harness module"
+ desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer."
+ icon_state = "mag_harness"
+ complexity = 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/magnetic_harness)
+ /// Time before we activate the magnet.
+ var/magnet_delay = 0.8 SECONDS
+ /// The typecache of all guns we allow.
+ var/static/list/guns_typecache
+ /// The guns already allowed by the modsuit chestplate.
+ var/list/already_allowed_guns = list()
+
+/obj/item/mod/module/magnetic_harness/Initialize(mapload)
+ . = ..()
+ if(!guns_typecache)
+ guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe))
+
+/obj/item/mod/module/magnetic_harness/on_install()
+ already_allowed_guns = guns_typecache & mod.chestplate.allowed
+ mod.chestplate.allowed |= guns_typecache
+
+/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE)
+ if(deleting)
+ return
+ mod.chestplate.allowed -= (guns_typecache - already_allowed_guns)
+
+/obj/item/mod/module/magnetic_harness/on_suit_activation()
+ RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(check_dropped_item))
+
+/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE)
+ UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM)
+
+/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location)
+ SIGNAL_HANDLER
+
+ if(!is_type_in_typecache(dropped_item, guns_typecache))
+ return
+ if(new_location != get_turf(src))
+ return
+ addtimer(CALLBACK(src, PROC_REF(pick_up_item), dropped_item), magnet_delay)
+
+/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item)
+ if(!isturf(item.loc) || !item.Adjacent(mod.wearer))
+ return
+ if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE))
+ return
+ playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE)
+ balloon_alert(mod.wearer, "[item] reattached")
+ drain_power(use_power_cost)
+
+///Holster - Instantly holsters any not huge gun.
+/obj/item/mod/module/holster
+ name = "MOD holster module"
+ desc = "Based off typical storage compartments, this system allows the suit to holster a \
+ standard firearm across its surface and allow for extremely quick retrieval. \
+ While some users prefer the chest, others the forearm for quick deployment, \
+ some law enforcement prefer the holster to extend from the thigh."
+ icon_state = "holster"
+ module_type = MODULE_USABLE
+ complexity = 2
+ incompatible_modules = list(/obj/item/mod/module/holster)
+ cooldown_time = 0.5 SECONDS
+ allowed_inactive = TRUE
+ /// Gun we have holstered.
+ var/obj/item/gun/holstered
+
+/obj/item/mod/module/holster/on_use()
+ . = ..()
+ if(!.)
+ return
+ if(!holstered)
+ var/obj/item/gun/holding = mod.wearer.get_active_held_item()
+ if(!holding)
+ balloon_alert(mod.wearer, "nothing to holster!")
+ return
+ if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY)
+ balloon_alert(mod.wearer, "it doesn't fit!")
+ return
+ if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE))
+ holstered = holding
+ balloon_alert(mod.wearer, "weapon holstered")
+ playsound(src, 'sound/weapons/gun/revolver/empty.ogg', 100, TRUE)
+ else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE))
+ balloon_alert(mod.wearer, "weapon drawn")
+ playsound(src, 'sound/weapons/gun/revolver/empty.ogg', 100, TRUE)
+ else
+ balloon_alert(mod.wearer, "holster full!")
+
+/obj/item/mod/module/holster/on_uninstall(deleting = FALSE)
+ if(holstered)
+ holstered.forceMove(drop_location())
+
+/obj/item/mod/module/holster/Exited(atom/movable/gone, direction)
+ . = ..()
+ if(gone == holstered)
+ holstered = null
+
+/obj/item/mod/module/holster/Destroy()
+ QDEL_NULL(holstered)
+ return ..()
+
+///Megaphone - Lets you speak loud.
+/obj/item/mod/module/megaphone
+ name = "MOD megaphone module"
+ desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness."
+ icon_state = "megaphone"
+ module_type = MODULE_TOGGLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5
+ incompatible_modules = list(/obj/item/mod/module/megaphone)
+ cooldown_time = 0.5 SECONDS
+ /// List of spans we add to the speaker.
+ var/list/voicespan = list(SPAN_COMMAND)
+
+/obj/item/mod/module/megaphone/on_activation()
+ . = ..()
+ if(!.)
+ return
+ RegisterSignal(mod.wearer, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+
+/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ UnregisterSignal(mod.wearer, COMSIG_MOB_SAY)
+
+/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
+ speech_args[SPEECH_SPANS] |= voicespan
+ drain_power(use_power_cost)
diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm
new file mode 100644
index 000000000000..e983bbc3dbc0
--- /dev/null
+++ b/code/modules/mod/modules/modules_service.dm
@@ -0,0 +1,56 @@
+//Service modules for MODsuits
+
+///Bike Horn - Plays a bike horn sound.
+/obj/item/mod/module/bikehorn
+ name = "MOD bike horn module"
+ desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \
+ precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound."
+ icon_state = "bikehorn"
+ module_type = MODULE_USABLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/bikehorn)
+ cooldown_time = 1 SECONDS
+
+/obj/item/mod/module/bikehorn/on_use()
+ . = ..()
+ if(!.)
+ return
+ playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE)
+ drain_power(use_power_cost)
+
+///Microwave Beam - Microwaves items instantly.
+/obj/item/mod/module/microwave_beam
+ name = "MOD microwave beam module"
+ desc = "An oddly domestic device, this module is installed into the user's palm, \
+ hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \
+ allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes."
+ icon_state = "microwave_beam"
+ module_type = MODULE_ACTIVE
+ complexity = 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 5
+ incompatible_modules = list(/obj/item/mod/module/microwave_beam)
+ cooldown_time = 10 SECONDS
+
+/obj/item/mod/module/microwave_beam/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(!istype(target, /obj/item))
+ return
+ if(!isturf(target.loc))
+ balloon_alert(mod.wearer, "must be on the floor!")
+ return
+ var/obj/item/microwave_target = target
+ var/datum/effect_system/spark_spread/spark_effect = new()
+ spark_effect.set_up(2, 1, mod.wearer)
+ spark_effect.start()
+ mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5)
+ if(microwave_target.microwave_act())
+ playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE)
+ else
+ balloon_alert(mod.wearer, "can't be microwaved!")
+ var/datum/effect_system/spark_spread/spark_effect_two = new()
+ spark_effect_two.set_up(2, 1, microwave_target)
+ spark_effect_two.start()
+ drain_power(use_power_cost)
diff --git a/code/modules/mod/modules/modules_storage.dm b/code/modules/mod/modules/modules_storage.dm
new file mode 100644
index 000000000000..25caad6806f7
--- /dev/null
+++ b/code/modules/mod/modules/modules_storage.dm
@@ -0,0 +1,60 @@
+/obj/item/mod/module/storage
+ name = "MOD storage module"
+ desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \
+ the surface of the suit, useful for storing various bits, and or bobs."
+ icon_state = "storage"
+ complexity = 3
+ incompatible_modules = list(/obj/item/mod/module/storage)
+ var/datum/component/storage/concrete/storage
+ var/max_w_class = WEIGHT_CLASS_NORMAL
+ var/max_combined_w_class = 15
+ var/max_items = 7
+
+/obj/item/mod/module/storage/Initialize(mapload)
+ . = ..()
+ storage = AddComponent(/datum/component/storage/concrete)
+ storage.max_w_class = max_w_class
+ storage.max_combined_w_class = max_combined_w_class
+ storage.max_items = max_items
+ storage.allow_big_nesting = TRUE
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE)
+
+/obj/item/mod/module/storage/on_install()
+ var/datum/component/storage/modstorage = mod.AddComponent(/datum/component/storage, storage)
+ modstorage.max_w_class = max_w_class
+ modstorage.max_combined_w_class = max_combined_w_class
+ modstorage.max_items = max_items
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
+
+/obj/item/mod/module/storage/on_uninstall(deleting = FALSE)
+ var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage)
+ storage.slaves -= modstorage
+ qdel(modstorage)
+ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE)
+
+/obj/item/mod/module/storage/large_capacity
+ name = "MOD expanded storage module"
+ desc = "Reverse engineered by Nakamura Engineering from Donk Corporation designs, this system of hidden compartments \
+ is entirely within the suit, distributing items and weight evenly to ensure a comfortable experience for the user; \
+ whether smuggling, or simply hauling."
+ icon_state = "storage_large"
+ max_combined_w_class = 21
+ max_items = 14
+
+/obj/item/mod/module/storage/syndicate
+ name = "MOD syndicate storage module"
+ desc = "A storage system using nanotechnology developed by Cybersun Industries, these compartments use \
+ esoteric technology to compress the physical matter of items put inside of them, \
+ essentially shrinking items for much easier and more portable storage."
+ icon_state = "storage_syndi"
+ max_combined_w_class = 30
+ max_items = 21
+
+/obj/item/mod/module/storage/bluespace
+ name = "MOD bluespace storage module"
+ desc = "A storage system developed by Nanotrasen, these compartments employ \
+ miniaturized bluespace pockets for the ultimate in storage technology; regardless of the weight of objects put inside."
+ icon_state = "storage_large"
+ max_w_class = WEIGHT_CLASS_GIGANTIC
+ max_combined_w_class = 60
+ max_items = 21
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
new file mode 100644
index 000000000000..04f0aaf73ad1
--- /dev/null
+++ b/code/modules/mod/modules/modules_supply.dm
@@ -0,0 +1,306 @@
+//Supply modules for MODsuits
+
+///Internal GPS - Extends a GPS you can use.
+/obj/item/mod/module/gps
+ name = "MOD internal GPS module"
+ desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \
+ down to the exact coordinates. This information is fed to a central database viewable from the device itself, \
+ though using it to help people is up to you."
+ icon_state = "gps"
+ module_type = MODULE_USABLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
+ incompatible_modules = list(/obj/item/mod/module/gps)
+ cooldown_time = 0.5 SECONDS
+ allowed_inactive = TRUE
+
+/obj/item/mod/module/gps/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/gps/item, "MOD0")
+
+/obj/item/mod/module/gps/on_use()
+ . = ..()
+ if(!.)
+ return
+ attack_self(mod.wearer)
+
+///Hydraulic Clamp - Lets you pick up and drop crates.
+/obj/item/mod/module/clamp
+ name = "MOD hydraulic clamp module"
+ desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \
+ However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \
+ A lot of people would say that loading cargo is a dull job, but you could not disagree more."
+ icon_state = "clamp"
+ module_type = MODULE_ACTIVE
+ complexity = 3
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/clamp)
+ cooldown_time = 0.5 SECONDS
+ overlay_state_inactive = "module_clamp"
+ overlay_state_active = "module_clamp_on"
+ /// Time it takes to load a crate.
+ var/load_time = 3 SECONDS
+ /// The max amount of crates you can carry.
+ var/max_crates = 3
+ /// The crates stored in the module.
+ var/list/stored_crates = list()
+
+/obj/item/mod/module/clamp/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(!mod.wearer.Adjacent(target))
+ return
+ if(istype(target, /obj/structure/closet/crate))// || istype(target, /obj/item/delivery/big))
+ var/atom/movable/picked_crate = target
+ if(!check_crate_pickup(picked_crate))
+ return
+ playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE)
+ if(!do_after(mod.wearer, load_time, target = target))
+ balloon_alert(mod.wearer, "interrupted!")
+ return
+ if(!check_crate_pickup(picked_crate))
+ return
+ stored_crates += picked_crate
+ picked_crate.forceMove(src)
+ balloon_alert(mod.wearer, "picked up [picked_crate]")
+ drain_power(use_power_cost)
+ mod.wearer.update_inv_back()
+ else if(length(stored_crates))
+ var/turf/target_turf = get_turf(target)
+ if(target_turf.is_blocked_turf())
+ return
+ playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE)
+ if(!do_after(mod.wearer, load_time, target = target))
+ balloon_alert(mod.wearer, "interrupted!")
+ return
+ if(target_turf.is_blocked_turf())
+ return
+ var/atom/movable/dropped_crate = pop(stored_crates)
+ dropped_crate.forceMove(target_turf)
+ balloon_alert(mod.wearer, "dropped [dropped_crate]")
+ drain_power(use_power_cost)
+ mod.wearer.update_inv_back()
+ else
+ balloon_alert(mod.wearer, "invalid target!")
+
+/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE)
+ if(deleting)
+ return
+ for(var/atom/movable/crate as anything in stored_crates)
+ crate.forceMove(drop_location())
+ stored_crates -= crate
+
+/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target)
+ if(length(stored_crates) >= max_crates)
+ balloon_alert(mod.wearer, "too many crates!")
+ return FALSE
+ for(var/mob/living/mob in target.get_all_contents())
+ if(mob.mob_size < MOB_SIZE_HUMAN)
+ continue
+ balloon_alert(mod.wearer, "crate too heavy!")
+ return FALSE
+ return TRUE
+
+/obj/item/mod/module/clamp/loader
+ name = "MOD loader hydraulic clamp module"
+ icon_state = "clamp_loader"
+ complexity = 0
+ removable = FALSE
+ overlay_state_inactive = null
+ overlay_state_active = "module_clamp_loader"
+ load_time = 1 SECONDS
+ max_crates = 5
+ use_mod_colors = TRUE
+
+///Drill - Lets you dig through rock and basalt.
+/obj/item/mod/module/drill
+ name = "MOD drill module"
+ desc = "An integrated drill, typically extending over the user's hand. While useful for drilling through rock, \
+ your drill is surely the one that both pierces and creates the heavens."
+ icon_state = "drill"
+ module_type = MODULE_ACTIVE
+ complexity = 2
+ use_power_cost = DEFAULT_CHARGE_DRAIN
+ incompatible_modules = list(/obj/item/mod/module/drill)
+ cooldown_time = 0.5 SECONDS
+ overlay_state_active = "module_drill"
+
+/obj/item/mod/module/drill/on_activation()
+ . = ..()
+ if(!.)
+ return
+ RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine))
+
+/obj/item/mod/module/drill/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP)
+
+/obj/item/mod/module/drill/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(!mod.wearer.Adjacent(target))
+ return
+ if(istype(target, /turf/closed/mineral))
+ var/turf/closed/mineral/mineral_turf = target
+ mineral_turf.gets_drilled(mod.wearer)
+ drain_power(use_power_cost)
+ else if(istype(target, /turf/open/floor/plating/asteroid))
+ var/turf/open/floor/plating/asteroid/sand_turf = target
+ if(!sand_turf.can_dig(mod.wearer))
+ return
+ sand_turf.getDug()
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/drill/proc/bump_mine(mob/living/carbon/human/bumper, atom/bumped_into, proximity)
+ SIGNAL_HANDLER
+ if(!istype(bumped_into, /turf/closed/mineral) || !drain_power(use_power_cost))
+ return
+ var/turf/closed/mineral/mineral_turf = bumped_into
+ mineral_turf.gets_drilled(mod.wearer)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+///Ore Bag - Lets you pick up ores and drop them from the suit.
+/obj/item/mod/module/orebag
+ name = "MOD ore bag module"
+ desc = "An integrated ore storage system installed into the suit, \
+ this utilizes precise electromagnets and storage compartments to automatically collect and deposit ore. \
+ It's recommended by Nakamura Engineering to actually deposit that ore at local refineries."
+ icon_state = "ore"
+ module_type = MODULE_USABLE
+ complexity = 1
+ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2
+ incompatible_modules = list(/obj/item/mod/module/orebag)
+ cooldown_time = 0.5 SECONDS
+ allowed_inactive = TRUE
+ /// The ores stored in the bag.
+ var/list/ores = list()
+
+/obj/item/mod/module/orebag/on_equip()
+ RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(ore_pickup))
+
+/obj/item/mod/module/orebag/on_unequip()
+ UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
+
+/obj/item/mod/module/orebag/proc/ore_pickup(atom/movable/source, atom/old_loc, dir, forced)
+ SIGNAL_HANDLER
+
+ for(var/obj/item/stack/ore/ore in get_turf(mod.wearer))
+ INVOKE_ASYNC(src, PROC_REF(move_ore), ore)
+ playsound(src, SFX_RUSTLE, 50, TRUE)
+
+/obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore)
+ for(var/obj/item/stack/stored_ore as anything in ores)
+ if(!ore.can_merge(stored_ore))
+ continue
+ ore.merge(stored_ore)
+ if(QDELETED(ore))
+ return
+ break
+ ore.forceMove(src)
+ ores += ore
+
+/obj/item/mod/module/orebag/on_use()
+ . = ..()
+ if(!.)
+ return
+ for(var/obj/item/ore as anything in ores)
+ ore.forceMove(drop_location())
+ ores -= ore
+ drain_power(use_power_cost)
+
+/obj/item/mod/module/disposal_connector
+ name = "MOD disposal selector module"
+ desc = "A module that connects to the disposal pipeline, causing the user to go into their config selected disposal. \
+ Only seems to work when the suit is on."
+ icon_state = "disposal"
+ complexity = 2
+ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/disposal_connector)
+ var/disposal_tag = NONE
+
+/obj/item/mod/module/disposal_connector/Initialize(mapload)
+ . = ..()
+ disposal_tag = pick(GLOB.TAGGERLOCATIONS)
+
+/obj/item/mod/module/disposal_connector/on_suit_activation()
+ RegisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposal_handling))
+
+/obj/item/mod/module/disposal_connector/on_suit_deactivation(deleting = FALSE)
+ UnregisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING)
+
+/obj/item/mod/module/disposal_connector/get_configuration()
+ . = ..()
+ .["disposal_tag"] = add_ui_configuration("Disposal Tag", "list", GLOB.TAGGERLOCATIONS[disposal_tag], GLOB.TAGGERLOCATIONS)
+
+/obj/item/mod/module/disposal_connector/configure_edit(key, value)
+ switch(key)
+ if("disposal_tag")
+ for(var/tag in 1 to length(GLOB.TAGGERLOCATIONS))
+ if(GLOB.TAGGERLOCATIONS[tag] == value)
+ disposal_tag = tag
+ break
+
+/obj/item/mod/module/disposal_connector/proc/disposal_handling(datum/disposal_source, obj/structure/disposalholder/disposal_holder, obj/machinery/disposal/disposal_machine, hasmob)
+ SIGNAL_HANDLER
+
+ disposal_holder.destinationTag = disposal_tag
+
+/obj/item/mod/module/magnet
+ name = "MOD loader hydraulic magnet module"
+ desc = "A powerful hydraulic electromagnet able to launch crates and lockers towards the user, and keep 'em attached."
+ icon_state = "magnet_loader"
+ module_type = MODULE_ACTIVE
+ removable = FALSE
+ use_power_cost = DEFAULT_CHARGE_DRAIN*3
+ incompatible_modules = list(/obj/item/mod/module/magnet)
+ cooldown_time = 1.5 SECONDS
+ overlay_state_active = "module_magnet"
+ use_mod_colors = TRUE
+
+/obj/item/mod/module/magnet/on_select_use(atom/target)
+ . = ..()
+ if(!.)
+ return
+ if(istype(mod.wearer.pulling, /obj/structure/closet))
+ var/obj/structure/closet/locker = mod.wearer.pulling
+ playsound(locker, 'sound/effects/gravhit.ogg', 75, TRUE)
+ locker.forceMove(mod.wearer.loc)
+ locker.throw_at(target, range = 7, speed = 4, thrower = mod.wearer)
+ return
+ if(!istype(target, /obj/structure/closet) || !(target in view(mod.wearer)))
+ balloon_alert(mod.wearer, "invalid target!")
+ return
+ var/obj/structure/closet/locker = target
+ if(locker.anchored || locker.move_resist >= MOVE_FORCE_OVERPOWERING)
+ balloon_alert(mod.wearer, "target anchored!")
+ return
+ new /obj/effect/temp_visual/mook_dust(get_turf(locker))
+ playsound(locker, 'sound/effects/gravhit.ogg', 75, TRUE)
+ locker.throw_at(mod.wearer, range = 7, speed = 3, force = MOVE_FORCE_WEAK, \
+ callback = CALLBACK(src, PROC_REF(check_locker), locker))
+
+/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ if(istype(mod.wearer.pulling, /obj/structure/closet))
+ mod.wearer.stop_pulling()
+
+/obj/item/mod/module/magnet/proc/check_locker(obj/structure/closet/locker)
+ if(!mod?.wearer)
+ return
+ if(!locker.Adjacent(mod.wearer) || !isturf(locker.loc) || !isturf(mod.wearer.loc))
+ return
+ mod.wearer.start_pulling(locker)
+ //locker.strong_grab = TRUE
+ RegisterSignal(locker, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_stop_pull))
+
+/obj/item/mod/module/magnet/proc/on_stop_pull(obj/structure/closet/locker, atom/movable/last_puller)
+ SIGNAL_HANDLER
+
+ //locker.strong_grab = FALSE
+ UnregisterSignal(locker, COMSIG_ATOM_NO_LONGER_PULLED)
diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm
new file mode 100644
index 000000000000..e1516c2aa0a1
--- /dev/null
+++ b/code/modules/mod/modules/modules_visor.dm
@@ -0,0 +1,85 @@
+//Visor modules for MODsuits
+
+///Base Visor - Adds a specific HUD and traits to you.
+/obj/item/mod/module/visor
+ name = "MOD visor module"
+ desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you."
+ module_type = MODULE_TOGGLE
+ complexity = 2
+ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3
+ incompatible_modules = list(/obj/item/mod/module/visor)
+ cooldown_time = 0.5 SECONDS
+ /// The HUD type given by the visor.
+ var/hud_type
+ /// The traits given by the visor.
+ var/list/visor_traits = list()
+
+/obj/item/mod/module/visor/on_activation()
+ . = ..()
+ if(!.)
+ return
+ if(hud_type)
+ var/datum/atom_hud/hud = GLOB.huds[hud_type]
+ hud.add_hud_to(mod.wearer)
+ for(var/trait in visor_traits)
+ ADD_TRAIT(mod.wearer, trait, MOD_TRAIT)
+ mod.wearer.update_sight()
+
+/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE)
+ . = ..()
+ if(!.)
+ return
+ if(hud_type)
+ var/datum/atom_hud/hud = GLOB.huds[hud_type]
+ hud.remove_hud_from(mod.wearer)
+ for(var/trait in visor_traits)
+ REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT)
+ mod.wearer.update_sight()
+
+//Medical Visor - Gives you a medical HUD.
+/obj/item/mod/module/visor/medhud
+ name = "MOD medical visor module"
+ desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \
+ biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \
+ access data such as patient files in a convenient readout. They say these also let you see behind you."
+ icon_state = "medhud_visor"
+ hud_type = DATA_HUD_MEDICAL_ADVANCED
+ visor_traits = list(TRAIT_MEDICAL_HUD)
+
+//Diagnostic Visor - Gives you a diagnostic HUD.
+/obj/item/mod/module/visor/diaghud
+ name = "MOD diagnostic visor module"
+ desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \
+ from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \
+ and integrity of such. They say these also let you see behind you."
+ icon_state = "diaghud_visor"
+ hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED
+ visor_traits = list(TRAIT_DIAGNOSTIC_HUD)
+
+//Security Visor - Gives you a security HUD.
+/obj/item/mod/module/visor/sechud
+ name = "MOD security visor module"
+ desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \
+ plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \
+ and generally know who to shoot. They say these also let you see behind you."
+ icon_state = "sechud_visor"
+ hud_type = DATA_HUD_SECURITY_ADVANCED
+ visor_traits = list(TRAIT_SECURITY_HUD)
+
+//Meson Visor - Gives you meson vision.
+/obj/item/mod/module/visor/meson
+ name = "MOD meson visor module"
+ desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \
+ technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \
+ through walls, regardless of lighting conditions. They say these also let you see behind you."
+ icon_state = "meson_visor"
+ visor_traits = list(SEE_TURFS)
+
+//Thermal Visor - Gives you thermal vision.
+/obj/item/mod/module/visor/thermal
+ name = "MOD thermal visor module"
+ desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \
+ the thermal radiation output of objects near the user. While it can detect the heat output of even something as \
+ small as a rodent, it still produces irritating red overlay. They say these also let you see behind you."
+ icon_state = "thermal_visor"
+ visor_traits = list(SEE_MOBS)
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index c858582af6a3..4c967a58a7ec 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -18,3 +18,5 @@
/datum/movespeed_modifier/berserk
multiplicative_slowdown = -0.2
+/datum/movespeed_modifier/sphere
+ multiplicative_slowdown = -0.5
diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm
index 1c9b9974ed1b..8a3424c8eb11 100644
--- a/code/modules/overmap/missions/acquire_mission.dm
+++ b/code/modules/overmap/missions/acquire_mission.dm
@@ -14,6 +14,7 @@
/datum/mission/acquire/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc)
. = ..()
container = spawn_bound(container_type, accept_loc, VARSET_CALLBACK(src, container, null))
+ container.name += " ([capitalize(objective_type.name)])"
/datum/mission/acquire/Destroy()
container = null
diff --git a/code/modules/overmap/missions/drill_mission.dm b/code/modules/overmap/missions/drill_mission.dm
index 06859e8327d2..307d73d59592 100644
--- a/code/modules/overmap/missions/drill_mission.dm
+++ b/code/modules/overmap/missions/drill_mission.dm
@@ -21,7 +21,7 @@
sampler = spawn_bound(/obj/machinery/drill/mission, accept_loc, VARSET_CALLBACK(src, sampler, null))
sampler.mission_class = class_wanted
sampler.num_wanted = num_wanted
-
+ sampler.name += " (Class [class_wanted])"
//Gives players a little extra money for going past the mission goal
/datum/mission/drill/turn_in()
value += (sampler.num_current - num_wanted)*50
diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm
index bfed840a1acd..d798fd74778a 100644
--- a/code/modules/overmap/objects/event_datum.dm
+++ b/code/modules/overmap/objects/event_datum.dm
@@ -194,55 +194,25 @@
chance_to_affect = 100
///The currently linked wormhole
var/datum/overmap/event/wormhole/other_wormhole
- ///Amount of times a ship can pass through before it collapses
- var/stability
/datum/overmap/event/wormhole/Initialize(position, _other_wormhole, ...)
. = ..()
- stability = rand(1, 5)
if(_other_wormhole)
other_wormhole = _other_wormhole
if(!other_wormhole)
other_wormhole = new(null, src) //Create a new wormhole at a random location
- token.color = adjust_colors()
- token.light_color = adjust_colors()
+ token.color = "#6d80c7"
+ token.light_color = "#6d80c7"
token.update_appearance()
/datum/overmap/event/wormhole/affect_ship(datum/overmap/ship/controlled/S)
if(!other_wormhole)
qdel(src)
- if(--stability <= 0)
- var/list/results = SSovermap.get_unused_overmap_square()
- S.overmap_move(results["x"], results["y"])
- QDEL_NULL(other_wormhole)
- for(var/MN in GLOB.player_list)
- var/mob/M = MN
- if(S.shuttle_port.is_in_shuttle_bounds(M))
- M.playsound_local(S.shuttle_port, 'sound/effects/explosionfar.ogg', 100)
- shake_camera(M, 10, 10)
-
- return qdel(src)
- other_wormhole.stability = stability
+ return
S.overmap_move(other_wormhole.x, other_wormhole.y)
S.overmap_step(S.get_heading())
- token.color = adjust_colors()
- token.light_color = adjust_colors()
-
-/datum/overmap/event/wormhole/proc/adjust_colors()
- switch(stability)
- if(1)
- return "#753214"
- if(2)
- return "#642f19"
- if(3)
- return"#654650"
- if(4)
- return"#5c5d8b"
- if(5)
- return"#6d80c7"
-
//Carp "meteors" - throws carp at the ship
/datum/overmap/event/meteor/carp
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
index bce7a3f322c5..0bf0a3eb51d3 100644
--- a/code/modules/paperwork/fax.dm
+++ b/code/modules/paperwork/fax.dm
@@ -36,7 +36,7 @@
/// List of types which should be allowed to be faxed if hacked
var/static/list/exotic_types = list(
/obj/item/reagent_containers/food/snacks/pizzaslice,
- /obj/item/reagent_containers/food/snacks/breadslice,
+ /obj/item/food/breadslice,
/obj/item/reagent_containers/food/snacks/donkpocket,
/obj/item/reagent_containers/food/snacks/cookie,
/obj/item/reagent_containers/food/snacks/salami,
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index 93b8319dbed7..e91a03e421f3 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -20,6 +20,7 @@
slot_flags = ITEM_SLOT_NECK
custom_materials = list(/datum/material/iron = 50, /datum/material/glass = 150)
custom_price = 120
+ supports_variations = VOX_VARIATION
var/flash_enabled = TRUE
var/state_on = "camera"
var/state_off = "camera_off"
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 8d711ad804fa..c9367ceecfbe 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -13,6 +13,7 @@
var/lastgen = 0
var/lastgenlev = -1
+ var/max_efficiency = 0.45
/obj/machinery/power/generator/Initialize(mapload)
. = ..()
@@ -75,12 +76,13 @@
if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
- var/efficiency = 0.45 //WS Edit - Nerfed down to Cit's efficiency
+ var/efficiency = LOGISTIC_FUNCTION(max_efficiency,0.0009,delta_temperature,10000)
+ //2nd (0.0009) effects how 'steep' the curve is, and 4th (10000) effects where the 'middle' is.
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
+ lastgen += energy_transfer * efficiency
var/heat = energy_transfer*(1-efficiency)
- lastgen += LOGISTIC_FUNCTION(500000,0.0009,delta_temperature,10000) //WS Edit - Buries the 3x3 freezer heater TEG into the ground
hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
index b3875292fba2..786005aa5ca1 100644
--- a/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -39,8 +39,8 @@
// 5.56x39mm (M-90gl Carbine & P-16)
/obj/item/ammo_casing/a556_39
- name = "5.56x39mm bullet casing"
- desc = "A 5.56x39mm bullet casing."
+ name = "5.56x39mm CLIP bullet casing"
+ desc = "A 5.56x39mm CLIP bullet casing."
icon_state = "rifle-brass"
caliber = "5.56x45mm"
projectile_type = /obj/projectile/bullet/a556_45
@@ -74,22 +74,6 @@
projectile_type = /obj/projectile/bullet/a762_40
bullet_per_box = 80
-// .300 Blackout (Polymer Survivor Rifle)
-
-/obj/item/ammo_casing/aac_300blk
- name = ".300 BLK bullet casing"
- desc = "A .300 Blackout bullet casing."
- icon_state = "rifle-steel"
- caliber = ".300 BLK"
- projectile_type = /obj/projectile/bullet/aac_300blk
- bullet_per_box = 20
-
-/obj/item/ammo_casing/aac_300blk/recycled
- name = "recycled .300 BLK bullet casing"
- desc = "A recycled .300 Blackout bullet casing."
- caliber = ".300 BLK"
- projectile_type = /obj/projectile/bullet/aac_300blk
-
//.308 (M514 EBR & CM-GAL-S)
/obj/item/ammo_casing/a308
@@ -107,3 +91,10 @@
caliber = ".299 caseless"
projectile_type = /obj/projectile/bullet/c299
bullet_per_box = 100
+
+/obj/item/ammo_casing/a65clip
+ name = "6.5x57mm CLIP bullet casing"
+ desc = "A 6.5x57mm CLIP bullet casing."
+ icon_state = "big-brass"
+ caliber = "6.5CLIP"
+ projectile_type = /obj/projectile/bullet/a65clip
diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm
index 9ebb6d88f2d7..3eccf800defe 100644
--- a/code/modules/projectiles/ammunition/caseless/rocket.dm
+++ b/code/modules/projectiles/ammunition/caseless/rocket.dm
@@ -8,7 +8,7 @@
/obj/item/ammo_casing/caseless/rocket/hedp
name = "\improper PM-9HEDP"
- desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs."
+ desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward armor."
caliber = "84mm"
icon_state = "84mm-hedp"
projectile_type = /obj/projectile/bullet/a84mm
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 955856704ac6..e8e5c59c9c65 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -136,6 +136,9 @@
multiple_sprites = AMMO_BOX_PER_BULLET
instant_load = TRUE
+/obj/item/ammo_box/a858/empty
+ start_empty = TRUE
+
// .308 Stripper Clip (Vickland)
/obj/item/ammo_box/vickland_a308
@@ -149,6 +152,8 @@
w_class = WEIGHT_CLASS_TINY
instant_load = TRUE
+/obj/item/ammo_box/vickland_a308/empty
+ start_empty = TRUE
// .300 Magnum Stripper Clip (Scout)
@@ -164,19 +169,22 @@
/obj/item/ammo_box/a300/empty
start_empty = TRUE
-// .300 Blackout Stripper Clip (Polymer Survivor Rifle)
+// 7.62 Stripper Clip (Polymer Survivor Rifle)
-/obj/item/ammo_box/aac_300blk_stripper
- name = "stripper clip (.300 BLK)"
+/obj/item/ammo_box/a762_stripper
+ name = "stripper clip (7.62)"
desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration."
- icon_state = "300m"
- ammo_type = /obj/item/ammo_casing/aac_300blk
- caliber = ".300 BLK"
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
+ ammo_type = /obj/item/ammo_casing/a762_40
+ caliber = "7.62x40mm"
max_ammo = 5
multiple_sprites = AMMO_BOX_PER_BULLET
w_class = WEIGHT_CLASS_TINY
instant_load = TRUE
+/obj/item/ammo_box/a762_stripper/empty
+ start_empty = TRUE
// Ferromagnetic Pellet Speed Loader (Claris)
/obj/item/ammo_box/amagpellet_claris
@@ -390,6 +398,13 @@
/obj/item/ammo_box/a762_40/inteq
icon_state = "a762_40box_big_inteq"
+/obj/item/ammo_box/a556_39
+ name = "ammo box (5.56x39mm CLIP)"
+ icon_state = "a556_39box_big"
+ ammo_type = /obj/item/ammo_casing/a556_39
+ max_ammo = 120
+ w_class = WEIGHT_CLASS_NORMAL
+
/obj/item/ammo_box/a308
name = "ammo box (.308)"
icon_state = "a308box"
@@ -447,7 +462,7 @@
desc = "A box of standard 8x50mm ammo."
icon_state = "8x50mmbox"
ammo_type = /obj/item/ammo_casing/a8_50r
- max_ammo = 20
+ max_ammo = 25
/obj/item/ammo_box/ferropelletbox
name = "ammo box (ferromagnetic pellets)"
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 9224c0db84af..781641a6eef1 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -85,9 +85,9 @@
. = ..()
icon_state = "ebr_mag-[!!ammo_count()]"
-/obj/item/ammo_box/magazine/gal
- name = "\improper GAL Magazine (.308)"
- desc = "A standard 10-round magazine for GAL platform DMRs. These rounds do good damage with significant armor penetration."
+/obj/item/ammo_box/magazine/f4_308
+ name = "\improper F4 Magazine (.308)"
+ desc = "A standard 10-round magazine for F4 platform DMRs. These rounds do good damage with significant armor penetration."
icon_state = "gal_mag-1"
base_icon_state = "gal_mag"
ammo_type = /obj/item/ammo_casing/a308
@@ -95,7 +95,7 @@
max_ammo = 10
multiple_sprites = AMMO_BOX_FULL_EMPTY
-/obj/item/ammo_box/magazine/p16
+/obj/item/ammo_box/magazine/p16 //repath to /obj/item/ammo_box/magazine/generic_556 sometime
name = "assault rifle magazine (5.56x45mm)"
desc = "A simple, 30-round magazine for 5.56x45mm assault rifles. These rounds do moderate damage with good armor penetration."
icon_state = "p16_mag-1"
diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
index 3c9aaad1f6f6..b45051fd2644 100644
--- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm
@@ -37,7 +37,7 @@
max_ammo = 6
w_class = WEIGHT_CLASS_SMALL //Smaller, holds less
-/obj/item/ammo_box/magazine/cm15_mag
+/obj/item/ammo_box/magazine/cm15_12g
name = "CM-15 magazine (12g buckshot)"
desc = "An almost straight, 8-round magazine designed for the CM-15 shotgun."
icon_state = "cm15_mag-1"
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index 4c464c0433d0..ca1355bab3a0 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -28,19 +28,6 @@
base_icon_state = "46x30mmtI"
ammo_type = /obj/item/ammo_casing/c46x30mm/inc
-/obj/item/ammo_box/magazine/uzim9mm
- name = "long SMG magazine (9mm)"
- desc = "A thin, 32-round magazine for the Uzi SMG. These rounds do okay damage, but struggle against armor."
- icon_state = "uzi9mm-32"
- base_icon_state = "uzi9mm"
- ammo_type = /obj/item/ammo_casing/c9mm
- caliber = "9mm"
- max_ammo = 32
-
-/obj/item/ammo_box/magazine/uzim9mm/update_icon_state()
- . = ..()
- icon_state = "[base_icon_state]-[round(ammo_count(),4)]"
-
/obj/item/ammo_box/magazine/smgm9mm
name = "SMG magazine (9mm)"
desc = "A 30-round magazine for 9mm submachine guns. These rounds do okay damage, but struggle against armor."
@@ -106,7 +93,7 @@
/obj/item/ammo_box/magazine/c45_firestorm_mag
name = "stick magazine (.45)"
desc = "A 28-round stick magazine for the toploading Firestorm submachine gun. These rounds do moderate damage, but struggle against armor."
- icon_state = "firestorm_mag"
+ icon_state = "firestorm_mag-1"
base_icon_state = "firestorm_mag"
ammo_type = /obj/item/ammo_casing/c45
caliber = ".45"
diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
index 4f2f8c537958..e179fbfa903c 100644
--- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm
@@ -22,8 +22,8 @@
/obj/item/ammo_box/magazine/internal/boltaction/polymer
name = "polymer bolt action rifle internal magazine"
- ammo_type = /obj/item/ammo_casing/aac_300blk
- caliber = ".300 BLK"
+ ammo_type = /obj/item/ammo_casing/a762_40
+ caliber = "7.62x40mm"
max_ammo = 5
/obj/item/ammo_box/magazine/internal/vickland
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 579de31248e6..b0151144cce3 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -778,7 +778,7 @@
if(chambered && chambered.BB && can_trigger_gun(user))
chambered.BB.damage *= 3
//Check is here for safeties and such, brain will be removed after
- if(!pre_fire(target, user, TRUE, params, BODY_ZONE_HEAD))
+ if(!pre_fire(target, user, TRUE, FALSE, params, BODY_ZONE_HEAD)) // We're already in handle_suicide, hence the 4th parameter needs to be FALSE to avoid circular logic. Also, BODY_ZONE_HEAD because we want to damage the head as a whole.
return
var/obj/item/organ/brain/brain_to_blast = target.getorganslot(ORGAN_SLOT_BRAIN)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 2518319de90c..6af7de9a7878 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -84,6 +84,8 @@
. += "[icon_state]_mag_[capacity_number]"
if(!chambered && empty_indicator)
. += "[icon_state]_empty"
+ if(chambered && mag_display_ammo)
+ . += "[icon_state]_chambered"
/obj/item/gun/ballistic/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE, atom/shooter)
if(!semi_auto && from_firing)
@@ -109,7 +111,7 @@
chambered.forceMove(src)
///updates a bunch of racking related stuff and also handles the sound effects and the like
-/obj/item/gun/ballistic/proc/rack(mob/user = null)
+/obj/item/gun/ballistic/proc/rack(mob/user = null, chamber_new_round = TRUE)
if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack
return
if (bolt_type == BOLT_TYPE_OPEN)
@@ -120,21 +122,22 @@
bolt_locked = FALSE
if (user)
to_chat(user, "You rack the [bolt_wording] of \the [src].")
- process_chamber(!chambered, FALSE, shooter = user)
- if (bolt_type == BOLT_TYPE_LOCKING && !chambered)
+ process_chamber(!chambered, FALSE, chamber_new_round, user)
+ if ((bolt_type == BOLT_TYPE_LOCKING && !chambered) || bolt_type == BOLT_TYPE_CLIP)
bolt_locked = TRUE
playsound(src, lock_back_sound, lock_back_sound_volume, lock_back_sound_vary)
else
playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
- update_appearance()
+
SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD)
///Drops the bolt from a locked position
-/obj/item/gun/ballistic/proc/drop_bolt(mob/user = null)
+/obj/item/gun/ballistic/proc/drop_bolt(mob/user = null, chamber_new_round = TRUE)
playsound(src, bolt_drop_sound, bolt_drop_sound_volume, FALSE)
if (user)
to_chat(user, "You drop the [bolt_wording] of \the [src].")
- chamber_round()
+ if(chamber_new_round)
+ chamber_round()
bolt_locked = FALSE
update_appearance()
@@ -248,6 +251,8 @@
if (last_shot_succeeded && bolt_type == BOLT_TYPE_LOCKING)
bolt_locked = TRUE
update_appearance()
+ if (last_shot_succeeded && bolt_type == BOLT_TYPE_CLIP)
+ update_appearance()
/obj/item/gun/ballistic/pre_fire(atom/target, mob/living/user, message = TRUE, flag, params = null, zone_override = "", bonus_spread = 0, dual_wielded_gun = FALSE)
prefire_empty_checks()
@@ -283,13 +288,19 @@
else
to_chat(user, "[src] is empty!")
return
- if(bolt_type == BOLT_TYPE_LOCKING && bolt_locked)
+ if((bolt_type == BOLT_TYPE_LOCKING || bolt_type == BOLT_TYPE_CLIP) && bolt_locked)
drop_bolt(user)
return
+
if (recent_rack > world.time)
return
recent_rack = world.time + rack_delay
+ if(bolt_type == BOLT_TYPE_CLIP)
+ rack(user, FALSE)
+ update_appearance()
+ return
rack(user)
+ update_appearance()
return
@@ -301,7 +312,7 @@
. += "It does not seem to have a round chambered."
if (bolt_locked)
. += "The [bolt_wording] is locked back and needs to be released before firing."
- . += "You can [bolt_wording] [src] by pressing the unqiue action key. By default, this is space"
+ . += "You can [bolt_wording] [src] by pressing the unique action key. By default, this is space"
///Gets the number of bullets in the gun
/obj/item/gun/ballistic/proc/get_ammo(countchambered = TRUE)
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index 6e2eec8133fc..d5ed7a8225bf 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -97,7 +97,7 @@
/obj/item/gun/ballistic/automatic/assault/p16/no_mag
spawnwithmagazine = FALSE
-/obj/item/gun/ballistic/automatic/assault/p16/minutemen
+/obj/item/gun/ballistic/automatic/assault/cm82
name = "\improper CM-16"
desc = "The standard-issue rifle of CLIP and an extensively modified reproduction of the P-16. Chambered in 5.56mm."
icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index 1e479ee3d7ed..ccf21a2c7c0e 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -44,7 +44,7 @@
/obj/item/gun/ballistic/automatic/hmg/Initialize()
. = ..()
- for(var/datum/action/item_action/deploy_bipod/action as anything in actions_types)
+ for(var/datum/action/item_action/deploy_bipod/action as anything in actions)
if(!has_bipod)
qdel(action)
diff --git a/code/modules/projectiles/guns/ballistic/marksman.dm b/code/modules/projectiles/guns/ballistic/marksman.dm
index 46a9e2466290..0759de4f70e1 100644
--- a/code/modules/projectiles/guns/ballistic/marksman.dm
+++ b/code/modules/projectiles/guns/ballistic/marksman.dm
@@ -64,39 +64,3 @@ EMPTY_GUN_HELPER(automatic/marksman/sniper_rifle)
spread = -4
EMPTY_GUN_HELPER(automatic/marksman/ebr)
-
-/obj/item/gun/ballistic/automatic/marksman/gal
- name = "\improper CM-GAL-S"
- desc = "The standard issue DMR of CLIP. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
-
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
- icon_state = "gal"
- item_state = "gal"
- show_magazine_on_sprite = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_BULKY
- mag_type = /obj/item/ammo_box/magazine/gal
- fire_sound = 'sound/weapons/gun/rifle/gal.ogg'
- burst_size = 0
- actions_types = list()
- manufacturer = MANUFACTURER_MINUTEMAN
-
- wield_slowdown = 2
- spread = -4
- fire_select_icon_state_prefix = "clip_"
- adjust_fire_select_icon_state_on_safety = TRUE
-
-/obj/item/gun/ballistic/automatic/marksman/gal/inteq
- name = "\improper SsG-04"
- desc = "A marksman rifle purchased from CLIP and modified to suit IRMG's needs. Chambered in .308."
- icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
- icon_state = "gal-inteq"
- item_state = "gal-inteq"
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 1e7724c5c9fa..2d3cb6908c83 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -184,12 +184,12 @@
/obj/item/gun/ballistic/rifle/polymer
name = "polymer survivor rifle"
- desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout."
+ desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in 7.62x40mm."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "crackhead_rifle"
item_state = "crackhead_rifle"
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
+ weapon_weight = WEAPON_HEAVY
+ w_class = WEIGHT_CLASS_BULKY
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/polymer
can_be_sawn_off = FALSE
manufacturer = MANUFACTURER_NONE
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 10d39309e2de..f63328035959 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -269,24 +269,6 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq)
icon_state = "bulldog_suns"
item_state = "bulldog_suns"
-/obj/item/gun/ballistic/shotgun/bulldog/minutemen //TODO: REPATH
- name = "\improper CM-15"
- desc = "A standard-issue shotgun of CLIP, most often used by boarding crews. Only compatible with specialized 8-round magazines."
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
- mag_type = /obj/item/ammo_box/magazine/cm15_mag
- icon_state = "cm15"
- item_state = "cm15"
- empty_alarm = FALSE
- empty_indicator = FALSE
- unique_mag_sprites_for_variants = FALSE
- manufacturer = MANUFACTURER_MINUTEMAN
- fire_select_icon_state_prefix = "clip_"
- adjust_fire_select_icon_state_on_safety = TRUE
-
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 80751355cec9..d43e324cfacd 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -78,34 +78,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
/obj/item/gun/ballistic/automatic/smg/wt550/no_mag
spawnwithmagazine = FALSE
-/obj/item/gun/ballistic/automatic/smg/mini_uzi
- name = "\improper Type U3 Uzi"
- desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
-
- icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
- icon_state = "uzi"
-
- mag_type = /obj/item/ammo_box/magazine/uzim9mm
- bolt_type = BOLT_TYPE_OPEN
- show_magazine_on_sprite = TRUE
-
- fire_sound = 'sound/weapons/gun/smg/uzi.ogg'
- rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
-
- load_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
- load_empty_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
- eject_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
- eject_empty_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
-
- spread = 4
- spread_unwielded = 8
- wield_slowdown = 0.25
- wield_delay = 0.2 SECONDS
- fire_delay = 0.1 SECONDS
-
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
desc = "A police carbine based on a pre-Night of Fire SMG design. Most of the complex workings have been removed for reliability. Chambered in 9mm."
@@ -234,41 +206,6 @@ EMPTY_GUN_HELPER(automatic/smg/c20r)
magazine = new /obj/item/ammo_box/magazine/c45_firestorm_mag/pan(src)
chamber_round()
-/obj/item/gun/ballistic/automatic/smg/cm5
- name = "\improper CM-5"
- desc = "The standard issue SMG of CLIP. One of the few firearm designs that were left mostly intact from the designs found on the UNSV Lichtenstein. Chambered in 9mm."
- icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
- lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
- righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
- mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
-
- icon_state = "cm5"
- item_state = "cm5"
-
- mag_type = /obj/item/ammo_box/magazine/smgm9mm
- weapon_weight = WEAPON_LIGHT
- fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
- manufacturer = MANUFACTURER_MINUTEMAN
-
- fire_select_icon_state_prefix = "clip_"
- adjust_fire_select_icon_state_on_safety = TRUE
-
-EMPTY_GUN_HELPER(automatic/smg/cm5)
-
-/obj/item/gun/ballistic/automatic/smg/cm5/compact
- name = "\improper CM-5c"
- desc = "The compact conversion of the CM-5. While not exactly restricted, it is looked down upon due to CLIP's doctrine on medium-longrange combat, however it excels at close range and is very lightweight. You feel like this gun is mildly unfinished. Chambered in 9mm."
- w_class = WEIGHT_CLASS_NORMAL
- spread = 25
- spread_unwielded = 40
-
- fire_delay = 0.08 SECONDS
-
- recoil = 1
- recoil_unwielded = 2
- wield_delay = 0.2 SECONDS
- wield_slowdown = 0.15
-
/obj/item/gun/ballistic/automatic/smg/skm_carbine
name = "\improper SKM-24v"
desc = "The SKM-24v was a carbine modification of the SKM-24 during the Frontiersmen War. This, however, is just a shoddy imitation of that carbine, effectively an SKM-24 with a sawed down barrel and a folding wire stock. Can be fired with the stock folded, though accuracy suffers. Chambered in 4.6x30mm."
diff --git a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm
new file mode 100644
index 000000000000..f32a2f11a508
--- /dev/null
+++ b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm
@@ -0,0 +1,478 @@
+//########### PISTOLS ###########//
+/obj/item/gun/ballistic/automatic/pistol/cm23
+ name = "\improper CM-23"
+ desc = "CLIP's standard service pistol. 10 rounds of 10mm ammunition make the CM-23 deadlier than many other service pistols, but its weight and bulk have made it unpopular as a sidearm. It has largely been phased out outside of specialized units and patrols on the fringes of CLIP space. Chambered in 10mm."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm23"
+ item_state = "clip_generic"
+ w_class = WEIGHT_CLASS_NORMAL
+ mag_type = /obj/item/ammo_box/magazine/cm23
+// can_suppress = FALSE
+ fire_sound = 'sound/weapons/gun/pistol/cm23.ogg'
+ rack_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg'
+ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
+ bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg'
+ manufacturer = MANUFACTURER_MINUTEMAN
+ load_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
+ recoil_unwielded = 3
+
+/obj/item/ammo_box/magazine/cm23
+ name = "CM-23 pistol magazine (10mm)"
+ desc = "An 10-round magazine magazine designed for the CM-70 pistol. These rounds do moderate damage, but struggle against armor."
+ icon_state = "cm23_mag-1"
+ base_icon_state = "cm23_mag"
+ ammo_type = /obj/item/ammo_casing/c10mm
+ caliber = "10mm"
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/cm23/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+/obj/item/gun/ballistic/automatic/pistol/cm70
+ name = "CM-70 machine pistol"
+ desc = "A compact machine pistol designed to rapidly fire 3-round bursts. Popular with officers and certain special units, the CM-70 is incredibly dangerous at close range. Chambered in 9mm."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm70"
+ item_state = "clip_generic"
+ mag_type = /obj/item/ammo_box/magazine/m9mm_cm70
+// can_suppress = FALSE
+ burst_size = 3
+ burst_delay = 0.1 SECONDS
+ fire_delay = 0.4 SECONDS
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST)
+ default_firemode = FIREMODE_SEMIAUTO
+ manufacturer = MANUFACTURER_MINUTEMAN
+
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+ fire_sound = 'sound/weapons/gun/pistol/cm70.ogg'
+
+ spread = 8
+ spread_unwielded = 20
+
+/obj/item/ammo_box/magazine/m9mm_cm70
+ name = "CM-70 machine pistol magazine (9mm)"
+ desc = "A 18-round magazine designed for the CM-70 machine pistol. These rounds do okay damage, but struggle against armor."
+ icon_state = "cm70_mag_18"
+ base_icon_state = "cm70_mag"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 18
+
+
+/obj/item/ammo_box/magazine/m9mm_cm70/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]_[ammo_count() == 1 ? 1 : round(ammo_count(),3)]"
+
+//########### SMGS ###########//
+/obj/item/gun/ballistic/automatic/smg/cm5
+ name = "\improper CM-5"
+ desc = "CLIP's standard-issue submachine gun. Well-liked for its accuracy, stability, and ease of use compared to other submachineguns. Chambered in 9mm."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm5"
+ item_state = "cm5"
+
+ mag_type = /obj/item/ammo_box/magazine/cm5_9mm
+ bolt_type = BOLT_TYPE_CLIP
+ weapon_weight = WEAPON_LIGHT
+ fire_sound = 'sound/weapons/gun/smg/cm5.ogg'
+ manufacturer = MANUFACTURER_MINUTEMAN
+
+ valid_attachments = list(
+ /obj/item/attachment/silencer,
+ /obj/item/attachment/laser_sight,
+ /obj/item/attachment/rail_light,
+ /obj/item/attachment/bayonet
+ )
+ slot_available = list(
+ ATTACHMENT_SLOT_MUZZLE = 1,
+ ATTACHMENT_SLOT_RAIL = 1
+ )
+ slot_offsets = list(
+ ATTACHMENT_SLOT_MUZZLE = list(
+ "x" = 37,
+ "y" = 20,
+ ),
+ ATTACHMENT_SLOT_RAIL = list(
+ "x" = 27,
+ "y" = 17,
+ )
+ )
+
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+EMPTY_GUN_HELPER(automatic/smg/cm5)
+
+/obj/item/ammo_box/magazine/cm5_9mm
+ name = "CM-5 magazine (9mm)"
+ desc = "A 30-round magazine for 9mm submachine guns. These rounds do okay damage, but struggle against armor."
+ icon_state = "cm5_mag-1"
+ base_icon_state = "cm5_mag"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 30
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
+
+/obj/item/gun/ballistic/automatic/smg/cm5/compact
+ name = "\improper CM-5c"
+ desc = "A modification of the CM-5 featuring a dramatically shortened barrel and removed stock. Designed for CLIP-GOLD covert enforcement agents to maximize portability without sacrificing firepower, though accuracy at range is abysmal at best. Chambered in 9mm."
+ icon_state = "cm5c"
+ item_state = "cm5c"
+
+ w_class = WEIGHT_CLASS_NORMAL
+ spread = 10
+ spread_unwielded = 20
+
+ fire_delay = 0.1 SECONDS
+
+ slot_offsets = list(
+ ATTACHMENT_SLOT_MUZZLE = list(
+ "x" = 30,
+ "y" = 20,
+ ),
+ ATTACHMENT_SLOT_RAIL = list(
+ "x" = 22,
+ "y" = 17,
+ )
+ )
+
+
+ recoil = 1
+ recoil_unwielded = 2
+ wield_delay = 0.2 SECONDS
+ wield_slowdown = 0.15
+
+ var/obj/item/storage/briefcase/current_case
+
+/obj/item/gun/ballistic/automatic/smg/cm5/compact/attackby(obj/item/attacking_item, mob/user, params)
+ . = ..()
+ if(current_case)
+ return
+ if(!istype(attacking_item, /obj/item/storage/briefcase))
+ return
+ if(attacking_item.contents.len != 0)
+ return
+ to_chat(user, span_notice("...? You rig [src] to fire from within [attacking_item]."))
+ current_case = attacking_item
+ attacking_item.forceMove(src)
+ icon = attacking_item.icon
+ base_icon_state = attacking_item.icon_state
+ item_state = attacking_item.item_state
+ name = attacking_item.name
+ lefthand_file = attacking_item.lefthand_file
+ righthand_file = attacking_item.righthand_file
+ pickup_sound = attacking_item.pickup_sound
+ drop_sound = attacking_item.drop_sound
+ w_class = WEIGHT_CLASS_BULKY
+
+//how are you even supposed to hold it like this...?
+ spread += 10
+ spread_unwielded +=10
+
+ cut_overlays()
+ update_appearance()
+
+/obj/item/gun/ballistic/automatic/smg/cm5/compact/AltClick(mob/user)
+ if(!current_case)
+ return ..()
+ current_case.forceMove(get_turf(src))
+ icon = src::icon
+ base_icon_state = src::icon_state
+ item_state = src::item_state
+ name = src::name
+ lefthand_file = src::lefthand_file
+ righthand_file = src::righthand_file
+ pickup_sound = src::pickup_sound
+ drop_sound = src::drop_sound
+ w_class = WEIGHT_CLASS_NORMAL
+
+ spread = src::spread
+ spread_unwielded = src::spread_unwielded
+ to_chat(user, span_notice("You remove the [current_case] from [src]"))
+ current_case = null
+
+ cut_overlays()
+ update_appearance()
+
+
+//########### MARKSMAN ###########//
+/obj/item/gun/ballistic/automatic/marksman/f4
+ name = "CM-F4"
+ desc = "CLIP's marksman rifle, used by both military and law enforcement units. Designed not long after the CM-24, the venerable F4 has adapted well to continued upgrades. Chambered in .308."
+
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
+ icon_state = "f4"
+ item_state = "f4"
+ show_magazine_on_sprite = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_BULKY
+ bolt_type = BOLT_TYPE_CLIP
+ mag_type = /obj/item/ammo_box/magazine/f4_308
+ fire_sound = 'sound/weapons/gun/rifle/f4.ogg'
+ burst_size = 0
+ actions_types = list()
+ manufacturer = MANUFACTURER_MINUTEMAN
+
+ valid_attachments = list(
+ /obj/item/attachment/silencer,
+ /obj/item/attachment/laser_sight,
+ /obj/item/attachment/rail_light,
+ /obj/item/attachment/bayonet
+ )
+ slot_available = list(
+ ATTACHMENT_SLOT_MUZZLE = 1,
+ ATTACHMENT_SLOT_RAIL = 1
+ )
+ slot_offsets = list(
+ ATTACHMENT_SLOT_MUZZLE = list(
+ "x" = 48,
+ "y" = 17,
+ ),
+ ATTACHMENT_SLOT_RAIL = list(
+ "x" = 35,
+ "y" = 16,
+ )
+ )
+
+ wield_slowdown = 2
+ spread = -4
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+/obj/item/gun/ballistic/automatic/marksman/f4/inteq
+ name = "\improper SsG-04"
+ desc = "An F4 rifle purchased from CLIP and modified to suit IRMG's needs. Chambered in .308."
+ icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi'
+ icon_state = "f4_inteq"
+ item_state = "f4_inteq"
+
+/obj/item/gun/ballistic/automatic/marksman/f90
+ name = "CM-F90"
+ desc = "A powerful sniper rifle used by vanishingly rare CLIP specialists, capable of impressive range and penetrating power. Chambered in 6.5mm CLIP."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "f90"
+ item_state = "f90"
+
+ fire_sound = 'sound/weapons/gun/sniper/cmf90.ogg'
+
+ mag_type = /obj/item/ammo_box/magazine/f90
+ bolt_type = BOLT_TYPE_CLIP
+
+ fire_delay = 1 SECONDS
+
+ manufacturer = MANUFACTURER_MINUTEMAN
+ spread = -5
+ spread_unwielded = 35
+ recoil = 4
+ recoil_unwielded = 10
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
+ zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
+ zoom_out_amt = 5
+
+/obj/item/ammo_box/magazine/f90
+ name = "\improper CM-F90 Magazine (6.5x57mm CLIP)"
+ desc = "A large 5-round box magazine for the CM-F90 sniper rifles. These rounds deal amazing damage and bypass half of their protective equipment, though it isn't a high enough caliber to pierce armored vehicles."
+ base_icon_state = "f90_mag"
+ icon_state = "f90_mag-1"
+ ammo_type = /obj/item/ammo_casing/a65clip
+ caliber = "6.5CLIP"
+ max_ammo = 5
+
+/obj/item/ammo_box/magazine/f90/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+//########### RIFLES ###########//
+/obj/item/gun/ballistic/automatic/assault/cm82
+ name = "\improper CM-82"
+ desc = "CLIP's standard assault rifle, still relatively new in service. Accurate, reliable, and easy to use, the CM-82 replaced the CM-24 as CLIP's assault rifle almost overnight, and has proven immensely popular since. Chambered in 5.56mm."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ fire_sound = 'sound/weapons/gun/rifle/cm82.ogg'
+ icon_state = "cm82"
+ item_state = "cm82"
+ show_magazine_on_sprite = TRUE
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ bolt_type = BOLT_TYPE_CLIP
+ mag_type = /obj/item/ammo_box/magazine/p16
+ spread = 2
+ wield_delay = 0.5 SECONDS
+
+ fire_delay = 0.18 SECONDS
+
+ load_sound = 'sound/weapons/gun/rifle/cm82_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/cm82_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/cm82_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/cm82_unload.ogg'
+
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+/obj/item/gun/ballistic/automatic/assault/skm/cm24
+ name = "\improper CM-24"
+ desc = "An obsolete and very rugged assault rifle with a heavy projectile and slow action for its class. Once CLIP's standard assault rifle produced in phenomenal numbers for the First Frontiersman War, it now serves as an acceptable, if rare, battle rifle. Chambered in 7.62mm CLIP."
+
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm24"
+ item_state = "cm24"
+ manufacturer = MANUFACTURER_NONE
+
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+/obj/item/gun/ballistic/automatic/hmg/cm40
+ name = "\improper CM-40"
+ desc = "A light machine gun used by CLIP heavy weapons teams, capable of withering suppressive fire. The weight and recoil make it nearly impossible to use without deploying the bipod against appropriate cover, such as a table, or bracing against solid cover. Chambered in 7.62x40mm CLIP."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm40"
+ item_state = "cm40"
+
+ fire_delay = 0
+
+ fire_sound = 'sound/weapons/gun/hmg/cm40.ogg'
+ rack_sound = 'sound/weapons/gun/hmg/cm40_cocked.ogg'
+
+ rack_sound_vary = FALSE
+
+ load_sound_vary = FALSE
+ eject_sound_vary = FALSE
+
+ load_sound = 'sound/weapons/gun/hmg/cm40_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/hmg/cm40_reload.ogg'
+ eject_sound = 'sound/weapons/gun/hmg/cm40_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/hmg/cm40_unload.ogg'
+
+ fire_delay = 0.1 SECONDS
+
+ show_magazine_on_sprite = TRUE
+ weapon_weight = WEAPON_MEDIUM
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ manufacturer = MANUFACTURER_MINUTEMAN
+ mag_type = /obj/item/ammo_box/magazine/cm40_762_40_box
+
+ spread = 10
+ spread_unwielded = 35
+
+ recoil = 2 //identical to other LMGS
+ recoil_unwielded = 7 //same as skm
+
+ wield_slowdown = 1 //not as severe as other lmgs, but worse than the normal skm
+ wield_delay = 0.9 SECONDS //faster than normal lmgs, slower than stock skm
+
+ has_bipod = TRUE
+
+ deploy_recoil_bonus = -2
+ deploy_spread_bonus = -6
+
+/obj/item/gun/ballistic/automatic/hmg/cm40/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
+ AddElement(/datum/element/update_icon_updates_onmob)
+
+/obj/item/ammo_box/magazine/cm40_762_40_box
+ name = "CM-40 box magazine (7.62x40mm CLIP)"
+ desc = "An 80 round box magazine for CM-40 light machine gun. These rounds do good damage with good armor penetration."
+ base_icon_state = "cm40_mag"
+ icon_state = "cm40_mag-1"
+ ammo_type = /obj/item/ammo_casing/a762_40
+ max_ammo = 80
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/ammo_box/magazine/cm40_762_40_box/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+//########### MISC ###########//
+
+/obj/item/gun/ballistic/shotgun/cm15
+ name = "\improper CM-15"
+ desc = "A large automatic shotgun used by CLIP. Generally employed by law enforcement and breaching specialists, and rarely by CLIP-BARD (typically with incendiary ammunition). Chambered in 12 gauge."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+
+
+ icon_state = "cm15"
+ item_state = "cm15"
+
+ fire_select_icon_state_prefix = "clip_"
+ adjust_fire_select_icon_state_on_safety = TRUE
+
+ manufacturer = MANUFACTURER_MINUTEMAN
+
+ weapon_weight = WEAPON_MEDIUM
+// can_suppress = FALSE
+ mag_type = /obj/item/ammo_box/magazine/cm15_12g
+
+ empty_indicator = FALSE
+ unique_mag_sprites_for_variants = FALSE
+
+ semi_auto = TRUE
+ internal_magazine = FALSE
+ casing_ejector = TRUE
+ tac_reloads = TRUE
+ pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+
+ fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg'
+
+ load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+
+ spread = 4
+ spread_unwielded = 16
+ recoil = 1
+ recoil_unwielded = 4
+ wield_slowdown = 0.6
+ wield_delay = 0.65 SECONDS
+
diff --git a/code/modules/projectiles/guns/manufacturer/clip_lanchester/lasers.dm b/code/modules/projectiles/guns/manufacturer/clip_lanchester/lasers.dm
new file mode 100644
index 000000000000..2fbe0009a563
--- /dev/null
+++ b/code/modules/projectiles/guns/manufacturer/clip_lanchester/lasers.dm
@@ -0,0 +1,43 @@
+/obj/item/gun/energy/kalix/clip
+ name = "CM-1"
+ desc = "CLIP's first standard-issue weapon, a near-copy of colonial-era weapons left behind by Free Zohil forces in CLIP's founding years. Outdated and difficult to source replacement parts for, but nevertheless still very common among BARD personnel and for ceremonal use."
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm1"
+ item_state = "cm1"
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
+
+ cell_type = /obj/item/stock_parts/cell/gun
+ ammo_type = list(/obj/item/ammo_casing/energy/kalix, /obj/item/ammo_casing/energy/disabler/hitscan)
+
+ manufacturer = MANUFACTURER_MINUTEMAN_LASER
+
+/obj/item/gun/energy/laser/e50/clip
+ name = "ECM-50"
+ desc = "An extensive modification of the Eoehoma E-50 Emitter, customized specifically for CLIP-BARD. Sacrifices some of the E-50's raw power for vastly improved energy efficiency, while preserving its incendiary side-effects."
+
+ icon = 'icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
+
+ icon_state = "cm50"
+ item_state = "cm50"
+ shaded_charge = TRUE
+ charge_sections = 4
+
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/eoehoma/e50/clip)
+
+/obj/item/ammo_casing/energy/laser/eoehoma/e50/clip
+ projectile_type = /obj/projectile/beam/emitter/hitscan/clip
+ fire_sound = 'sound/weapons/gun/laser/heavy_laser.ogg'
+ e_cost = 6250
+ delay = 0.6 SECONDS
+
+/obj/projectile/beam/emitter/hitscan/clip
+ damage = 35
diff --git a/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm b/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm
index 4053b5f4d8a6..4e16d2d03512 100644
--- a/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm
+++ b/code/modules/projectiles/guns/manufacturer/etherbor/energy_gunsword.dm
@@ -50,10 +50,12 @@
desc = "The BG-16 is the military-grade beam gun designed and manufactured by Etherbor Industries as the standard-issue close-range weapon of the PGF."
icon_state = "pgfgun"
item_state = "pgfgun"
- w_class = WEIGHT_CLASS_NORMAL
+
+ gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_SEMIAUTO
cell_type = /obj/item/stock_parts/cell/gun/pgf
- ammo_type = list(/obj/item/ammo_casing/energy/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
+ ammo_type = list(/obj/item/ammo_casing/energy/kalix/pgf , /obj/item/ammo_casing/energy/disabler/hitscan)
/obj/projectile/beam/hitscan/kalix/pgf
name = "concentrated energy"
@@ -64,9 +66,10 @@
muzzle_flash_color_override = LIGHT_COLOR_ELECTRIC_GREEN
impact_light_color_override = LIGHT_COLOR_ELECTRIC_GREEN
-/obj/item/ammo_casing/energy/pgf
+/obj/item/ammo_casing/energy/kalix/pgf
projectile_type = /obj/projectile/beam/hitscan/kalix/pgf
fire_sound = 'sound/weapons/gun/energy/kalixsmg.ogg'
+ e_cost = 666 //30 shots per cell
delay = 1
/obj/item/gun/energy/kalix/pistol //blue
diff --git a/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm b/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm
new file mode 100644
index 000000000000..90355db145dd
--- /dev/null
+++ b/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm
@@ -0,0 +1,229 @@
+/obj/item/gun/ballistic/automatic/pistol/mauler
+ name = "Mauler machine pistol"
+ desc = "An automatic machine pistol originating from the Shoal. Impressive volume of fire with abysmal accuracy, lackluster armor penetration, and limited magazine size render it mostly useless outside of very close quarters. Chambered in 9mm."
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/hunterspride/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/hunterspride/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
+
+ icon_state = "mauler"
+ item_state = "hp_generic"
+ w_class = WEIGHT_CLASS_NORMAL
+ mag_type = /obj/item/ammo_box/magazine/m9mm_mauler
+ fire_delay = 0.06 SECONDS
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
+ spread = 25
+ spread_unwielded = 50
+ recoil = 1
+ recoil_unwielded = 4
+ fire_sound = 'sound/weapons/gun/pistol/mauler.ogg'
+
+ rack_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg'
+
+ lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
+ bolt_drop_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg'
+
+ load_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/candor_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg'
+
+/obj/item/gun/ballistic/automatic/pistol/mauler/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/automatic_fire, 0.06 SECONDS)
+
+/obj/item/ammo_box/magazine/m9mm_mauler
+ name = "mauler machine pistol magazine (9mm)"
+ desc = "A 12-round magazine designed for the Mauler machine pistol."
+ icon_state = "mauler_mag-1"
+ base_icon_state = "mauler_mag"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 12
+
+/obj/item/ammo_box/magazine/m9mm_mauler/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+/obj/item/gun/ballistic/automatic/pistol/spitter
+ name = "\improper Spitter"
+ desc = "An open-bolt submachine gun favored by the Frontiersmen. This design's origins are unclear, but its simple, robust design has been widely copied throughout the Frontier, and it is stereotypically used by pirates and various criminal groups that value low price and ease of concealment. Chambered in 9mm."
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
+
+ icon_state = "spitter"
+ item_state = "spitter"
+ mag_type = /obj/item/ammo_box/magazine/spitter_9mm
+ bolt_type = BOLT_TYPE_OPEN
+ weapon_weight = WEAPON_LIGHT
+ show_magazine_on_sprite = TRUE
+ manufacturer = MANUFACTURER_IMPORT
+
+ spread = 20
+ spread_unwielded = 35
+ dual_wield_spread = 35
+ wield_slowdown = 0.25
+ wield_delay = 0.2 SECONDS
+ fire_delay = 0.09 SECONDS
+
+ fire_sound = 'sound/weapons/gun/smg/spitter.ogg'
+ rack_sound = 'sound/weapons/gun/smg/spitter_cocked.ogg'
+ rack_sound_vary = FALSE
+
+ load_sound_vary = FALSE
+ eject_sound_vary = FALSE
+ load_sound = 'sound/weapons/gun/smg/spitter_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/spitter_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/spitter_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/spitter_unload.ogg'
+
+ valid_attachments = list(
+ /obj/item/attachment/silencer,
+ /obj/item/attachment/foldable_stock/spitter
+ )
+
+ slot_available = list(
+ ATTACHMENT_SLOT_MUZZLE = 1,
+ ATTACHMENT_SLOT_STOCK = 1
+ )
+ slot_offsets = list(
+ ATTACHMENT_SLOT_MUZZLE = list(
+ "x" = 32,
+ "y" = 23,
+ ),
+ ATTACHMENT_SLOT_STOCK = list(
+ "x" = -5,
+ "y" = 18,
+ )
+ )
+
+ default_attachments = list(/obj/item/attachment/foldable_stock/spitter)
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
+
+
+/obj/item/ammo_box/magazine/spitter_9mm
+ name = "spitter pistol magazine (9mm)"
+ desc = "A thin 30-round magazine for the Spitter submachine gun."
+ icon_state = "spitter_mag-1"
+ base_icon_state = "spitter_mag"
+ ammo_type = /obj/item/ammo_casing/c9mm
+ caliber = "9mm"
+ max_ammo = 30
+
+/obj/item/ammo_box/magazine/spitter_9mm/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+
+/obj/item/gun/ballistic/automatic/smg/pounder
+ name = "Pounder"
+ desc = "An unusual submachine gun of Frontiersman make. A miniscule cartridge lacking both stopping power and armor penetration is compensated for with best-in-class ammunition capacity and cycle rate. Chambered in .22 LR."
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
+
+ icon_state = "pounder"
+ item_state = "pounder"
+ mag_type = /obj/item/ammo_box/magazine/c22lr_pounder_pan
+ burst_size = 1
+ fire_delay = 0.05 SECONDS
+ spread = 25
+ spread_unwielded = 50
+
+ fire_sound = 'sound/weapons/gun/smg/pounder.ogg'
+ rack_sound = 'sound/weapons/gun/smg/pounder_cocked.ogg'
+ rack_sound_vary = FALSE
+
+ load_sound_vary = FALSE
+ eject_sound_vary = FALSE
+ load_sound = 'sound/weapons/gun/smg/pounder_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/pounder_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/pounder_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/pounder_unload.ogg'
+
+ gun_firemodes = list(FIREMODE_FULLAUTO)
+ default_firemode = FIREMODE_FULLAUTO
+
+ manufacturer = MANUFACTURER_IMPORT
+ wield_slowdown = 0.5
+
+/obj/item/ammo_box/magazine/c22lr_pounder_pan
+ name = "pan magazine (.22 LR)"
+ desc = "A 50-round pan magazine for the Pounder submachine gun."
+ icon_state = "firestorm_pan"
+ base_icon_state = "firestorm_pan"
+ ammo_type = /obj/item/ammo_casing/c22lr
+ caliber = "22lr"
+ max_ammo = 50
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/ammo_box/magazine/c22lr_pounder_pan/update_icon_state()
+ . = ..()
+ icon_state = "firestorm_pan"
+
+/obj/item/gun/ballistic/automatic/hmg/shredder
+ name = "\improper Shredder"
+ desc = "A vastly atypical heavy machine gun, extensively modified by the Frontiersmen. Additional grips have been added to enable firing from the hip, and it has been modified to fire belts of shotgun shells. Chambered in 12g."
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
+
+ icon_state = "shredder"
+ item_state = "shredder"
+ mag_type = /obj/item/ammo_box/magazine/m12_shredder
+ spread = 15
+ recoil = 2
+ recoil_unwielded = 7
+ fire_delay = 0.16 SECONDS
+ mag_display_ammo = TRUE
+
+ bolt_type = BOLT_TYPE_STANDARD
+ show_magazine_on_sprite = TRUE
+ show_magazine_on_sprite_ammo = TRUE
+ tac_reloads = FALSE
+ fire_sound = 'sound/weapons/gun/hmg/shredder.ogg'
+ rack_sound = 'sound/weapons/gun/hmg/shredder_cocked_alt.ogg'
+
+ load_sound_vary = FALSE
+ eject_sound_vary = FALSE
+ load_sound = 'sound/weapons/gun/hmg/shredder_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/hmg/shredder_reload.ogg'
+ eject_sound = 'sound/weapons/gun/hmg/shredder_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/hmg/shredder_unload.ogg'
+
+ manufacturer = MANUFACTURER_IMPORT
+ has_bipod = FALSE
+
+/obj/item/ammo_box/magazine/m12_shredder
+ name = "belt box (12g)"
+ desc = "A 40-round belt box for the Shredder heavy machine gun."
+ icon_state = "shredder_mag-1"
+ base_icon_state = "shredder_mag"
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+ caliber = "12ga"
+ max_ammo = 40
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/ammo_box/magazine/m12_shredder/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]-[!!ammo_count()]"
+
+/obj/item/ammo_box/magazine/m12_shredder/slug
+ name = "belt box (12g slug)"
+ desc = "A 40-round belt box for the Shredder heavy machine gun."
+ icon_state = "shredder_mag_slug-1"
+ base_icon_state = "shredder_mag_slug"
+ ammo_type = /obj/item/ammo_casing/shotgun
+ caliber = "12ga"
+ max_ammo = 40
+ w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
index f7b963cff94b..0ea5a8557c8d 100644
--- a/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -42,13 +42,6 @@
damage = 25
armour_penetration = 20
-//.300 BLK (Polymer Survivor Rifle)
-
-/obj/projectile/bullet/aac_300blk
- name = ".300 Blackout bullet"
- damage = 30
- armour_penetration = 20
-
//7.62x40mm CLIP (SKM Rifles)
/obj/projectile/bullet/a762_40
@@ -79,3 +72,17 @@
name = ".229 Eoehoma caseless bullet"
damage = 20
armour_penetration = 10
+
+//6.5x57mm CLIP (F90)
+
+/obj/projectile/bullet/a65clip
+ name = "6.5x57mm CLIP bullet"
+ speed = 0.3
+ stamina = 10
+ damage = 40
+ armour_penetration = 50
+
+ icon_state = "redtrac"
+ light_system = MOVABLE_LIGHT
+ light_color = COLOR_SOFT_RED
+ light_range = 2
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 86f4e05226e4..9eb48f11cf4d 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -512,7 +512,7 @@
matching_container = 1
else
- if(cached_my_atom.type == C.required_container)
+ if(cached_my_atom.type in typesof(C.required_container))
matching_container = 1
if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs
return
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 10519c75c434..b59f4358c76a 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -125,6 +125,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "A widely known coffee-flavoured liqueur. Still labeled under an old name from Earth, despite the loss of history."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
+ taste_description = "a bitter combination"
glass_icon_state = "kahluaglass"
glass_name = "glass of coffee liquor"
glass_desc = "Bitter from the coffee and alcohol alike!"
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index bf13904972bf..d37048250e62 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -316,17 +316,21 @@
description = "Coffee and ice, refreshing and cool."
color = "#112a3b" // rgb: 16, 40, 56
nutriment_factor = 0
+ overdose_threshold = 80
taste_description = "bitter coldness"
glass_icon_state = "icedcoffeeglass"
glass_name = "iced coffee"
glass_desc = "Iced black coffee. It's still going to be pretty bitter on it's own, though!"
+/datum/reagent/consumable/icecoffee/overdose_process(mob/living/M)
+ M.Jitter(5)
+ ..()
+
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.AdjustSleeping(-40)
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
- M.Jitter(5)
..()
. = 1
@@ -335,18 +339,22 @@
description = "Coffee with pulsing ice shards"
color = "#132043" // rgb: 16, 40, 56
nutriment_factor = 0
+ overdose_threshold = 80
quality = DRINK_FANTASTIC
taste_description = "bitter coldness and a hint of smoke"
glass_icon_state = "hoticecoffee"
glass_name = "hot ice coffee"
glass_desc = "The wonders of fusion mixed into a cup of coffee, resulting in an extremely hot-cold drink."
+/datum/reagent/consumable/hot_ice_coffee/overdose_process(mob/living/M)
+ M.Jitter(5)
+ ..()
+
/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.AdjustSleeping(-60)
M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
- M.Jitter(5)
M.adjustToxLoss(1*REM, 0)
..()
. = TRUE
@@ -617,17 +625,21 @@
description = "A hot beverage for those who can't handle the lactose."
color = "#664300" // rgb: 102, 67, 0
quality = DRINK_NICE
+ overdose_threshold = 80
taste_description = "creamy coffee"
glass_icon_state = "soy_latte"
glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage. It goes well with a book, if you have the time to read."
+/datum/reagent/consumable/soy_latte/overdose_process(mob/living/M)
+ M.Jitter(5)
+ ..()
+
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.SetSleeping(0)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
- M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
..()
@@ -638,17 +650,21 @@
description = "A nice, strong and tasty beverage while you are reading."
color = "#664300" // rgb: 102, 67, 0
quality = DRINK_NICE
+ overdose_threshold = 80
taste_description = "bitter cream"
glass_icon_state = "cafe_latte"
glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage. It goes well with a book, if you have the time to read."
+/datum/reagent/consumable/cafe_latte/overdose_process(mob/living/M)
+ M.Jitter(5)
+ ..()
+
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.SetSleeping(0)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal())
- M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
..()
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 7c2b3f62099f..b78fd6aa8198 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -113,9 +113,9 @@
/datum/reagent/consumable/cooking_oil/expose_obj(obj/O, reac_volume)
if(holder && holder.chem_temp >= fry_temperature)
- if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder))
+ if(isitem(O) && !istype(O, /obj/item/food/deepfryholder))
O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.")
- var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O)
+ var/obj/item/food/deepfryholder/F = new(O.drop_location(), O)
F.fry(volume)
F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 11a930efda30..d42fc60057f1 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1961,7 +1961,10 @@
..()
/datum/reagent/medicine/soulus/overdose_process(mob/living/M)
- M.ForceContractDisease(new /datum/disease/transformation/legionvirus(), FALSE, TRUE)
+ var/mob/living/carbon/C = M
+ if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull))
+ var/obj/item/organ/legion_skull/spare_ribs = new()
+ spare_ribs.Insert(M)
..()
/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 24db5dd524d8..fdfeeb1cda9c 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -626,11 +626,14 @@
name = "Chlorine"
description = "A pale yellow gas that's well known as an oxidizer. While it forms many harmless molecules in its elemental form it is far from harmless."
reagent_state = GAS
+ metabolization_rate = REAGENTS_METABOLISM * 0.5
color = "#FFFB89" //pale yellow? let's make it light gray
- taste_description = "chlorine"
+ taste_description = "caustic"
/datum/reagent/chlorine/on_mob_life(mob/living/carbon/M)
- M.take_bodypart_damage(1*REM, 0, 0, 0)
+ M.take_bodypart_damage(0, 1*REM, 0, 0)
+ if(prob(25))
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS,2*REM)
. = 1
..()
@@ -649,6 +652,45 @@
mytray.adjustWater(-round(chems.get_reagent_amount(type) * 0.5))
mytray.adjustWeeds(-rand(1,3))
+/datum/reagent/chlorine/expose_obj(obj/exposed_object, reac_volume)
+ if((!exposed_object) || (!reac_volume))
+ return 0
+ var/temp = holder ? holder.chem_temp : T20C
+ exposed_object.atmos_spawn_air("cl2=[reac_volume/2];TEMP=[temp]")
+
+/datum/reagent/chlorine/expose_turf(turf/open/exposed_turf, reac_volume)
+ if(istype(exposed_turf))
+ var/temp = holder ? holder.chem_temp : T20C
+ exposed_turf.atmos_spawn_air("cl2=[reac_volume/2];TEMP=[temp]")
+ return
+
+/datum/reagent/hydrogen_chloride
+ name = "Hydrogen Chloride"
+ description = "A colorless gas that turns into hydrochloric acid in the presence of water."
+ reagent_state = GAS
+ metabolization_rate = REAGENTS_METABOLISM * 0.5
+ color = "#f4ffe0"
+ taste_description = "acid"
+
+/datum/reagent/hydrogen_chloride/on_mob_life(mob/living/carbon/exposed_mob)
+ exposed_mob.take_bodypart_damage(0, 2*REM, 0, 0)
+ exposed_mob.adjustOrganLoss(ORGAN_SLOT_LUNGS,1*REM)
+ exposed_mob.adjustOrganLoss(ORGAN_SLOT_STOMACH,1*REM)
+ . = 1
+ ..()
+
+/datum/reagent/hydrogen_chloride/expose_obj(obj/exposed_object, reac_volume)
+ if((!exposed_object) || (!reac_volume))
+ return 0
+ var/temp = holder ? holder.chem_temp : T20C
+ exposed_object.atmos_spawn_air("hcl=[reac_volume/2];TEMP=[temp]")
+
+/datum/reagent/hydrogen_chloride/expose_turf(turf/open/exposed_turf, reac_volume)
+ if(istype(exposed_turf))
+ var/temp = holder ? holder.chem_temp : T20C
+ exposed_turf.atmos_spawn_air("hcl=[reac_volume/2];TEMP=[temp]")
+ return
+
/datum/reagent/fluorine
name = "Fluorine"
description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest."
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index d3bf1e211290..7429db4c1dec 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -139,7 +139,7 @@
var/chosen = getbork()
var/obj/B = new chosen(T)
if(prob(5))//Fry it!
- var/obj/item/reagent_containers/food/snacks/deepfryholder/fried
+ var/obj/item/food/deepfryholder/fried
fried = new(T, B)
fried.fry() // actually set the name and colour it
B = fried
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 62661594c06e..999b576ea08c 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -87,7 +87,7 @@
else if(reagents.total_volume && is_drainable())
switch(user.a_intent)
- if(INTENT_HELP)
+ if(INTENT_DISARM)
attempt_pour(target, user)
if(INTENT_HARM)
user.visible_message("[user] splashes the contents of [src] onto [target]!", \
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 5e45c756c881..79b28ccef331 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -149,8 +149,8 @@ other types of metals and chemistry for reagents).
blueprints[1] = new /datum/design/disposable_gun()
/obj/item/disk/design_disk/clip_mechs
- name = "design disk - CLIP mecha modifications"
- desc = "A design disk containing specifications for CLIP-custom mecha conversions."
+ name = "design disk - CLIP exosuit modifications"
+ desc = "A design disk containing specifications for CLIP-custom exosuit conversions."
color = "#57b8f0"
max_blueprints = 2
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 517c8691c92d..a2b295f2e6fa 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -286,7 +286,7 @@
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 750)
build_path = /obj/item/tank/internals/emergency_oxygen/engi/empty
- category = list("hacked","Misc","Equipment")
+ category = list("initial", "Misc","Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
/datum/design/plasmaman_tank_belt
@@ -295,7 +295,7 @@
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 800)
build_path = /obj/item/tank/internals/plasmaman/belt/empty
- category = list("hacked","Misc","Equipment")
+ category = list("initial", "Misc","Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
/datum/design/generic_gas_tank
@@ -516,14 +516,6 @@
category = list("initial","Misc", "Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-/datum/design/foilhat
- name = "Tinfoil Hat"
- id = "tinfoil_hat"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 5500)
- build_path = /obj/item/clothing/head/foilhat
- category = list("hacked", "Misc")
-
/datum/design/scalpel
name = "Scalpel"
id = "scalpel"
@@ -772,31 +764,13 @@
build_path = /obj/item/ammo_box/foambox
category = list("initial", "Misc")
-//hacked autolathe recipes
-//WS - emagged recipies
-/datum/design/flamethrower
- name = "Flamethrower"
- id = "flamethrower"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 500)
- build_path = /obj/item/flamethrower/full
- category = list("hacked", "Security")
-
-/datum/design/electropack
- name = "Electropack"
- id = "electropack"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 10000, /datum/material/glass = 2500)
- build_path = /obj/item/electropack
- category = list("hacked", "Tools")
-
/datum/design/handcuffs
name = "Handcuffs"
id = "handcuffs"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 500)
build_path = /obj/item/restraints/handcuffs
- category = list("hacked", "Security")
+ category = list("initial", "Security")
/datum/design/receiver
name = "Modular Receiver"
@@ -804,7 +778,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 15000)
build_path = /obj/item/weaponcrafting/receiver
- category = list("hacked", "Security")
+ category = list("initial", "Security")
/datum/design/c38_surplus
name = "Ammo Box (.38 surplus)"
@@ -828,7 +802,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 1000) //Discount for making individually - no box = less metal!
build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
- category = list("hacked", "Security")
+ category = list("initial", "Security")
/datum/design/riot_darts
name = "Foam Riot Dart Box"
@@ -836,15 +810,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 50000) //Comes with 40 darts
build_path = /obj/item/ammo_box/foambox/riot
- category = list("hacked", "Security")
-
-/datum/design/a357
- name = ".357 Casing"
- id = "a357"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 4000)
- build_path = /obj/item/ammo_casing/a357
- category = list("emagged", "Security")
+ category = list("initial", "Security")
/datum/design/c10mm_surplus
name = "Ammo Box (10mm surplus)"
@@ -900,7 +866,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 18000)
build_path = /obj/item/kitchen/knife/butcher
- category = list("hacked", "Dinnerware")
+ category = list("initial", "Dinnerware")
/datum/design/spraycan
name = "Spraycan"
@@ -985,14 +951,6 @@
build_path = /obj/item/modular_computer/tablet
category = list("initial","Misc")
-/datum/design/slime_scanner
- name = "Slime Scanner"
- id = "slime_scanner"
- build_type = AUTOLATHE
- materials = list(/datum/material/iron = 300, /datum/material/glass = 200)
- build_path = /obj/item/slime_scanner
- category = list("initial", "Misc")
-
/datum/design/pet_carrier
name = "Pet Carrier"
id = "pet_carrier"
@@ -1084,7 +1042,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 100, /datum/material/glass = 50)
build_path = /obj/item/toy/gun
- category = list("hacked", "Misc")
+ category = list("initial", "Misc")
/datum/design/capbox
name = "Box of Cap Gun Shots"
@@ -1092,7 +1050,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 20, /datum/material/glass = 5)
build_path = /obj/item/toy/ammo/gun
- category = list("hacked", "Misc")
+ category = list("initial", "Misc")
/datum/design/toy_balloon
name = "Plastic Balloon"
@@ -1100,7 +1058,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/plastic = 1200)
build_path = /obj/item/toy/balloon
- category = list("hacked", "Misc")
+ category = list("initial", "Misc")
/datum/design/toy_meteor
name = "Plastic Toy Meteor"
@@ -1108,15 +1066,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/plastic = 1000)
build_path = /obj/item/toy/minimeteor
- category = list("hacked", "Misc")
-
-/datum/design/toy_armblade
- name = "Plastic Armblade"
- id = "toy_armblade"
- build_type = AUTOLATHE
- materials = list(/datum/material/plastic = 2000)
- build_path = /obj/item/toy/foamblade
- category = list("hacked", "Misc")
+ category = list("initial", "Misc")
/datum/design/plastic_tree
name = "Plastic Potted Plant"
@@ -1181,7 +1131,7 @@
build_type = AUTOLATHE
materials = list(/datum/material/iron = 20000)
build_path = /obj/item/ammo_box/magazine/zip_ammo_9mm
- category = list("hacked", "Security")
+ category = list("initial", "Security")
/datum/design/pipedispenser
name = "Pipe Dispenser (Machine Board)"
@@ -1191,6 +1141,46 @@
build_path = /obj/item/circuitboard/machine/pipedispenser
category = list("initial", "Machinery")
+/datum/design/illestren_a850rclip
+ name = "8x50 Stripper Clip"
+ id = "IllestrenStripClip"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 10000)
+ build_path = /obj/item/ammo_box/magazine/illestren_a850r/empty
+ category = list("initial", "Security", "Ammo")
+
+/datum/design/a300clip
+ name = ".300 Scout Stripper Clip"
+ id = "ScoutStripClip"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 10000)
+ build_path = /obj/item/ammo_box/a300/empty
+ category = list("initial", "Security", "Ammo")
+
+/datum/design/a762_40clip
+ name = "7.62 Stripper Clip"
+ id = "PolymerStripClip"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 10000)
+ build_path = /obj/item/ammo_box/a762_stripper/empty
+ category = list("initial", "Security", "Ammo")
+
+/datum/design/vickland_a308clip
+ name = ".308 Stripper Clip"
+ id = "VicklandStripClip"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 10000)
+ build_path = /obj/item/ammo_box/vickland_a308/empty
+ category = list("initial", "Security", "Ammo")
+
+/datum/design/a858clip
+ name = "8x58 Stripper Clip"
+ id = "SSGStripClip"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 10000)
+ build_path = /obj/item/ammo_box/a858/empty
+ category = list("initial", "Security", "Ammo")
+
/datum/design/control
name = "Blast Door Controller"
id = "blast"
@@ -1247,3 +1237,12 @@
materials = list(/datum/material/plastic = 30)
build_path = /obj/item/folder/biscuit/unsealed/confidental
category = list("initial", "Tools", "Misc")
+
+/datum/design/marker_beacon
+ name = "Marker Beacon"
+ id = "marker_beacon"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 50, /datum/material/glass = 20)
+ build_path = /obj/item/stack/marker_beacon
+ category = list("initial","Misc")
+
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 9b167598d026..2ba8ef1e2d7a 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -183,8 +183,8 @@
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO
/datum/design/board/mechapower
- name = "Computer Design (Mech Bay Power Control Console)"
- desc = "Allows for the construction of circuit boards used to build a mech bay power control console."
+ name = "Computer Design (Exosuit) Bay Power Control Console)"
+ desc = "Allows for the construction of circuit boards used to build an exosuit bay power control console."
id = "mechapower"
build_path = /obj/item/circuitboard/computer/mech_bay_power_console
category = list("Computer Boards")
diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm
index 2cddc5043c3f..aa221c2b21a7 100644
--- a/code/modules/research/designs/mining_designs.dm
+++ b/code/modules/research/designs/mining_designs.dm
@@ -8,7 +8,7 @@
id = "cargoexpress"//the coder reading this
build_type = IMPRINTER
materials = list(/datum/material/glass = 1000)
- build_path = /obj/item/circuitboard/computer/cargo/express
+ build_path = /obj/item/circuitboard/computer/cargo
category = list("Mining Designs")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index dbca44b757b9..6d2236a974b9 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -53,7 +53,7 @@
id = "mech_tools"
starting_node = TRUE
display_name = "Basic Exosuit Equipment"
- description = "Various tools fit for basic mech units"
+ description = "Various tools fit for basic exosuit units"
design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") //WS Edit - Reverted Smartwire
/datum/techweb_node/basic_tools
@@ -814,7 +814,7 @@
/datum/techweb_node/adv_mecha_tools
id = "adv_mecha_tools"
display_name = "Advanced Exosuit Equipment"
- description = "Tools for high level mech suits"
+ description = "Tools for high level exosuits"
prereq_ids = list("adv_mecha")
design_ids = list("mech_rcd", "mech_thrusters")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -823,7 +823,7 @@
/datum/techweb_node/med_mech_tools
id = "med_mech_tools"
display_name = "Medical Exosuit Equipment"
- description = "Tools for high level mech suits"
+ description = "Tools for high level exosuits"
prereq_ids = list("adv_biotech")
design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -832,7 +832,7 @@
/datum/techweb_node/mech_modules
id = "adv_mecha_modules"
display_name = "Simple Exosuit Modules"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("adv_mecha", "bluespace_power")
design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -841,7 +841,7 @@
/datum/techweb_node/mech_scattershot
id = "mecha_tools"
display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_scattershot", "mech_scattershot_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -850,7 +850,7 @@
/datum/techweb_node/mech_carbine
id = "mech_carbine"
display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_carbine", "mech_carbine_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -859,7 +859,7 @@
/datum/techweb_node/mech_ion
id = "mmech_ion"
display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("electronic_weapons", "emp_adv")
design_ids = list("mech_ion")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -868,7 +868,7 @@
/datum/techweb_node/mech_tesla
id = "mech_tesla"
display_name = "Exosuit Weapon (MKI Tesla Cannon)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("electronic_weapons", "adv_power")
design_ids = list("mech_tesla")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -877,7 +877,7 @@
/datum/techweb_node/mech_laser
id = "mech_laser"
display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)"
- description = "A basic piece of mech weaponry"
+ description = "A basic piece of exosuit weaponry"
prereq_ids = list("beam_weapons")
design_ids = list("mech_laser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -886,7 +886,7 @@
/datum/techweb_node/mech_laser_heavy
id = "mech_laser_heavy"
display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("adv_beam_weapons")
design_ids = list("mech_laser_heavy")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -895,7 +895,7 @@
/datum/techweb_node/mech_disabler
id = "mech_disabler"
display_name = "Exosuit Weapon (CH-DS \"Peacemaker\" Mounted Disabler)"
- description = "A basic piece of mech weaponry"
+ description = "A basic piece of exosuit weaponry"
prereq_ids = list("beam_weapons")
design_ids = list("mech_disabler")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -904,7 +904,7 @@
/datum/techweb_node/mech_grenade_launcher
id = "mech_grenade_launcher"
display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("explosive_weapons")
design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -913,7 +913,7 @@
/datum/techweb_node/mech_missile_rack
id = "mech_missile_rack"
display_name = "Exosuit Weapon (BRM-6 Missile Rack)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("explosive_weapons")
design_ids = list("mech_missile_rack", "mech_missile_rack_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -922,7 +922,7 @@
/datum/techweb_node/clusterbang_launcher
id = "clusterbang_launcher"
display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("explosive_weapons")
design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -931,7 +931,7 @@
/datum/techweb_node/mech_teleporter
id = "mech_teleporter"
display_name = "Exosuit Module (Teleporter Module)"
- description = "An advanced piece of mech Equipment"
+ description = "An advanced piece of exosuit equipment"
prereq_ids = list("micro_bluespace")
design_ids = list("mech_teleporter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -940,7 +940,7 @@
/datum/techweb_node/mech_wormhole_gen
id = "mech_wormhole_gen"
display_name = "Exosuit Module (Localized Wormhole Generator)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("bluespace_travel")
design_ids = list("mech_wormhole_gen")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -949,7 +949,7 @@
/datum/techweb_node/mech_lmg
id = "mech_lmg"
display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)"
- description = "An advanced piece of mech weaponry"
+ description = "An advanced piece of exosuit weaponry"
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_lmg", "mech_lmg_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -966,7 +966,7 @@
/////////////////////////Nanites/////////////////////////
-//Disabled pending nanite rework --Apogee-dev
+//Disabled FOREVER
/*
/datum/techweb_node/nanite_base
id = "nanite_base"
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index 25aa79302918..f01b148d4d5e 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -107,7 +107,7 @@ Charged extracts:
effect_desc = "Creates a slime cake and some drinks."
/obj/item/slimecross/charged/silver/do_effect(mob/user)
- new /obj/item/reagent_containers/food/snacks/store/cake/slimecake(get_turf(user))
+ new /obj/item/food/cake/slimecake(get_turf(user))
for(var/i in 1 to 10)
var/drink_type = get_random_drink()
new drink_type(get_turf(user))
diff --git a/code/modules/ruins/rockplanet_ruin_code.dm b/code/modules/ruins/rockplanet_ruin_code.dm
index 57a6d6fd4657..d09bbe9d5dd7 100644
--- a/code/modules/ruins/rockplanet_ruin_code.dm
+++ b/code/modules/ruins/rockplanet_ruin_code.dm
@@ -112,3 +112,8 @@
if(give_to_user)
user.put_in_hands(result)
to_chat(user, "You finish breaking [src]")
+
+/obj/item/paper/crumpled/muddy/fluff/distillery
+ name = "distillery instructions"
+ desc = "A crumpled note soaked in alcohol."
+ default_raw_text = "
Moonshine Instructions
Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.
1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom. 2. Grind a cob of corn into bits, and add the mash to the still. 3. Pour an equal amount of sugar into the still, and stir. 4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now. 5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.
PS: If you've got some leftover sugar, mix it into bicaridine. Equal parts sugar, carbon, and oxygen makes a potent salve for your wounds."
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index 55138a36c367..d1f0c920dac8 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -22,7 +22,6 @@ GLOBAL_LIST_INIT(summoned_guns, list(
/obj/item/gun/ballistic/revolver/mateba,
/obj/item/gun/ballistic/rifle/illestren,
/obj/item/pneumatic_cannon/speargun,
- /obj/item/gun/ballistic/automatic/smg/mini_uzi,
/obj/item/gun/energy/lasercannon,
/obj/item/gun/energy/kinetic_accelerator/crossbow/large,
/obj/item/gun/energy/e_gun/nuclear,
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 26b93d2c4642..6ba9ce69d700 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -55,7 +55,7 @@
update_appearance()
return 1
-/obj/item/organ/heart/OnEatFrom(eater, feeder)
+/obj/item/organ/heart/on_eat_from(eater, feeder)
. = ..()
beating = FALSE
update_appearance()
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 05ca5131e0f9..f6af39b201c0 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -284,6 +284,38 @@
breath.adjust_moles(GAS_FREON, -gas_breathed)
+ // Chlorine
+ var/chlorine_pp = PP(breath,GAS_CHLORINE)
+ if (prob(chlorine_pp))
+ to_chat(H, "Your lungs feel awful!")
+ if (chlorine_pp >40)
+ H.emote("gasp")
+ H.adjustFireLoss(5)
+ if (prob(chlorine_pp/2))
+ to_chat(H, "Your throat closes up!")
+ H.silent = max(H.silent, 3)
+ else
+ H.adjustFireLoss(round(chlorine_pp/8))
+ gas_breathed = breath.get_moles(GAS_CHLORINE)
+ if (gas_breathed > gas_stimulation_min)
+ H.reagents.add_reagent(/datum/reagent/chlorine,1)
+
+ breath.adjust_moles(GAS_CHLORINE, -gas_breathed)
+ // Hydrogen Chloride
+ var/hydrogen_chloride_pp = PP(breath,GAS_HYDROGEN_CHLORIDE)
+ if (prob(hydrogen_chloride_pp))
+ to_chat(H, "Your lungs feel terrible!")
+ if (hydrogen_chloride_pp >20)
+ H.emote("gasp")
+ H.adjustFireLoss(10)
+ if (prob(hydrogen_chloride_pp/2))
+ to_chat(H, "Your throat closes up!")
+ H.silent = max(H.silent, 3)
+ else
+ H.adjustFireLoss(round(hydrogen_chloride_pp/4))
+ if (gas_breathed > gas_stimulation_min)
+ H.reagents.add_reagent(/datum/reagent/hydrogen_chloride)
+
// Stimulum
gas_breathed = PP(breath,GAS_STIMULUM)
if (gas_breathed > gas_stimulation_min)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index b8871b21524e..72b7fba9d2da 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -38,7 +38,14 @@
/obj/item/organ/Initialize()
. = ..()
if(organ_flags & ORGAN_EDIBLE)
- AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, COLOR_PINK, CALLBACK(src, PROC_REF(OnEatFrom)))
+ AddComponent(/datum/component/edible,\
+ initial_reagents = food_reagents,\
+ foodtypes = RAW | MEAT | GORE,\
+ volume = 10,\
+ filling_color = COLOR_PINK,\
+ pre_eat = CALLBACK(src, PROC_REF(pre_eat)),\
+ on_compost = CALLBACK(src, PROC_REF(pre_compost)),\
+ after_eat = CALLBACK(src, PROC_REF(on_eat_from)))
///When you take a bite you cant jam it in for surgery anymore.
/obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
@@ -133,8 +140,21 @@
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/item/organ/proc/OnEatFrom(eater, feeder)
- useable = FALSE //You can't use it anymore after eating it you spaztic
+// Put any "can we eat this" checks for edible organs here
+/obj/item/organ/proc/pre_eat(eater, feeder)
+ if(iscarbon(eater))
+ var/mob/living/carbon/target = eater
+ for(var/S in target.surgeries)
+ var/datum/surgery/surgery = S
+ if(surgery.location == zone)
+ return FALSE
+ return TRUE
+
+/obj/item/organ/proc/pre_compost(user)
+ return TRUE
+
+/obj/item/organ/proc/on_eat_from(eater, feeder)
+ useable = FALSE //You bit it, no more using it
/obj/item/organ/item_action_slot_check(slot,mob/user)
return //so we don't grant the organ's action to mobs who pick up the organ.
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index 017356d9152a..9aee2ca10624 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -72,7 +72,7 @@
ignore += typesof(/obj/effect/pod_landingzone_effect)
ignore += typesof(/obj/effect/pod_landingzone)
//These want fried food to take on the shape of, we can't pass that in
- ignore += typesof(/obj/item/reagent_containers/food/snacks/deepfryholder)
+ ignore += typesof(/obj/item/food/deepfryholder)
//Can't pass in a thing to glow
ignore += typesof(/obj/effect/abstract/eye_lighting)
//It wants a lot more context then we have
diff --git a/code/modules/unit_tests/serving_tray.dm b/code/modules/unit_tests/serving_tray.dm
index 9bd487ba68a8..b4dc1f77a520 100644
--- a/code/modules/unit_tests/serving_tray.dm
+++ b/code/modules/unit_tests/serving_tray.dm
@@ -6,7 +6,7 @@
var/obj/structure/table/the_table = allocate(/obj/structure/table)
var/obj/item/storage/bag/tray/test_tray = allocate(/obj/item/storage/bag/tray)
var/obj/item/reagent_containers/food/banana = allocate(/obj/item/reagent_containers/food/snacks/grown/banana)
- var/obj/item/reagent_containers/food/the_bread = allocate(/obj/item/reagent_containers/food/snacks/breadslice)
+ var/obj/item/reagent_containers/food/the_bread = allocate(/obj/item/food/breadslice)
var/obj/item/reagent_containers/food/sugarcookie = allocate(/obj/item/reagent_containers/food/snacks/sugarcookie)
var/obj/item/clothing/under/jumpsuit = allocate(/obj/item/clothing/under/color/black)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 9e935611e15f..84485cbe903d 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -937,7 +937,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/mech/bag
- name = "Mech Support Kit Bag"
+ name = "Exosuit Support Kit Bag"
desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer."
item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech
cost = 4
@@ -1832,9 +1832,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/role_restricted/concealed_weapon_bay
name = "Concealed Weapon Bay"
- desc = "A modification for non-combat mechas that allows them to equip one piece of equipment designed for combat mechs. \
+ desc = "A modification for civilian exosuits that allows them to equip one piece of equipment designed for combat exosuits. \
It also hides the equipped weapon from plain sight. \
- Only one can fit on a mecha."
+ Only one can fit on an exosuit."
item = /obj/item/mecha_parts/concealed_weapon_bay
cost = 3
restricted_roles = list("Roboticist", "Research Director")
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 911eaed20652..670904a5735d 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -98,7 +98,7 @@
/obj/item/storage/box/lethalshot = 6,
/obj/item/stock_parts/cell/gun = 5,
- /obj/item/ammo_box/magazine/uzim9mm = 5,
+ /obj/item/ammo_box/magazine/spitter_9mm = 5,
/obj/item/grenade/c4 = 5,
/obj/item/grenade/frag = 5,
@@ -107,8 +107,7 @@
premium = list()
voucher_items = list(
"Tactical Energy Gun" = /obj/item/gun/energy/e_gun/hades,
- "Combat Shotgun" = /obj/item/gun/ballistic/shotgun/automatic/combat,
- "Type U3 Uzi" = /obj/item/gun/ballistic/automatic/smg/mini_uzi)
+ "Combat Shotgun" = /obj/item/gun/ballistic/shotgun/automatic/combat)
/obj/machinery/vending/security/marine/syndicate
icon_state = "syndicate-marine"
diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm
index 0519285d26a5..0677a77edb58 100644
--- a/code/modules/vending/sustenance.dm
+++ b/code/modules/vending/sustenance.dm
@@ -7,7 +7,7 @@
icon_state = "sustenance"
products = list(
/obj/item/reagent_containers/food/snacks/tofu/prison = 24,
- /obj/item/reagent_containers/food/snacks/breadslice/moldy = 15,
+ /obj/item/food/breadslice/moldy = 15,
/obj/item/reagent_containers/food/drinks/ice/prison = 12,
/obj/item/reagent_containers/food/snacks/candy_corn/prison = 6)
contraband = list(
diff --git a/config/admins.txt b/config/admins.txt
index b695c94f084b..24f777f26b19 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -5,5 +5,6 @@
#If SQL-based admin loading is enabled, admins listed here will always be loaded first and will override any duplicate entries in the database.
MarkSuckerberg = Development Head
+rkz = Development Head
#just use the database, this is deprecated
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
index fd9a9542550c..9f9679a752b3 100644
--- a/html/changelogs/archive/2024-07.yml
+++ b/html/changelogs/archive/2024-07.yml
@@ -108,3 +108,60 @@
much like the previous behavior
SomeguyManperson:
- bugfix: gun cargo packs now act more as they would be expected to
+2024-07-17:
+ FalloutFalcon:
+ - rscadd: Orbit menu is less cluttered and just shows the real name, hovering over
+ it shows their standard name.
+ - refactor: refactored express console to not be a subtype of the cargo console
+ and replacing it.
+ Martinpachu:
+ - balance: Doubled the price on every automatic gun and added 250 credits to the
+ price of every semi-auto pistol.
+ Sadhorizon:
+ - tweak: Choice beacons were reflavored into choice boxes.
+ - rscdel: Removed a bunch of meme, weird and unused items from the loadout.
+ - tweak: Reflavored the Cybersun labcoat into a generic "translucent labcoat"
+ SomeguyManperson:
+ - bugfix: ships docked to eachother now share gravity
+2024-07-18:
+ Fest1v3:
+ - rscadd: adds a few vox sprites
+ - bugfix: fixes a few vox sprites
+2024-07-24:
+ DIB-DOG:
+ - bugfix: fixed the foodtype of two Gezenan drinks to match their descriptions
+ - rscadd: added a taste description to Keh'Lu'Tex Liqueur
+ Gristlebee:
+ - rscadd: Acquire Mission containers and Mission drills display their objective
+ type.
+ - rscadd: Changed name of base fish type to generic fish
+ SomeguyManperson:
+ - bugfix: the BG-16 is now as ammo efficient as the BG-12
+ - bugfix: the BG-16 has automatic fire again
+ generalthrax:
+ - balance: Undoubles the price on every automatic gun and removed 250 from the price
+ of every semi-auto pistol.
+2024-07-26:
+ Cloudbreak:
+ - rscadd: A new ruin, the Abandoned Listening Post.
+ - rscadd: Areas associated with the listening post.
+ - bugfix: Single line in maps catalogue.
+2024-07-27:
+ Gristlebee:
+ - rscadd: Marker beacons can now be printed at the autolathe from the Misc tab
+2024-07-31:
+ rkz, benbot(benjamin), Time-Green, SteelSlayer, floyd, Qustinuus, ArcaneDefence, FlowerCuco:
+ - rscadd: Food storage! Hide some glass in the captains cake! Begone digestive tract!
+ - rscadd: Bread, Cake and Spaghetti to Newfood
+ - rscadd: some smaller foods can now be eaten whilst on the run! (This ONLY applies
+ to newfood items thus far!)
+ - rscadd: converted edible component to work with newfood
+ - rscdel: oldfood for Bread, Cake and Spaghetti
+ - rscdel: Temporarily removes customfood bread, cake, pasta, and sandwiches
+ - tweak: edited a few messed up values
+ - tweak: food trash is sensible now. Finishing stuff like cake will actually spawn
+ a plate rubbish. Instead of you eating the plate, biggun, perhaps properly dispose
+ of it!
+ - bugfix: Wildly STUPID item weights. Candycorn and cakes are no longer the SAME
+ size
+ - code_imp: provides some semblance of sorting for signal defines
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
new file mode 100644
index 000000000000..633fab9ba9c7
--- /dev/null
+++ b/html/changelogs/archive/2024-08.yml
@@ -0,0 +1,174 @@
+2024-08-02:
+ FalloutFalcon:
+ - rscadd: New admin button to launch a distress announcement quicker.
+ Sadhorizon:
+ - tweak: Cafe latte, iced coffee, hot ice coffee and soy latte now only make your
+ character jitter on OD.
+ - tweak: Reduced the prices of first aid kits.
+ - tweak: Remapped the Kilo-class Mining Ship
+ SomeguyManperson:
+ - rscadd: legion attacks will now inject an organ which eventually causes a transformation,
+ rather than instantly killing and transforming people.
+2024-08-03:
+ Anticept:
+ - bugfix: Executing someone with a gun is back, you psychos. Paint the floor red!
+ Martinpachu:
+ - balance: 8x50 boxes now come with 25 ammo as opposed to 20.
+ Sadhorizon:
+ - tweak: Internals Crate now costs 100 credits and contains full oxygen tanks.
+ - tweak: Plasmaman Tank Kit renamed to Plasmaman Internals Crate. It now costs 100
+ credits and contains full plasma tanks.
+ SomeguyManperson:
+ - bugfix: mini/energy gun cases no longer spawn with the wrong weapon in them
+ - balance: gun attachments are now small instead of normal sized
+ Yata9ar4su:
+ - bugfix: Cash bundle value will now be correct in chat, cash will not drop upon
+ stacking
+ firebudgy:
+ - rscadd: New sprites for Vox! Vanguard and Honorable Vanguard Battlecoat sprite
+ changes, NGR hard hats, and hazard vests!
+ generalthrax:
+ - rscadd: Industrial jacket now keeps you warm
+ - bugfix: Contender is now called the Beacon in cargo
+ zimon9:
+ - rscadd: an anesthetics crate
+2024-08-04:
+ Apogee-dev:
+ - bugfix: Changed almost every player facing instance of the word "mech" to "exosuit"
+ - balance: Replaced syndie survival boxes in outfit datums with normal job-equivalent
+ boxes
+ FalloutFalcon:
+ - balance: nerfed legion money drops.
+ Gristlebee:
+ - rscadd: Sandbags can be deconed by click dragging them onto your mob.
+ - rscadd: Sandbags to the outpost for 150 credits.
+ Martinpachu:
+ - rscadd: Clips of all kinds (not magazines!) can now be produced on the autolathe.
+ - rscdel: Clip cargo packs, as they are now redundant.
+ PositiveEntropy:
+ - imageadd: Resprites muzzle flashes!
+ Sadhorizon:
+ - imageadd: Added directionals for mining processing consoles.
+ Thera-Pissed:
+ - bugfix: hydrogen and combustion bugs
+ Zevotech:
+ - balance: the Quirk Social Anxiety no longer silences you randomly
+ - bugfix: Stuttering is now far less extreme and will not delete characters
+ - bugfix: Psicodine now actually suppresses the effects of social anxiety
+ firebudgy:
+ - bugfix: Fixed three typos in the code.
+ phoaly:
+ - balance: Buffed LP hardsuits
+2024-08-07:
+ Sadhorizon:
+ - tweak: Remapped the Dwayne-class Long Range Mining Transport.
+ - rscadd: Added a random plushie spawner and a random moth plushie spawner.
+ Thera-Pissed:
+ - rscadd: Chlorine and Hydrogen Chloride gases! Wear your goggles!
+2024-08-10:
+ generalthrax:
+ - rscadd: Cleanbots now destroy cigarette butts, and dispense enough acid to do
+ so.
+ rye-rice:
+ - bugfix: indie sec hardsuit now shows up
+2024-08-11:
+ firebudgy:
+ - rscadd: Sprites for several different kinds of scarves for Vox!
+ - rscadd: Additional sprites for several other items for Vox, such as chest-high
+ towels and hazard jackets.
+ - rscadd: Created onmob_neck_vox.dmi file, plus enabled support for it.
+ generalthrax:
+ - bugfix: Fixes the Industrial Jacket to be warm (For Real)
+ phoaly:
+ - balance: Talos Corpsman has been readded with a different medkit loadout.
+2024-08-16:
+ OrionTheFox:
+ - rscadd: Suit Storage Units now provide feedback when Decontamination fails to
+ activate
+ - imageadd: Suit Storage Units now have a visible red light when Locked - when hacked,
+ Decontamination now has a red-yellow flashing light to distinguish from the
+ Locked light.
+2024-08-18:
+ Cloudbreak:
+ - rscadd: Frontiersman sprites for the Vox!
+ Gristlebee:
+ - bugfix: water turfs reagent scooping
+ - code_imp: span classes to span macros
+ - refactor: acid turfs repathed under water
+ - refactor: Pouring out a reagent container is now bound to disarm intent instead
+ of help intent.
+ - rscadd: Examine hints for flipped tables
+ - bugfix: You can no longer phase through a flipped table.
+ meemofcourse:
+ - bugfix: Hardliner troopers should no longer spawn as Hardliner pilots
+2024-08-20:
+ Aquidu:
+ - bugfix: Fixed a bug relating to literal spaghetti code.
+ zimon9:
+ - bugfix: fixed a short on the Shetland
+2024-08-21:
+ FalloutFalcon:
+ - rscadd: Added var to let admins bypass do_teleport vlevel restriction
+ Sadhorizon:
+ - bugfix: Ranged frontersman with internals now drops the correct revolver type.
+2024-08-22:
+ rye-rice, Imaginos16:
+ - rscadd: Adds new belt sprites
+2024-08-23:
+ retlaw34, rye-rice, Apogee-dev:
+ - rscadd: Adds CLIPs weapons
+ - rscadd: Adds the New Frontiersmen weapons
+ - rscadd: 556 ammo box to cargo
+ - rscadd: inteq sprites should look better
+2024-08-24:
+ generalthrax:
+ - rscdel: Removed a bunch of random items from fitting in wallets (notably screwdrivers,
+ cigarettes, suture / mesh / gauze)
+ - rscadd: Ship keys and derringers can now fit in wallets
+2024-08-26:
+ Aquidu:
+ - rscadd: Rations now have icons that help show the contents.
+ - rscadd: Condiments and drink mixes now have colors when full to help show the
+ contents.
+ - rscadd: Unique sprites for the ration heater, drink packs ration drinks, and "side"
+ category rations.
+ - code_imp: Changes the sound effect for opening the drink ration to the bottle
+ cap sound to line up with the icon.
+ DIB-DOG:
+ - rscadd: Added a standard vest to the armory office locker
+ - rscadd: Added a Security camera console to the bridge
+ - balance: Silkenweave jackets and Betzu hats now provide cold protection but no
+ armor
+ - balance: Crying Sun now has 4 combustion/2 ion engines instead of 2/4
+ - bugfix: Fixes turrets on the Crying Sun and its subshuttle, the Nail.
+ FalloutFalcon, MrSamu99, Fikou:
+ - rscadd: a few shipments of MOD control units have found there way to the frontier,
+ premium versions of existing hard suits with the latest tech!
+ - rscadd: Ported modsuits from tg, no mapped stuff yet
+ Gristlebee:
+ - balance: Durand shield consumes less charge on being hit, passive drain increased.
+ - bugfix: Mechs consume the correct amount of power on movement.
+ - refactor: normal_step_energy_drain is now base_step_energy_drain
+ - rscadd: Grills can now cook food.
+ - rscdel: Xeno-energy working as grill fuel.
+ - balance: Outpost food costs
+ - bugfix: Grills
+ Ms-Mee:
+ - bugfix: fixed handle_quirk_conflict behavior
+ Sadhorizon:
+ - bugfix: Gloves now show up in the loadout preview.
+ - rscadd: Brown gloves were added to the loadout.
+ - tweak: Moved everything out of autolathe contraband - you no longer have to hack
+ it, ever.
+ - rscdel: Removed foilhat, flamethrower, electropack, .357 casing and slime scanner
+ from the autolathe.
+ - rscadd: Added a bunch of new items to the loadout.
+ - tweak: Changed the description of red suspenders.
+ - rscadd: Ihejirka space outpost now has player-accessible cryogenics.
+ SomeguyManperson:
+ - balance: wormholes on the overmap no longer decay when used
+ Thera-Pissed:
+ - code_imp: TEG efficiency now depends on temperature delta.
+ Vekter:
+ - bugfix: Removed an extra fire extinguisher from the crew quarters on the IRMV
+ Talos.
diff --git a/icons/effects/magic.dmi b/icons/effects/magic.dmi
new file mode 100644
index 000000000000..480332df1349
Binary files /dev/null and b/icons/effects/magic.dmi differ
diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi
new file mode 100644
index 000000000000..9786d403e0de
Binary files /dev/null and b/icons/hud/radial.dmi differ
diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi
new file mode 100644
index 000000000000..7f030ad53d42
Binary files /dev/null and b/icons/mob/actions/actions_mod.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 7568a1274d66..94728158d0c5 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi
new file mode 100644
index 000000000000..27d4df3b9023
Binary files /dev/null and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ
diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi
new file mode 100644
index 000000000000..11259428cf4d
Binary files /dev/null and b/icons/mob/clothing/modsuit/mod_modules.dmi differ
diff --git a/icons/mob/simple_frontiersman.dmi b/icons/mob/simple_frontiersman.dmi
new file mode 100644
index 000000000000..c5b9962fd236
Binary files /dev/null and b/icons/mob/simple_frontiersman.dmi differ
diff --git a/icons/mob/species/kepori/onmob_head_kepori.dmi b/icons/mob/species/kepori/onmob_head_kepori.dmi
index b4631838b75a..8d1c43955f8a 100644
Binary files a/icons/mob/species/kepori/onmob_head_kepori.dmi and b/icons/mob/species/kepori/onmob_head_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_suit_kepori.dmi b/icons/mob/species/kepori/onmob_suit_kepori.dmi
index 649853ea7280..ae5750dd0558 100644
Binary files a/icons/mob/species/kepori/onmob_suit_kepori.dmi and b/icons/mob/species/kepori/onmob_suit_kepori.dmi differ
diff --git a/icons/mob/species/kepori/onmob_uniform_kepori.dmi b/icons/mob/species/kepori/onmob_uniform_kepori.dmi
index d6f011cef312..f6d35ec4c795 100644
Binary files a/icons/mob/species/kepori/onmob_uniform_kepori.dmi and b/icons/mob/species/kepori/onmob_uniform_kepori.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_suits.dmi b/icons/mob/species/misc/digitigrade_suits.dmi
index 8bdb115b0370..b622c59dfa73 100644
Binary files a/icons/mob/species/misc/digitigrade_suits.dmi and b/icons/mob/species/misc/digitigrade_suits.dmi differ
diff --git a/icons/mob/species/vox/onmob_back_vox.dmi b/icons/mob/species/vox/onmob_back_vox.dmi
index 953ff24a290e..c2000834877e 100644
Binary files a/icons/mob/species/vox/onmob_back_vox.dmi and b/icons/mob/species/vox/onmob_back_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_eyes_vox.dmi b/icons/mob/species/vox/onmob_eyes_vox.dmi
index 2a30fe355bf1..3975a170291a 100644
Binary files a/icons/mob/species/vox/onmob_eyes_vox.dmi and b/icons/mob/species/vox/onmob_eyes_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_hands_vox.dmi b/icons/mob/species/vox/onmob_hands_vox.dmi
index ff5c1a11df61..977e9a71a7c5 100644
Binary files a/icons/mob/species/vox/onmob_hands_vox.dmi and b/icons/mob/species/vox/onmob_hands_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_head_vox.dmi b/icons/mob/species/vox/onmob_head_vox.dmi
index 0ab1c3be9674..6b150380891f 100644
Binary files a/icons/mob/species/vox/onmob_head_vox.dmi and b/icons/mob/species/vox/onmob_head_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_mask_vox.dmi b/icons/mob/species/vox/onmob_mask_vox.dmi
index b460caedb721..7aa3dfb2e046 100644
Binary files a/icons/mob/species/vox/onmob_mask_vox.dmi and b/icons/mob/species/vox/onmob_mask_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_neck_vox.dmi b/icons/mob/species/vox/onmob_neck_vox.dmi
new file mode 100644
index 000000000000..1877ca277c96
Binary files /dev/null and b/icons/mob/species/vox/onmob_neck_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_suit_vox.dmi b/icons/mob/species/vox/onmob_suit_vox.dmi
index 7b2ee1c8d1c9..47e2b625c116 100644
Binary files a/icons/mob/species/vox/onmob_suit_vox.dmi and b/icons/mob/species/vox/onmob_suit_vox.dmi differ
diff --git a/icons/mob/species/vox/onmob_uniform_vox.dmi b/icons/mob/species/vox/onmob_uniform_vox.dmi
index 241b13861b49..04c77c742128 100644
Binary files a/icons/mob/species/vox/onmob_uniform_vox.dmi and b/icons/mob/species/vox/onmob_uniform_vox.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 86001423aeba..0a8910ae02bd 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index 14af5186ae5c..99887c0a7613 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 20cc5db40a44..d1857dbe878d 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi
new file mode 100644
index 000000000000..d2d9e0c72e37
Binary files /dev/null and b/icons/obj/clothing/modsuit/mod_clothing.dmi differ
diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi
new file mode 100644
index 000000000000..a6be94284af8
Binary files /dev/null and b/icons/obj/clothing/modsuit/mod_construction.dmi differ
diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi
new file mode 100644
index 000000000000..69affa3fa499
Binary files /dev/null and b/icons/obj/clothing/modsuit/mod_modules.dmi differ
diff --git a/icons/obj/food/ration.dmi b/icons/obj/food/ration.dmi
index 5bcf1f2b490b..42cc013cc140 100644
Binary files a/icons/obj/food/ration.dmi and b/icons/obj/food/ration.dmi differ
diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi
index 960b9ec448af..708882c163aa 100644
Binary files a/icons/obj/guns/48x32guns.dmi and b/icons/obj/guns/48x32guns.dmi differ
diff --git a/icons/obj/guns/attachments.dmi b/icons/obj/guns/attachments.dmi
index 29ae084d5759..c06a2c7e109c 100644
Binary files a/icons/obj/guns/attachments.dmi and b/icons/obj/guns/attachments.dmi differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi b/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi
index d87a6f3c8433..e0567289abf6 100644
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi and b/icons/obj/guns/manufacturer/clip_lanchester/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi b/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi
index 7673c2f6d642..78e16bad6f98 100644
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi and b/icons/obj/guns/manufacturer/clip_lanchester/lefthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi b/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi
index 4f9158d2d36d..fea6178e903e 100644
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi and b/icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi differ
diff --git a/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi b/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi
index 4549f30f4ff9..2d5103ec36cc 100644
Binary files a/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi and b/icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi b/icons/obj/guns/manufacturer/frontier_import/48x32.dmi
index 149793c43c38..2f2db3d07ad5 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi and b/icons/obj/guns/manufacturer/frontier_import/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi b/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi
index 33b3381bdfe0..eb6c552627ee 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi and b/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi b/icons/obj/guns/manufacturer/frontier_import/onmob.dmi
index a0706579ccb5..274aa3a15036 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi and b/icons/obj/guns/manufacturer/frontier_import/onmob.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi b/icons/obj/guns/manufacturer/frontier_import/righthand.dmi
index 73945b8524df..406c40e66ac6 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi and b/icons/obj/guns/manufacturer/frontier_import/righthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi
index 19b4202da78a..cdff0b09ea6e 100644
Binary files a/icons/obj/guns/manufacturer/hunterspride/48x32.dmi and b/icons/obj/guns/manufacturer/hunterspride/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/inteq/48x32.dmi b/icons/obj/guns/manufacturer/inteq/48x32.dmi
index e7deb0f12ce0..021ff448ecb5 100644
Binary files a/icons/obj/guns/manufacturer/inteq/48x32.dmi and b/icons/obj/guns/manufacturer/inteq/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/inteq/lefthand.dmi b/icons/obj/guns/manufacturer/inteq/lefthand.dmi
index 19335eb44ff9..84707c2e5cdc 100644
Binary files a/icons/obj/guns/manufacturer/inteq/lefthand.dmi and b/icons/obj/guns/manufacturer/inteq/lefthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/inteq/onmob.dmi b/icons/obj/guns/manufacturer/inteq/onmob.dmi
index f402ffd24e2c..a33746030b43 100644
Binary files a/icons/obj/guns/manufacturer/inteq/onmob.dmi and b/icons/obj/guns/manufacturer/inteq/onmob.dmi differ
diff --git a/icons/obj/guns/manufacturer/inteq/righthand.dmi b/icons/obj/guns/manufacturer/inteq/righthand.dmi
index 33d087f394f1..481731992655 100644
Binary files a/icons/obj/guns/manufacturer/inteq/righthand.dmi and b/icons/obj/guns/manufacturer/inteq/righthand.dmi differ
diff --git a/icons/obj/machines/mining_machines.dmi b/icons/obj/machines/mining_machines.dmi
index 96151f074e11..bcd6235d26a6 100644
Binary files a/icons/obj/machines/mining_machines.dmi and b/icons/obj/machines/mining_machines.dmi differ
diff --git a/icons/obj/machines/suit_storage.dmi b/icons/obj/machines/suit_storage.dmi
index a40d04f500c6..d58a9ef3c079 100644
Binary files a/icons/obj/machines/suit_storage.dmi and b/icons/obj/machines/suit_storage.dmi differ
diff --git a/icons/obj/nutanks.dmi b/icons/obj/nutanks.dmi
index 4365bdb86771..94e4c7288512 100644
Binary files a/icons/obj/nutanks.dmi and b/icons/obj/nutanks.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 89f94e16a65a..736a25d57f5f 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index df2add959648..9ff37a4b7e0c 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 8f2566a98f8a..816d3671a8d9 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 4b8478ffbf1b..0686ea00c049 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -25,6 +25,7 @@
#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\access.dm"
#include "code\__DEFINES\achievements.dm"
+#include "code\__DEFINES\actions.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\anomalies.dm"
#include "code\__DEFINES\antagonists.dm"
@@ -94,6 +95,7 @@
#include "code\__DEFINES\menu.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
+#include "code\__DEFINES\mod.dm"
#include "code\__DEFINES\monkeys.dm"
#include "code\__DEFINES\move_force.dm"
#include "code\__DEFINES\movement.dm"
@@ -108,6 +110,7 @@
#include "code\__DEFINES\plumbing.dm"
#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
+#include "code\__DEFINES\processing.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
#include "code\__DEFINES\projectiles.dm"
@@ -155,13 +158,27 @@
#include "code\__DEFINES\wires.dm"
#include "code\__DEFINES\dcs\flags.dm"
#include "code\__DEFINES\dcs\helpers.dm"
-#include "code\__DEFINES\dcs\signals.dm"
+#include "code\__DEFINES\dcs\signals\signals_mod.dm"
+#include "code\__DEFINES\dcs\signals\signals_storage.dm"
+#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm"
+#include "code\__DEFINES\dcs\signals\signals.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_object.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_clothing.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_food.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_grenade.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_implant.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_item.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_aquarium.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_machinery.dm"
+#include "code\__DEFINES\dcs\signals\signals_obj\signals_machine\signals_supermatter.dm"
#include "code\__HELPERS\_auxtools_api.dm"
#include "code\__HELPERS\_lists.dm"
#include "code\__HELPERS\_logging.dm"
+#include "code\__HELPERS\_planes.dm"
#include "code\__HELPERS\_string_lists.dm"
#include "code\__HELPERS\areas.dm"
#include "code\__HELPERS\AStar.dm"
+#include "code\__HELPERS\atoms.dm"
#include "code\__HELPERS\bindings.dm"
#include "code\__HELPERS\bitflag_lists.dm"
#include "code\__HELPERS\chat.dm"
@@ -179,6 +196,7 @@
#include "code\__HELPERS\icons.dm"
#include "code\__HELPERS\level_traits.dm"
#include "code\__HELPERS\lighting.dm"
+#include "code\__HELPERS\maths.dm"
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\mouse_control.dm"
@@ -480,7 +498,6 @@
#include "code\datums\components\deployable.dm"
#include "code\datums\components\dooropendeathproc.dm"
#include "code\datums\components\earprotection.dm"
-#include "code\datums\components\edible.dm"
#include "code\datums\components\edit_complainer.dm"
#include "code\datums\components\embedded.dm"
#include "code\datums\components\empprotection.dm"
@@ -496,6 +513,7 @@
#include "code\datums\components\hot_ice.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
+#include "code\datums\components\jetpack.dm"
#include "code\datums\components\jousting.dm"
#include "code\datums\components\knockback.dm"
#include "code\datums\components\knockoff.dm"
@@ -523,6 +541,7 @@
#include "code\datums\components\remote_materials.dm"
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
+#include "code\datums\components\shielded.dm"
#include "code\datums\components\shrink.dm"
#include "code\datums\components\sitcomlaughter.dm"
#include "code\datums\components\sizzle.dm"
@@ -558,6 +577,8 @@
#include "code\datums\components\fantasy\affix.dm"
#include "code\datums\components\fantasy\prefixes.dm"
#include "code\datums\components\fantasy\suffixes.dm"
+#include "code\datums\components\food\edible.dm"
+#include "code\datums\components\food\food_storage.dm"
#include "code\datums\components\plumbing\_plumbing.dm"
#include "code\datums\components\plumbing\chemical_acclimator.dm"
#include "code\datums\components\plumbing\filter.dm"
@@ -640,9 +661,9 @@
#include "code\datums\elements\cleaning.dm"
#include "code\datums\elements\connect_loc.dm"
#include "code\datums\elements\digitalcamo.dm"
-#include "code\datums\elements\dunkable.dm"
#include "code\datums\elements\earhealing.dm"
#include "code\datums\elements\embed.dm"
+#include "code\datums\elements\empprotection.dm"
#include "code\datums\elements\firestacker.dm"
#include "code\datums\elements\forced_gravity.dm"
#include "code\datums\elements\lazy_fishing_spot.dm"
@@ -661,6 +682,9 @@
#include "code\datums\elements\world_icon.dm"
#include "code\datums\elements\decals\_decals.dm"
#include "code\datums\elements\decals\blood.dm"
+#include "code\datums\elements\food\dunkable.dm"
+#include "code\datums\elements\food\food_trash.dm"
+#include "code\datums\elements\food\processable.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
@@ -790,6 +814,7 @@
#include "code\datums\wires\fax.dm"
#include "code\datums\wires\microwave.dm"
#include "code\datums\wires\mines.dm"
+#include "code\datums\wires\mod.dm"
#include "code\datums\wires\mulebot.dm"
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\r_n_d.dm"
@@ -1252,6 +1277,10 @@
#include "code\game\objects\items\devices\radio\headset.dm"
#include "code\game\objects\items\devices\radio\intercom.dm"
#include "code\game\objects\items\devices\radio\radio.dm"
+#include "code\game\objects\items\food\_food.dm"
+#include "code\game\objects\items\food\bread.dm"
+#include "code\game\objects\items\food\cake.dm"
+#include "code\game\objects\items\food\spaghetti.dm"
#include "code\game\objects\items\grenades\antigravity.dm"
#include "code\game\objects\items\grenades\chem_grenade.dm"
#include "code\game\objects\items\grenades\clusterbuster.dm"
@@ -1869,9 +1898,9 @@
#include "code\modules\buildmode\submodes\basic.dm"
#include "code\modules\buildmode\submodes\boom.dm"
#include "code\modules\buildmode\submodes\copy.dm"
-#include "code\modules\buildmode\submodes\lightmaker.dm"
#include "code\modules\buildmode\submodes\delete.dm"
#include "code\modules\buildmode\submodes\fill.dm"
+#include "code\modules\buildmode\submodes\lightmaker.dm"
#include "code\modules\buildmode\submodes\map_export.dm"
#include "code\modules\buildmode\submodes\outfit.dm"
#include "code\modules\buildmode\submodes\proccall.dm"
@@ -1882,9 +1911,9 @@
#include "code\modules\cargo\bounty.dm"
#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
+#include "code\modules\cargo\console.dm"
#include "code\modules\cargo\export_scanner.dm"
#include "code\modules\cargo\exports.dm"
-#include "code\modules\cargo\expressconsole.dm"
#include "code\modules\cargo\gondolapod.dm"
#include "code\modules\cargo\order.dm"
#include "code\modules\cargo\packs.dm"
@@ -2177,9 +2206,7 @@
#include "code\modules\food_and_drinks\food\customizables.dm"
#include "code\modules\food_and_drinks\food\ration.dm"
#include "code\modules\food_and_drinks\food\snacks.dm"
-#include "code\modules\food_and_drinks\food\snacks_bread.dm"
#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
-#include "code\modules\food_and_drinks\food\snacks_cake.dm"
#include "code\modules\food_and_drinks\food\snacks_egg.dm"
#include "code\modules\food_and_drinks\food\snacks_frozen.dm"
#include "code\modules\food_and_drinks\food\snacks_meat.dm"
@@ -2190,7 +2217,6 @@
#include "code\modules\food_and_drinks\food\snacks_salad.dm"
#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
#include "code\modules\food_and_drinks\food\snacks_soup.dm"
-#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
#include "code\modules\food_and_drinks\food\snacks_vend.dm"
#include "code\modules\food_and_drinks\food\snacks\dough.dm"
#include "code\modules\food_and_drinks\food\snacks\meat.dm"
@@ -2803,6 +2829,30 @@
#include "code\modules\mob\living\simple_animal\slime\slime.dm"
#include "code\modules\mob\living\simple_animal\slime\slime_say.dm"
#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
+#include "code\modules\mod\mod_actions.dm"
+#include "code\modules\mod\mod_activation.dm"
+#include "code\modules\mod\mod_ai.dm"
+#include "code\modules\mod\mod_clothes.dm"
+#include "code\modules\mod\mod_construction.dm"
+#include "code\modules\mod\mod_control.dm"
+#include "code\modules\mod\mod_core.dm"
+#include "code\modules\mod\mod_paint.dm"
+#include "code\modules\mod\mod_theme.dm"
+#include "code\modules\mod\mod_types.dm"
+#include "code\modules\mod\mod_ui.dm"
+#include "code\modules\mod\modules\_module.dm"
+#include "code\modules\mod\modules\modules_antag.dm"
+#include "code\modules\mod\modules\modules_engineering.dm"
+#include "code\modules\mod\modules\modules_general.dm"
+#include "code\modules\mod\modules\modules_maint.dm"
+#include "code\modules\mod\modules\modules_medical.dm"
+#include "code\modules\mod\modules\modules_ninja.dm"
+#include "code\modules\mod\modules\modules_science.dm"
+#include "code\modules\mod\modules\modules_security.dm"
+#include "code\modules\mod\modules\modules_service.dm"
+#include "code\modules\mod\modules\modules_storage.dm"
+#include "code\modules\mod\modules\modules_supply.dm"
+#include "code\modules\mod\modules\modules_visor.dm"
#include "code\modules\mob_spawner\burrow.dm"
#include "code\modules\mob_spawner\hivebot.dm"
#include "code\modules\mob_spawner\spawner.dm"
@@ -3068,7 +3118,10 @@
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\special.dm"
#include "code\modules\projectiles\guns\energy\stun.dm"
+#include "code\modules\projectiles\guns\manufacturer\clip_lanchester\ballistics.dm"
+#include "code\modules\projectiles\guns\manufacturer\clip_lanchester\lasers.dm"
#include "code\modules\projectiles\guns\manufacturer\etherbor\energy_gunsword.dm"
+#include "code\modules\projectiles\guns\manufacturer\frontier_import\ballistics.dm"
#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
#include "code\modules\projectiles\guns\misc\blastcannon.dm"
#include "code\modules\projectiles\guns\misc\bow.dm"
diff --git a/sound/items/modsuit/atrocinator_step.ogg b/sound/items/modsuit/atrocinator_step.ogg
new file mode 100644
index 000000000000..deda85ac354b
Binary files /dev/null and b/sound/items/modsuit/atrocinator_step.ogg differ
diff --git a/sound/items/modsuit/ballin.ogg b/sound/items/modsuit/ballin.ogg
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/sound/items/modsuit/ballout.ogg b/sound/items/modsuit/ballout.ogg
new file mode 100644
index 000000000000..f911f1a6a61d
Binary files /dev/null and b/sound/items/modsuit/ballout.ogg differ
diff --git a/sound/items/modsuit/flamethrower.ogg b/sound/items/modsuit/flamethrower.ogg
new file mode 100644
index 000000000000..447245d50b6e
Binary files /dev/null and b/sound/items/modsuit/flamethrower.ogg differ
diff --git a/sound/items/modsuit/inflate_bloon.ogg b/sound/items/modsuit/inflate_bloon.ogg
new file mode 100644
index 000000000000..9b030d66ced7
Binary files /dev/null and b/sound/items/modsuit/inflate_bloon.ogg differ
diff --git a/sound/items/modsuit/loader_charge.ogg b/sound/items/modsuit/loader_charge.ogg
new file mode 100644
index 000000000000..61d5531f72ed
Binary files /dev/null and b/sound/items/modsuit/loader_charge.ogg differ
diff --git a/sound/items/modsuit/loader_launch.ogg b/sound/items/modsuit/loader_launch.ogg
new file mode 100644
index 000000000000..513118f3c682
Binary files /dev/null and b/sound/items/modsuit/loader_launch.ogg differ
diff --git a/sound/items/modsuit/magnetic_harness.ogg b/sound/items/modsuit/magnetic_harness.ogg
new file mode 100644
index 000000000000..3d19fccc5698
Binary files /dev/null and b/sound/items/modsuit/magnetic_harness.ogg differ
diff --git a/sound/items/modsuit/rewinder.ogg b/sound/items/modsuit/rewinder.ogg
new file mode 100644
index 000000000000..2587562dc117
Binary files /dev/null and b/sound/items/modsuit/rewinder.ogg differ
diff --git a/sound/items/modsuit/springlock.ogg b/sound/items/modsuit/springlock.ogg
new file mode 100644
index 000000000000..8d0013d26300
Binary files /dev/null and b/sound/items/modsuit/springlock.ogg differ
diff --git a/sound/items/modsuit/tem_shot.ogg b/sound/items/modsuit/tem_shot.ogg
new file mode 100644
index 000000000000..50905b95f112
Binary files /dev/null and b/sound/items/modsuit/tem_shot.ogg differ
diff --git a/sound/items/modsuit/time_anchor_set.ogg b/sound/items/modsuit/time_anchor_set.ogg
new file mode 100644
index 000000000000..457f8e6dbaee
Binary files /dev/null and b/sound/items/modsuit/time_anchor_set.ogg differ
diff --git a/sound/mecha/hydraulic.ogg b/sound/mecha/hydraulic.ogg
new file mode 100644
index 000000000000..3281ed2dc0f0
Binary files /dev/null and b/sound/mecha/hydraulic.ogg differ
diff --git a/sound/weapons/gun/hmg/cm40.ogg b/sound/weapons/gun/hmg/cm40.ogg
new file mode 100644
index 000000000000..b45507d29a0c
Binary files /dev/null and b/sound/weapons/gun/hmg/cm40.ogg differ
diff --git a/sound/weapons/gun/hmg/cm40_cocked.ogg b/sound/weapons/gun/hmg/cm40_cocked.ogg
new file mode 100644
index 000000000000..694d4772e980
Binary files /dev/null and b/sound/weapons/gun/hmg/cm40_cocked.ogg differ
diff --git a/sound/weapons/gun/hmg/cm40_reload.ogg b/sound/weapons/gun/hmg/cm40_reload.ogg
new file mode 100644
index 000000000000..490bbd4fe783
Binary files /dev/null and b/sound/weapons/gun/hmg/cm40_reload.ogg differ
diff --git a/sound/weapons/gun/hmg/cm40_unload.ogg b/sound/weapons/gun/hmg/cm40_unload.ogg
new file mode 100644
index 000000000000..ae9e31aee537
Binary files /dev/null and b/sound/weapons/gun/hmg/cm40_unload.ogg differ
diff --git a/sound/weapons/gun/hmg/shredder.ogg b/sound/weapons/gun/hmg/shredder.ogg
new file mode 100644
index 000000000000..38ddfc247eea
Binary files /dev/null and b/sound/weapons/gun/hmg/shredder.ogg differ
diff --git a/sound/weapons/gun/hmg/shredder_cocked.ogg b/sound/weapons/gun/hmg/shredder_cocked.ogg
new file mode 100644
index 000000000000..95130493d4c3
Binary files /dev/null and b/sound/weapons/gun/hmg/shredder_cocked.ogg differ
diff --git a/sound/weapons/gun/hmg/shredder_cocked_alt.ogg b/sound/weapons/gun/hmg/shredder_cocked_alt.ogg
new file mode 100644
index 000000000000..a73fd1b13b73
Binary files /dev/null and b/sound/weapons/gun/hmg/shredder_cocked_alt.ogg differ
diff --git a/sound/weapons/gun/hmg/shredder_reload.ogg b/sound/weapons/gun/hmg/shredder_reload.ogg
new file mode 100644
index 000000000000..c7614184d3dd
Binary files /dev/null and b/sound/weapons/gun/hmg/shredder_reload.ogg differ
diff --git a/sound/weapons/gun/hmg/shredder_unload.ogg b/sound/weapons/gun/hmg/shredder_unload.ogg
new file mode 100644
index 000000000000..01e6229aba62
Binary files /dev/null and b/sound/weapons/gun/hmg/shredder_unload.ogg differ
diff --git a/sound/weapons/gun/pistol/cm23.ogg b/sound/weapons/gun/pistol/cm23.ogg
new file mode 100644
index 000000000000..f207a4cda894
Binary files /dev/null and b/sound/weapons/gun/pistol/cm23.ogg differ
diff --git a/sound/weapons/gun/pistol/cm70.ogg b/sound/weapons/gun/pistol/cm70.ogg
new file mode 100644
index 000000000000..2b672fcfb352
Binary files /dev/null and b/sound/weapons/gun/pistol/cm70.ogg differ
diff --git a/sound/weapons/gun/pistol/mauler.ogg b/sound/weapons/gun/pistol/mauler.ogg
new file mode 100644
index 000000000000..70fb1f9f6eca
Binary files /dev/null and b/sound/weapons/gun/pistol/mauler.ogg differ
diff --git a/sound/weapons/gun/rifle/cm82.ogg b/sound/weapons/gun/rifle/cm82.ogg
new file mode 100644
index 000000000000..a1bf69ae00f2
Binary files /dev/null and b/sound/weapons/gun/rifle/cm82.ogg differ
diff --git a/sound/weapons/gun/rifle/cm82_reload.ogg b/sound/weapons/gun/rifle/cm82_reload.ogg
new file mode 100644
index 000000000000..133ad5aede3a
Binary files /dev/null and b/sound/weapons/gun/rifle/cm82_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/cm82_unload.ogg b/sound/weapons/gun/rifle/cm82_unload.ogg
new file mode 100644
index 000000000000..af0b43ecef90
Binary files /dev/null and b/sound/weapons/gun/rifle/cm82_unload.ogg differ
diff --git a/sound/weapons/gun/rifle/f4.ogg b/sound/weapons/gun/rifle/f4.ogg
new file mode 100644
index 000000000000..75c571db1881
Binary files /dev/null and b/sound/weapons/gun/rifle/f4.ogg differ
diff --git a/sound/weapons/gun/rifle/gal.ogg b/sound/weapons/gun/rifle/gal.ogg
deleted file mode 100644
index 25402e36cc61..000000000000
Binary files a/sound/weapons/gun/rifle/gal.ogg and /dev/null differ
diff --git a/sound/weapons/gun/smg/cm5.ogg b/sound/weapons/gun/smg/cm5.ogg
new file mode 100644
index 000000000000..6c363db926f6
Binary files /dev/null and b/sound/weapons/gun/smg/cm5.ogg differ
diff --git a/sound/weapons/gun/smg/pounder.ogg b/sound/weapons/gun/smg/pounder.ogg
new file mode 100644
index 000000000000..c9e6faf8e1ef
Binary files /dev/null and b/sound/weapons/gun/smg/pounder.ogg differ
diff --git a/sound/weapons/gun/smg/pounder_cocked.ogg b/sound/weapons/gun/smg/pounder_cocked.ogg
new file mode 100644
index 000000000000..76929be2f066
Binary files /dev/null and b/sound/weapons/gun/smg/pounder_cocked.ogg differ
diff --git a/sound/weapons/gun/smg/pounder_reload.ogg b/sound/weapons/gun/smg/pounder_reload.ogg
new file mode 100644
index 000000000000..55bcbc5aa87e
Binary files /dev/null and b/sound/weapons/gun/smg/pounder_reload.ogg differ
diff --git a/sound/weapons/gun/smg/pounder_unload.ogg b/sound/weapons/gun/smg/pounder_unload.ogg
new file mode 100644
index 000000000000..5ce78fc258a2
Binary files /dev/null and b/sound/weapons/gun/smg/pounder_unload.ogg differ
diff --git a/sound/weapons/gun/smg/spitter.ogg b/sound/weapons/gun/smg/spitter.ogg
new file mode 100644
index 000000000000..81fd0263cb2a
Binary files /dev/null and b/sound/weapons/gun/smg/spitter.ogg differ
diff --git a/sound/weapons/gun/smg/spitter_cocked.ogg b/sound/weapons/gun/smg/spitter_cocked.ogg
new file mode 100644
index 000000000000..b3d29c6f690a
Binary files /dev/null and b/sound/weapons/gun/smg/spitter_cocked.ogg differ
diff --git a/sound/weapons/gun/smg/spitter_reload.ogg b/sound/weapons/gun/smg/spitter_reload.ogg
new file mode 100644
index 000000000000..4842c567de2a
Binary files /dev/null and b/sound/weapons/gun/smg/spitter_reload.ogg differ
diff --git a/sound/weapons/gun/smg/spitter_unload.ogg b/sound/weapons/gun/smg/spitter_unload.ogg
new file mode 100644
index 000000000000..dffebe51b177
Binary files /dev/null and b/sound/weapons/gun/smg/spitter_unload.ogg differ
diff --git a/sound/weapons/gun/sniper/cmf90.ogg b/sound/weapons/gun/sniper/cmf90.ogg
new file mode 100644
index 000000000000..9468bfcc1b94
Binary files /dev/null and b/sound/weapons/gun/sniper/cmf90.ogg differ
diff --git a/strings/locations.json b/strings/locations.json
index 7a573dd86999..89af1acacd48 100644
--- a/strings/locations.json
+++ b/strings/locations.json
@@ -51,7 +51,7 @@
"Law Office",
"Library",
"Locker Room",
- "Mech Bay",
+ "Exosuit Bay",
"Medbay Central",
"Medbay Maintenance",
"Medbay Storage",
diff --git a/strings/tips.txt b/strings/tips.txt
index 85eda2e01283..c2d32c979b9e 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -138,7 +138,7 @@ Epi-pens contain a small amount of formaldehyde, that prevents organs from decay
Anomalies will give two frequencies when you analyze them, a primary and a secondary, unstable frequency. The primary will neutralize, and the unstable will more often than not cause an explosion or a similar negative effect.
Landmines have 4 wires; one disarms the mind, the other deactivates the pressure plate, another blows it up, and another blows it up on a delay.
You can tamper with landmines from range by pulsing the wires with signalers.
-Not everyone is from their species' homeworld. It can be common for a human to have a Kalixcian or Teceian name, for example.
+Not everyone is from their species' homeworld. It can be common for a human to have a Kalixcian or Tecetian name, for example.
It can be fun to brainstorm new characters. Give it a shot, you might like it.
You can create entire new shuttles and subshuttles with a shuttle manipulator either from RND or from the outpost. It's usually resource and money-intensive, so be prepared!
Class 3 drills are incredibly dangerous alone or in small groups, even if you're experienced with mining and combat. Bring along a larger crew or call someone willing to help if you're thinking of taking them on.
@@ -153,6 +153,6 @@ Vox are near-unmatched in hand-to-hand fighting; their kicks deal extra damage a
IPC posibrains are contained in the chest, not the head.
Shiptest has uptime on Wednesdays, Fridays, and Saturdays.
Exosuits are not as durable as they might feel, and it is still wise to take cover with them.
-Turning on strafing mode on a mech for combat is wise, and allows you to keep your firing lines constantly on the enemy.
+Turning on strafing mode on an exosuit for combat is wise, and allows you to keep your firing lines constantly on the enemy.
A Gygax's leg actuators drain the cell very quickly. Use sparingly.
-Installing higher tier capacitors on mechs increases power efficiency on mech abilities, weapons, and idling.
+Installing higher tier capacitors on exosuits increases power efficiency on exosuit abilities, weapons, and idling.
diff --git a/tgui/packages/tgui/constants.ts b/tgui/packages/tgui/constants.ts
index 270ce9873bd6..e17958e787f3 100644
--- a/tgui/packages/tgui/constants.ts
+++ b/tgui/packages/tgui/constants.ts
@@ -239,7 +239,7 @@ const GASES = [
color: 'paleturquoise',
},
{
- id: 'hydrogen',
+ id: 'h2',
path: '/datum/gas/hydrogen',
name: 'Hydrogen',
label: 'H₂',
@@ -294,6 +294,20 @@ const GASES = [
label: 'Nitrium',
color: 'brown',
},
+ {
+ id: 'cl2',
+ path: '/datum/gas/cl2',
+ name: 'Chlorine',
+ label: 'Cl₂',
+ color: 'yellow',
+ },
+ {
+ id: 'hcl',
+ path: '/datum/gas/hcl',
+ name: 'Hydrogen Chloride',
+ label: 'HCl',
+ color: 'greenyellow',
+ },
] as const;
// Returns gas label based on gasId
diff --git a/tgui/packages/tgui/interfaces/Cargo.js b/tgui/packages/tgui/interfaces/Cargo.js
deleted file mode 100644
index 9dfcd417f593..000000000000
--- a/tgui/packages/tgui/interfaces/Cargo.js
+++ /dev/null
@@ -1,533 +0,0 @@
-import { flow } from 'common/fp';
-import { filter, sortBy } from 'common/collections';
-import { useBackend, useSharedState } from '../backend';
-import {
- AnimatedNumber,
- Box,
- Button,
- Flex,
- Icon,
- Input,
- LabeledList,
- NoticeBox,
- Section,
- Stack,
- Table,
- Tabs,
-} from '../components';
-import { formatMoney } from '../format';
-import { Window } from '../layouts';
-
-export const Cargo = (props, context) => {
- return (
-
-
-
-
-
- );
-};
-
-export const CargoContent = (props, context) => {
- const { act, data } = useBackend(context);
- const [tab, setTab] = useSharedState(context, 'tab', 'catalog');
- const { requestonly } = data;
- const cart = data.cart || [];
- const requests = data.requests || [];
- return (
-
-
-
-
- setTab('catalog')}
- >
- Catalog
-
- 0 && 'yellow'}
- selected={tab === 'requests'}
- onClick={() => setTab('requests')}
- >
- Requests ({requests.length})
-
- {!requestonly && (
- <>
- 0 && 'yellow'}
- selected={tab === 'cart'}
- onClick={() => setTab('cart')}
- >
- Checkout ({cart.length})
-
- setTab('help')}
- >
- Help
-
- >
- )}
-
-
- {tab === 'catalog' && }
- {tab === 'requests' && }
- {tab === 'cart' && }
- {tab === 'help' && }
-
- );
-};
-
-const CargoStatus = (props, context) => {
- const { act, data } = useBackend(context);
- const {
- department,
- grocery,
- away,
- docked,
- loan,
- loan_dispatched,
- location,
- message,
- points,
- requestonly,
- can_send,
- } = data;
- return (
-
- formatMoney(value)}
- />
- {' credits'}
-
- }
- >
-
-
- {(docked && !requestonly && can_send && (
-
- {message}
- {!!loan && !requestonly && (
-
- {(!loan_dispatched && (
-
- )}
-
-
- );
-};
-
-/**
- * Take entire supplies tree
- * and return a flat supply pack list that matches search,
- * sorted by name and only the first page.
- * @param {any[]} supplies Supplies list.
- * @param {string} search The search term
- * @returns {any[]} The flat list of supply packs.
- */
-const searchForSupplies = (supplies, search) => {
- search = search.toLowerCase();
-
- return flow([
- (categories) => categories.flatMap((category) => category.packs),
- filter(
- (pack) =>
- pack.name?.toLowerCase().includes(search.toLowerCase()) ||
- pack.desc?.toLowerCase().includes(search.toLowerCase())
- ),
- sortBy((pack) => pack.name),
- (packs) => packs.slice(0, 25),
- ])(supplies);
-};
-
-export const CargoCatalog = (props, context) => {
- const { express } = props;
- const { act, data } = useBackend(context);
-
- const { self_paid, app_cost } = data;
-
- const supplies = Object.values(data.supplies);
-
- const [activeSupplyName, setActiveSupplyName] = useSharedState(
- context,
- 'supply',
- supplies[0]?.name
- );
-
- const [searchText, setSearchText] = useSharedState(
- context,
- 'search_text',
- ''
- );
-
- const activeSupply =
- activeSupplyName === 'search_results'
- ? { packs: searchForSupplies(supplies, searchText) }
- : supplies.find((supply) => supply.name === activeSupplyName);
-
- return (
-
-
- act('toggleprivate')}
- />
- >
- )
- }
- >
-
-
-
-
-
-
-
-
-
- {
- if (value === searchText) {
- return;
- }
-
- if (value.length) {
- // Start showing results
- setActiveSupplyName('search_results');
- } else if (activeSupplyName === 'search_results') {
- // return to normal category
- setActiveSupplyName(supplies[0]?.name);
- }
- setSearchText(value);
- }}
- onChange={(e, value) => {
- // Allow edge cases like the X button to work
- const onInput = e.target?.props?.onInput;
- if (onInput) {
- onInput(e, value);
- }
- }}
- />
-
-
-
- {supplies.map((supply) => (
- {
- setActiveSupplyName(supply.name);
- setSearchText('');
- }}
- >
- {supply.name} ({supply.packs.length})
-
- ))}
-
-
-
-