diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm
index 51584f90f86..7109d813b1a 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_ore_vent.dmm
@@ -1,12 +1,15 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/template_noop,
/area/template_noop)
"l" = (
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
"L" = (
/obj/structure/ore_vent/random/icebox,
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm
index db409d08c8c..a4d4953702a 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_ore_vent.dmm
@@ -1,12 +1,16 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/template_noop,
/area/template_noop)
"l" = (
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored)
"L" = (
/obj/structure/ore_vent/random/icebox/lower,
+/obj/effect/mapping_helpers/no_atoms_ontop,
+/obj/effect/mapping_helpers/no_atoms_ontop,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored)
diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
index 46ab46e0700..580c769f54d 100644
--- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
+++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
@@ -11439,7 +11439,7 @@
"dpT" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/lasertag/blue,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
@@ -12424,7 +12424,7 @@
"dFT" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/lasertag/red,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"dFY" = (
@@ -19945,7 +19945,7 @@
/area/station/maintenance/port)
"fNv" = (
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/west,
/obj/machinery/camera/autoname/directional/west,
/turf/open/floor/iron,
@@ -27903,7 +27903,7 @@
"ibc" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/boxinggloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
@@ -37229,7 +37229,7 @@
/area/station/maintenance/starboard/central)
"kFP" = (
/obj/structure/closet/toolcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/wood,
/area/station/commons/storage/tools)
"kFQ" = (
@@ -45082,7 +45082,7 @@
/area/station/maintenance/starboard/lesser)
"mUi" = (
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/sepia,
/area/station/hallway/secondary/construction)
"mUm" = (
@@ -45380,7 +45380,7 @@
/area/station/maintenance/starboard/fore)
"mYN" = (
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"mYV" = (
@@ -55678,7 +55678,7 @@
/area/station/maintenance/department/medical)
"pUr" = (
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"pUE" = (
@@ -60284,7 +60284,7 @@
"rnC" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/trimline/green/filled/line,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
"rnP" = (
@@ -67251,7 +67251,7 @@
/area/station/ai_monitored/command/storage/eva)
"twv" = (
/obj/structure/closet,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -69170,7 +69170,7 @@
"tYb" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/masks,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"tYh" = (
@@ -72129,7 +72129,7 @@
dir = 1
},
/obj/effect/turf_decal/trimline/red/line,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
@@ -76597,7 +76597,7 @@
"wcL" = (
/obj/effect/turf_decal/siding/brown,
/obj/structure/closet/athletic_mixed,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"wcN" = (
@@ -81025,7 +81025,7 @@
},
/obj/effect/turf_decal/trimline/red/corner,
/obj/machinery/airalarm/directional/west,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
"xrP" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 26a681a4a85..463b9295710 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -63,7 +63,7 @@
/turf/open/floor/wood,
/area/station/service/abandoned_gambling_den)
"aaY" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/nanotrasen{
pixel_y = 32
},
@@ -1140,7 +1140,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/gravity_generator)
"anV" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -2523,7 +2523,7 @@
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
"aEV" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/suit/toggle/lawyer/black,
/obj/item/clothing/under/rank/civilian/lawyer/black,
@@ -5494,7 +5494,7 @@
pixel_x = -32
},
/obj/machinery/airalarm/directional/south,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/suit/jacket/letterman_nanotrasen,
/obj/item/clothing/under/pants/track,
@@ -6753,7 +6753,7 @@
/area/station/engineering/atmos/project)
"bGN" = (
/obj/structure/closet/secure_closet/personal,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/item/storage/wallet,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -8462,7 +8462,7 @@
/obj/effect/spawner/random/food_or_drink/donkpockets,
/obj/effect/spawner/random/food_or_drink/condiment,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/port)
"cbh" = (
@@ -11162,7 +11162,7 @@
/turf/open/floor/iron,
/area/station/engineering/hallway)
"cIE" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -14776,7 +14776,7 @@
/obj/structure/closet,
/obj/effect/spawner/random/entertainment/wallet_storage,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/port)
"dGS" = (
@@ -15463,7 +15463,7 @@
/area/station/cargo/storage)
"dNX" = (
/obj/structure/closet/boxinggloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
@@ -15509,7 +15509,7 @@
/obj/effect/turf_decal/bot,
/obj/structure/mirror/directional/north,
/obj/machinery/light/small/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/medical/cryo)
@@ -15906,7 +15906,7 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay)
"dUH" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/clothing/wardrobe_closet_colored,
/obj/structure/sign/poster/random/directional/north,
/turf/open/floor/iron/dark,
@@ -17035,7 +17035,7 @@
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/maintenance,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
@@ -20428,7 +20428,7 @@
/turf/open/floor/iron,
/area/station/engineering/atmos/project)
"fdn" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/crate,
/obj/effect/turf_decal/bot,
/obj/item/airlock_painter/decal,
@@ -21240,7 +21240,7 @@
"fmO" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -24347,7 +24347,7 @@
/turf/open/floor/wood/large,
/area/station/service/library/lounge)
"fZV" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -29737,7 +29737,7 @@
req_access = list("medical");
specialfunctions = 4
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/medical/cryo)
@@ -30213,7 +30213,7 @@
/turf/open/floor/iron,
/area/station/maintenance/fore)
"hvq" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -31763,7 +31763,7 @@
dir = 8
},
/obj/machinery/airalarm/directional/east,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
/turf/open/floor/iron,
/area/station/commons/dorms/laundry)
@@ -34237,7 +34237,7 @@
pixel_y = -32
},
/obj/effect/spawner/random/structure/closet_private,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/item/clothing/suit/toggle/lawyer,
/obj/item/clothing/under/rank/civilian/lawyer/beige,
/obj/item/clothing/under/rank/civilian/lawyer/beige/skirt,
@@ -35526,7 +35526,7 @@
/turf/open/floor/iron,
/area/station/service/kitchen/abandoned)
"iNg" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
@@ -41386,7 +41386,7 @@
/obj/effect/turf_decal/siding/dark_blue{
dir = 8
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
/obj/machinery/light/cold/directional/east,
/turf/open/floor/iron,
@@ -43244,7 +43244,7 @@
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
"kGK" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -44514,7 +44514,7 @@
c_tag = "Departures Hallway - Access";
name = "hallway camera"
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -48267,7 +48267,7 @@
/area/station/medical/treatment_center)
"lSw" = (
/obj/structure/closet/secure_closet/personal,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -53770,7 +53770,7 @@
/area/station/commons/storage/primary)
"nph" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/siding/wood,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "mime's closet"
@@ -56136,7 +56136,7 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/funeral)
"nUo" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/secure_closet/personal,
/obj/effect/spawner/random/food_or_drink/cups,
@@ -60567,7 +60567,7 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"pca" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -61699,7 +61699,7 @@
/turf/open/floor/iron,
/area/station/commons/lounge)
"prl" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/crate,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -62101,7 +62101,7 @@
/area/station/service/kitchen)
"pwC" = (
/obj/item/radio/intercom/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/under/rank/civilian/curator,
/obj/item/clothing/under/rank/civilian/curator/skirt,
@@ -69293,7 +69293,7 @@
/turf/open/floor/iron,
/area/station/maintenance/department/crew_quarters/bar)
"riv" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/emcloset,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
@@ -75042,7 +75042,7 @@
/turf/open/floor/iron,
/area/station/service/hydroponics)
"sAY" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
/obj/machinery/firealarm/directional/west,
@@ -80146,7 +80146,7 @@
/area/station/security/range)
"tOs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/siding/wood,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "clown's closet"
@@ -80686,7 +80686,7 @@
/area/station/ai_monitored/security/armory)
"tVC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/closet/secure_closet/personal/cabinet{
name = "clown's closet"
},
@@ -84590,7 +84590,7 @@
/turf/open/floor/iron,
/area/station/commons/storage/tools)
"uPj" = (
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/delivery,
/obj/structure/closet/emcloset,
/turf/open/floor/iron,
@@ -85498,7 +85498,7 @@
/obj/machinery/firealarm/directional/south,
/obj/effect/turf_decal/delivery,
/obj/machinery/airalarm/directional/west,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -89055,7 +89055,7 @@
/area/station/service/abandoned_gambling_den/gaming)
"vXT" = (
/obj/structure/closet/wardrobe/pjs,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -96501,7 +96501,7 @@
/area/station/medical/storage)
"xQZ" = (
/obj/machinery/airalarm/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/spawner/random/structure/closet_private,
/obj/item/clothing/head/costume/kitty,
/obj/item/clothing/under/costume/maid,
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index ad9079292bc..a1453ec230f 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -5774,6 +5774,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"bzT" = (
+/obj/machinery/computer/station_alert{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/computer/security/telescreen/ce/directional/west,
+/turf/open/floor/iron/dark,
+/area/station/command/heads_quarters/ce)
"bzW" = (
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
@@ -9631,6 +9639,11 @@
/obj/structure/flora/tree/pine/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"cCq" = (
+/obj/machinery/computer/station_alert,
+/obj/effect/turf_decal/tile/yellow/half/contrasted,
+/turf/open/floor/iron,
+/area/station/command/bridge)
"cCu" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -11487,7 +11500,7 @@
/obj/machinery/airalarm/directional/north,
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/wood,
/area/station/commons/dorms)
"ddu" = (
@@ -14462,7 +14475,7 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/status_display/evac/directional/north,
/obj/effect/turf_decal/siding/white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
"dWn" = (
@@ -18005,7 +18018,7 @@
c_tag = "Fitness Room North"
},
/obj/structure/closet/masks,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -19185,7 +19198,7 @@
/area/station/maintenance/starboard/aft)
"fpa" = (
/obj/structure/closet/wardrobe/pjs,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
/turf/open/floor/iron,
/area/station/commons/dorms)
@@ -24685,6 +24698,18 @@
"gTK" = (
/turf/closed/wall,
/area/station/engineering/engine_smes)
+"gTQ" = (
+/obj/machinery/computer/station_alert{
+ dir = 8
+ },
+/obj/machinery/button/door/directional/south{
+ id = "atmos"
+ },
+/obj/machinery/light_switch/directional/south{
+ pixel_x = -10
+ },
+/turf/open/floor/iron/dark,
+/area/station/engineering/atmos/storage/gas)
"gTW" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -25091,6 +25116,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"gYM" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/mining_center,
+/turf/open/floor/iron,
+/area/mine/eva/lower)
"gYT" = (
/obj/machinery/light/cold/directional/east,
/obj/machinery/status_display/ai/directional/east,
@@ -26131,7 +26164,7 @@
name = "Genetics Requests Console"
},
/obj/effect/mapping_helpers/requests_console/supplies,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
"hqi" = (
@@ -27167,12 +27200,6 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/work)
-"hFJ" = (
-/obj/machinery/computer/station_alert,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/machinery/computer/security/telescreen/engine/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/engineering/engine_smes)
"hFL" = (
/obj/effect/spawner/structure/window/hollow/reinforced/middle{
dir = 4
@@ -28451,7 +28478,7 @@
/area/station/cargo/sorting)
"hYL" = (
/obj/structure/closet/lasertag/blue,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -38828,6 +38855,13 @@
/obj/structure/sign/warning/electric_shock/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"kXm" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 1
+ },
+/obj/effect/landmark/mining_center,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"kXq" = (
/obj/machinery/air_sensor/plasma_tank,
/turf/open/floor/engine/plasma,
@@ -40650,6 +40684,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/storage/tools)
+"lxj" = (
+/obj/machinery/airalarm/directional/west,
+/obj/machinery/computer/station_alert{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron/dark,
+/area/station/ai_monitored/turret_protected/aisat_interior)
"lxu" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -50667,7 +50709,7 @@
/area/station/maintenance/starboard/upper)
"opt" = (
/obj/structure/closet/athletic_mixed,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
@@ -50912,7 +50954,7 @@
"orV" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/stripes/line,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"osd" = (
@@ -51916,8 +51958,8 @@
"oDV" = (
/obj/structure/closet,
/obj/item/radio/intercom/directional/east,
-/obj/effect/landmark/start/hangover/closet,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -54319,7 +54361,7 @@
/area/station/maintenance/department/medical/morgue)
"pnj" = (
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/stripes/corner,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
@@ -55723,7 +55765,7 @@
/obj/effect/turf_decal/siding/white{
dir = 1
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
"pGG" = (
@@ -56230,7 +56272,7 @@
"pOo" = (
/obj/machinery/airalarm/directional/north,
/obj/structure/closet/secure_closet/personal/cabinet,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/carpet,
/area/station/commons/dorms)
"pOq" = (
@@ -59141,14 +59183,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/science/explab)
-"qFu" = (
-/obj/machinery/airalarm/directional/west,
-/obj/machinery/computer/station_alert{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
-/area/station/ai_monitored/turret_protected/aisat_interior)
"qFA" = (
/obj/machinery/door/airlock/hatch,
/obj/effect/mapping_helpers/airlock/access/any/security/maintenance,
@@ -60535,11 +60569,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/lobby)
-"qXF" = (
-/obj/machinery/computer/station_alert,
-/obj/effect/turf_decal/tile/yellow/half/contrasted,
-/turf/open/floor/iron,
-/area/station/command/bridge)
"qXO" = (
/obj/structure/flora/bush/jungle/c/style_random,
/turf/open/floor/grass,
@@ -66296,6 +66325,12 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/science/cytology)
+"sDJ" = (
+/obj/machinery/computer/station_alert,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/computer/security/telescreen/engine/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/engineering/engine_smes)
"sDQ" = (
/obj/item/radio/intercom/prison/directional/north,
/obj/effect/turf_decal/tile/red/half/contrasted{
@@ -66502,6 +66537,11 @@
dir = 1
},
/area/station/ai_monitored/command/storage/eva)
+"sFY" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/landmark/mining_center,
+/turf/open/floor/iron,
+/area/station/commons/storage/mining)
"sGk" = (
/obj/effect/turf_decal/trimline/yellow/filled/line,
/obj/structure/sign/poster/random/directional/south,
@@ -71510,7 +71550,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"udA" = (
@@ -72194,14 +72234,6 @@
/obj/machinery/gulag_teleporter,
/turf/open/floor/iron/showroomfloor,
/area/station/security/processing)
-"unG" = (
-/obj/machinery/computer/station_alert{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/machinery/computer/security/telescreen/ce/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/command/heads_quarters/ce)
"unH" = (
/obj/structure/table,
/obj/item/analyzer{
@@ -75341,12 +75373,6 @@
/obj/effect/turf_decal/tile/yellow,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"vmn" = (
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"vmr" = (
/obj/structure/musician/piano,
/turf/open/floor/wood,
@@ -75482,18 +75508,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"vnt" = (
-/obj/machinery/computer/station_alert{
- dir = 8
- },
-/obj/machinery/button/door/directional/south{
- id = "atmos"
- },
-/obj/machinery/light_switch/directional/south{
- pixel_x = -10
- },
-/turf/open/floor/iron/dark,
-/area/station/engineering/atmos/storage/gas)
"vnw" = (
/obj/machinery/camera/directional/south{
c_tag = "Fitness Room South"
@@ -84436,7 +84450,7 @@
/area/station/security/brig)
"xSv" = (
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/engineering/lobby)
"xSx" = (
@@ -84528,7 +84542,7 @@
/area/station/maintenance/aft/greater)
"xTU" = (
/obj/structure/closet/wardrobe/pjs,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/half/contrasted,
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
@@ -105620,7 +105634,7 @@ qmt
pVg
ubG
xlA
-eVa
+gYM
gSO
uPt
qmt
@@ -178857,7 +178871,7 @@ iiX
jIC
twr
wzY
-jQy
+sFY
jQy
nqx
pls
@@ -236936,7 +236950,7 @@ ajw
mmi
wiz
mmi
-vmn
+kXm
wam
wam
wam
@@ -244882,7 +244896,7 @@ ljx
nxW
utR
tmQ
-qXF
+cCq
dMX
gER
nOH
@@ -245196,7 +245210,7 @@ xtQ
hIH
kCn
mNY
-hFJ
+sDJ
tMD
ehJ
fMt
@@ -246226,7 +246240,7 @@ vkz
aom
pcg
deD
-unG
+bzT
qnC
isX
eBI
@@ -248262,7 +248276,7 @@ kRP
fiT
kQf
hDh
-vnt
+gTQ
keP
qTa
ctr
@@ -254478,7 +254492,7 @@ tWy
dZX
swF
swF
-qFu
+lxj
gzz
uCg
mfD
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 3cc70d25575..5f91cb1e676 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -907,7 +907,7 @@
/area/space/nearstation)
"aqu" = (
/obj/structure/closet/wardrobe/green,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -5424,7 +5424,7 @@
/area/station/ai_monitored/turret_protected/ai_upload)
"bTv" = (
/obj/structure/closet/lasertag/blue,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/sign/poster/official/random/directional/south,
/turf/open/floor/iron/dark,
@@ -6948,7 +6948,7 @@
/area/station/commons/toilet/restrooms)
"cwK" = (
/obj/structure/closet/wardrobe/grey,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
@@ -13144,7 +13144,7 @@
/area/station/service/bar)
"eAq" = (
/obj/structure/closet/wardrobe/white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron/dark,
@@ -22680,7 +22680,7 @@
/area/station/command/heads_quarters/ce)
"hSG" = (
/obj/structure/closet/lasertag/red,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -23759,7 +23759,7 @@
/area/station/command/teleporter)
"ilx" = (
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -25893,7 +25893,7 @@
/area/station/commons/dorms)
"iVO" = (
/obj/structure/closet/masks,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
@@ -28075,7 +28075,7 @@
/area/station/security/prison)
"jFO" = (
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
"jFZ" = (
@@ -33233,7 +33233,7 @@
/area/station/ai_monitored/turret_protected/ai)
"lus" = (
/obj/structure/closet/athletic_mixed,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -33604,7 +33604,7 @@
/area/station/maintenance/aft/lesser)
"lDA" = (
/obj/structure/closet/wardrobe/black,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -37103,7 +37103,7 @@
/area/station/maintenance/port/aft)
"mOl" = (
/obj/structure/closet/boxinggloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/east,
/turf/open/floor/iron/dark,
@@ -38786,7 +38786,7 @@
/obj/structure/sign/warning/pods{
pixel_y = 30
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/dark,
@@ -39189,7 +39189,7 @@
/area/station/hallway/primary/central)
"nwa" = (
/obj/structure/closet/wardrobe/pjs,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/south,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -63978,7 +63978,7 @@
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron/dark,
@@ -64974,7 +64974,7 @@
"wiF" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"wiS" = (
@@ -66524,7 +66524,7 @@
/area/station/maintenance/department/engine)
"wLx" = (
/obj/structure/closet/wardrobe/mixed,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/locker)
@@ -68517,7 +68517,7 @@
"xvd" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"xvf" = (
@@ -69880,7 +69880,7 @@
/area/station/medical/medbay/central)
"xUh" = (
/obj/structure/closet/wardrobe/pjs,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/commons/dorms)
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index 1b677d44d66..a5993035d49 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -278,28 +278,6 @@
},
/turf/open/floor/iron/textured_large,
/area/mine/lounge)
-"bM" = (
-/obj/structure/closet/emcloset,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/red/filled/arrow_cw{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/red/filled/mid_joiner{
- dir = 8
- },
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark/textured_edge{
- dir = 4
- },
-/area/mine/production)
"bQ" = (
/obj/structure/stone_tile/cracked{
dir = 8
@@ -575,6 +553,13 @@
/obj/structure/lattice/catwalk/mining,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"dh" = (
+/obj/machinery/mech_bay_recharge_port{
+ dir = 2
+ },
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/plating,
+/area/mine/mechbay)
"di" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -736,6 +721,27 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"ez" = (
+/obj/structure/chair/comfy/teal{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/camera/autoname/directional/west{
+ network = list("mine")
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow{
+ dir = 4
+ },
+/obj/machinery/light/directional/west,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/edge{
+ dir = 4
+ },
+/area/mine/lounge)
"eA" = (
/turf/closed/wall,
/area/mine/maintenance/public/south)
@@ -903,6 +909,14 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"fA" = (
+/obj/machinery/computer/shuttle/mining{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark,
+/area/mine/production)
"fD" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -1165,6 +1179,17 @@
dir = 1
},
/area/mine/living_quarters)
+"gK" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Labor Camp External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron/smooth,
+/area/mine/laborcamp/production)
"gM" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -1210,6 +1235,18 @@
/obj/structure/ore_box,
/turf/open/floor/iron/dark,
/area/mine/production)
+"gZ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/trimline/red/filled/line,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 1
+ },
+/area/mine/laborcamp/security)
"hd" = (
/obj/machinery/door/airlock/security/glass{
name = "Labor Camp Shuttle Security Airlock"
@@ -1308,6 +1345,15 @@
/obj/structure/lattice/catwalk,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"hB" = (
+/obj/structure/cable,
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 1
+ },
+/obj/machinery/wall_healer/directional/north,
+/turf/open/floor/iron/white,
+/area/mine/medical)
"hD" = (
/obj/structure/disposalpipe/junction{
dir = 1
@@ -1377,10 +1423,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
-"hS" = (
-/obj/structure/gulag_vent,
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"hV" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -1559,13 +1601,6 @@
},
/turf/open/floor/iron/edge,
/area/mine/living_quarters)
-"iT" = (
-/obj/structure/reagent_dispensers/watertank,
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/obj/machinery/light/directional/west,
-/obj/machinery/wall_healer/directional/west,
-/turf/open/floor/iron/dark,
-/area/mine/production)
"iX" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/chair/sofa/bench{
@@ -1607,18 +1642,6 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"jg" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/obj/structure/cable,
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/trimline/red/filled/line,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron/dark/smooth_edge{
- dir = 1
- },
-/area/mine/laborcamp/security)
"jh" = (
/obj/structure/closet,
/obj/effect/spawner/random/maintenance/two,
@@ -1653,6 +1676,13 @@
},
/turf/open/floor/iron/freezer,
/area/mine/laborcamp)
+"jn" = (
+/obj/structure/ore_vent/starter_resources{
+ icon_state = "ore_vent_active"
+ },
+/obj/effect/landmark/mining_center,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"jq" = (
/obj/structure/table,
/obj/item/paper_bin,
@@ -1994,6 +2024,14 @@
/obj/effect/turf_decal/tile/brown/fourcorners,
/turf/open/floor/iron/dark,
/area/mine/production)
+"lg" = (
+/obj/machinery/computer/order_console/mining,
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron/dark/smooth_edge,
+/area/mine/eva)
"lh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -2173,6 +2211,29 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
/turf/open/floor/plating,
/area/mine/maintenance/living/south)
+"lO" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/obj/structure/sign/directions/dorms/directional/north,
+/obj/structure/sign/directions/security/directional/north{
+ pixel_y = 24
+ },
+/obj/structure/sign/directions/supply/directional/north{
+ pixel_y = 40
+ },
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/siding/red/corner{
+ dir = 8
+ },
+/obj/machinery/light/directional/east,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/mine/lounge)
"lP" = (
/obj/item/flashlight/lantern/on,
/turf/open/misc/asteroid/basalt/lava_land_surface,
@@ -2600,6 +2661,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"nk" = (
+/obj/structure/reagent_dispensers/watertank,
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/obj/machinery/light/directional/west,
+/obj/machinery/wall_healer/directional/west,
+/turf/open/floor/iron/dark,
+/area/mine/production)
"nl" = (
/obj/structure/fence{
dir = 8
@@ -2840,29 +2908,6 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"oD" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Labor Camp External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/structure/cable,
-/turf/open/floor/iron/smooth,
-/area/mine/laborcamp/production)
-"oE" = (
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 10
- },
-/obj/item/storage/bag/ore,
-/obj/item/pickaxe,
-/obj/structure/rack,
-/obj/item/mining_scanner,
-/obj/item/flashlight,
-/obj/item/clothing/glasses/meson,
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark,
-/area/mine/storage/public)
"oI" = (
/obj/structure/bed,
/obj/effect/decal/cleanable/dirt,
@@ -2872,6 +2917,18 @@
/obj/item/cigbutt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp/quarters)
+"oJ" = (
+/obj/structure/closet/secure_closet/engineering_welding{
+ req_access = list("mining_station")
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 4
+ },
+/area/mine/mechbay)
"oN" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/decal/cleanable/dirt,
@@ -3111,13 +3168,6 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"pY" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 5
- },
-/turf/open/floor/iron/dark,
-/area/mine/mechbay)
"pZ" = (
/obj/structure/stone_tile/block{
dir = 4
@@ -3249,14 +3299,6 @@
},
/turf/open/floor/iron/freezer,
/area/mine/living_quarters)
-"qL" = (
-/obj/machinery/computer/order_console/mining,
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 1
- },
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron/dark/smooth_edge,
-/area/mine/eva)
"qN" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -3458,19 +3500,6 @@
/obj/item/flashlight/lantern/on,
/turf/open/misc/hay/lavaland,
/area/mine/lobby/raptor)
-"sb" = (
-/obj/structure/sink/directional/east,
-/obj/item/reagent_containers/cup/bucket,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/green/filled/line{
- dir = 10
- },
-/obj/effect/turf_decal/trimline/blue/filled/warning,
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark,
-/area/mine/hydroponics)
"se" = (
/turf/open/floor/iron/dark/textured_large,
/area/mine/eva)
@@ -3616,6 +3645,13 @@
dir = 1
},
/area/mine/cafeteria)
+"sX" = (
+/obj/machinery/mechpad,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 9
+ },
+/turf/open/floor/iron/dark,
+/area/mine/mechbay)
"tc" = (
/obj/structure/bed{
dir = 4
@@ -3703,6 +3739,17 @@
/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"tB" = (
+/obj/structure/bed,
+/obj/item/bedsheet,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/white/smooth_corner,
+/area/mine/medical)
"tE" = (
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
@@ -3735,26 +3782,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/storage)
-"tQ" = (
-/obj/structure/tank_holder/extinguisher,
-/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/red/filled/mid_joiner{
- dir = 4
- },
-/obj/machinery/light/small/directional/east,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/textured_edge{
- dir = 8
- },
-/area/mine/lounge)
"tV" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -3808,6 +3835,10 @@
/obj/item/crowbar/large/emergency,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"uo" = (
+/obj/structure/fluff/minepost,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"up" = (
/obj/structure/railing{
dir = 1
@@ -3851,15 +3882,6 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/area/mine/living_quarters)
-"uy" = (
-/obj/structure/cable,
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 1
- },
-/obj/machinery/wall_healer/directional/north,
-/turf/open/floor/iron/white,
-/area/mine/medical)
"uC" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/siding/wideplating_new{
@@ -4192,6 +4214,22 @@
dir = 8
},
/area/mine/lounge)
+"wq" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/bar/opposingcorners{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/checker,
+/area/mine/cafeteria)
"wr" = (
/obj/item/seeds/plump,
/obj/machinery/hydroponics/soil,
@@ -4266,6 +4304,16 @@
/obj/item/seeds/banana,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"wT" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/loading_area{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"wU" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
@@ -4302,6 +4350,19 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/area/mine/cafeteria)
+"xr" = (
+/obj/structure/sink/directional/east,
+/obj/item/reagent_containers/cup/bucket,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/green/filled/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/blue/filled/warning,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark,
+/area/mine/hydroponics)
"xt" = (
/obj/structure/railing{
dir = 4
@@ -4371,13 +4432,6 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/area/mine/cafeteria)
-"xK" = (
-/obj/machinery/mech_bay_recharge_port{
- dir = 2
- },
-/obj/machinery/airalarm/directional/east,
-/turf/open/floor/plating,
-/area/mine/mechbay)
"xN" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
@@ -4538,17 +4592,6 @@
},
/turf/open/floor/iron,
/area/mine/living_quarters)
-"yM" = (
-/obj/structure/bed,
-/obj/item/bedsheet,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 6
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/white/smooth_corner,
-/area/mine/medical)
"yN" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -4573,6 +4616,13 @@
/obj/structure/stone_tile/block/cracked,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"yT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/smooth,
+/area/mine/laborcamp/production)
"yV" = (
/obj/structure/railing{
dir = 1
@@ -5267,24 +5317,6 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
/turf/open/floor/plating,
/area/mine/maintenance/public/north)
-"DM" = (
-/obj/machinery/computer/shuttle/mining{
- dir = 1
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark,
-/area/mine/production)
-"DT" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/loading_area{
- dir = 8
- },
-/obj/effect/turf_decal/weather/dirt{
- dir = 4
- },
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"DV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -5572,13 +5604,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood/parquet,
/area/mine/lobby/raptor)
-"FK" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/iron/smooth,
-/area/mine/laborcamp/production)
"FL" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/small/directional/west,
@@ -5627,6 +5652,22 @@
"Ge" = (
/turf/closed/wall,
/area/mine/laborcamp/quarters)
+"Gf" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Labor Camp External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/smooth,
+/area/mine/laborcamp/production)
+"Gi" = (
+/obj/item/stack/cable_coil/cut,
+/turf/open/misc/asteroid/basalt/lava_land_surface{
+ icon_state = "basalt_dug"
+ },
+/area/lavaland/surface/outdoors)
"Gl" = (
/obj/item/reagent_containers/cup/glass/colocup,
/turf/open/misc/asteroid/basalt/lava_land_surface,
@@ -5805,18 +5846,6 @@
dir = 1
},
/area/mine/lounge)
-"Hx" = (
-/obj/structure/closet/secure_closet/engineering_welding{
- req_access = list("mining_station")
- },
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 8
- },
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/dark/smooth_edge{
- dir = 4
- },
-/area/mine/mechbay)
"Hz" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/toilet{
@@ -5850,10 +5879,6 @@
dir = 1
},
/area/mine/lounge)
-"HC" = (
-/obj/structure/cable,
-/turf/open/floor/iron/smooth,
-/area/mine/laborcamp/production)
"HD" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -5906,6 +5931,22 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
+"HP" = (
+/obj/machinery/computer/mech_bay_power_console{
+ dir = 8
+ },
+/obj/machinery/camera/autoname/directional/east{
+ network = list("mine")
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 8
+ },
+/area/mine/mechbay)
"HS" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -6406,6 +6447,19 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/mine/maintenance/service/comms)
+"Ko" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 10
+ },
+/obj/item/storage/bag/ore,
+/obj/item/pickaxe,
+/obj/structure/rack,
+/obj/item/mining_scanner,
+/obj/item/flashlight,
+/obj/item/clothing/glasses/meson,
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark,
+/area/mine/storage/public)
"Kp" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/decal/cleanable/dirt,
@@ -6458,22 +6512,6 @@
},
/turf/open/floor/carpet/royalblue,
/area/mine/living_quarters)
-"KD" = (
-/obj/structure/table/wood,
-/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
- pixel_x = -3;
- pixel_y = 7
- },
-/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
- pixel_x = 6;
- pixel_y = 5
- },
-/obj/effect/turf_decal/tile/bar/opposingcorners{
- dir = 1
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/checker,
-/area/mine/cafeteria)
"KI" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6547,6 +6585,28 @@
"Lg" = (
/turf/open/floor/plating,
/area/mine/storage)
+"Lh" = (
+/obj/structure/closet/emcloset,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/arrow_cw{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/filled/arrow_cw{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/red/filled/mid_joiner{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron/dark/textured_edge{
+ dir = 4
+ },
+/area/mine/production)
"Li" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6596,17 +6656,6 @@
dir = 8
},
/area/mine/production)
-"Ls" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Labor Camp External Airlock"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron/smooth,
-/area/mine/laborcamp/production)
"Lu" = (
/obj/structure/closet/crate/secure/loot,
/obj/effect/decal/cleanable/dirt,
@@ -6751,6 +6800,12 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Mc" = (
+/obj/structure/chair/wood/wings,
+/obj/machinery/light/small/directional/east,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/carpet/neon/simple/red/nodots,
+/area/mine/cafeteria)
"Me" = (
/obj/machinery/shower/directional/west,
/obj/effect/turf_decal/stripes/corner{
@@ -6776,13 +6831,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/wood/parquet,
/area/mine/lobby/raptor)
-"Mp" = (
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 6
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron/dark,
-/area/mine/production)
"Mr" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -6824,14 +6872,6 @@
},
/turf/open/floor/iron,
/area/mine/living_quarters)
-"MF" = (
-/obj/machinery/light/directional/east,
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 6
- },
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron,
-/area/mine/cafeteria)
"MH" = (
/obj/machinery/door/airlock/external/glass{
name = "Mining External Airlock"
@@ -7010,6 +7050,10 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth_large,
/area/mine/laborcamp/production)
+"NC" = (
+/obj/structure/gulag_vent,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"NE" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -7340,6 +7384,26 @@
/obj/item/toy/beach_ball,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"PA" = (
+/obj/structure/tank_holder/extinguisher,
+/obj/effect/turf_decal/trimline/yellow/filled/arrow_ccw{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/filled/arrow_ccw{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/red/filled/mid_joiner{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/east,
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/textured_edge{
+ dir = 8
+ },
+/area/mine/lounge)
"PD" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/maintenance/two,
@@ -7463,12 +7527,6 @@
},
/turf/open/floor/iron/dark,
/area/mine/mechbay)
-"Qq" = (
-/obj/structure/ore_vent/starter_resources{
- icon_state = "ore_vent_active"
- },
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"Qw" = (
/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile{
@@ -7482,10 +7540,6 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
-"Qx" = (
-/obj/structure/fluff/minepost,
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
"Qz" = (
/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment{
@@ -7573,29 +7627,6 @@
"QX" = (
/turf/closed/wall,
/area/mine/mechbay)
-"QY" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 2
- },
-/obj/structure/sign/directions/dorms/directional/north,
-/obj/structure/sign/directions/security/directional/north{
- pixel_y = 24
- },
-/obj/structure/sign/directions/supply/directional/north{
- pixel_y = 40
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/siding/red/corner{
- dir = 8
- },
-/obj/machinery/light/directional/east,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/iron,
-/area/mine/lounge)
"Ra" = (
/obj/machinery/door/airlock/mining/glass{
name = "Mining Station EVA"
@@ -7750,13 +7781,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/eva)
-"RU" = (
-/obj/machinery/mechpad,
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 9
- },
-/turf/open/floor/iron/dark,
-/area/mine/mechbay)
"RV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -7924,7 +7948,7 @@
},
/turf/open/floor/iron/dark/textured_large,
/area/mine/laborcamp/security)
-"SK" = (
+"SI" = (
/obj/effect/turf_decal/weather/dirt{
dir = 1
},
@@ -8403,22 +8427,6 @@
/obj/effect/mapping_helpers/airlock/access/any/security/brig,
/turf/open/floor/plating,
/area/mine/maintenance/labor)
-"Vs" = (
-/obj/machinery/computer/mech_bay_power_console{
- dir = 8
- },
-/obj/machinery/camera/autoname/directional/east{
- network = list("mine")
- },
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 4
- },
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/turf/open/floor/iron/dark/smooth_edge{
- dir = 8
- },
-/area/mine/mechbay)
"Vt" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -8620,6 +8628,13 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"WJ" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/turf/open/floor/iron/dark,
+/area/mine/mechbay)
"WK" = (
/obj/structure/chair/sofa/corp{
dir = 8
@@ -8903,12 +8918,6 @@
dir = 1
},
/area/mine/cafeteria)
-"Yd" = (
-/obj/item/stack/cable_coil/cut,
-/turf/open/misc/asteroid/basalt/lava_land_surface{
- icon_state = "basalt_dug"
- },
-/area/lavaland/surface/outdoors)
"Ye" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -8992,6 +9001,13 @@
dir = 1
},
/area/mine/laborcamp/quarters)
+"YD" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron/dark,
+/area/mine/production)
"YF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -9041,12 +9057,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp/production)
-"Za" = (
-/obj/structure/chair/wood/wings,
-/obj/machinery/light/small/directional/east,
-/obj/item/radio/intercom/directional/east,
-/turf/open/floor/carpet/neon/simple/red/nodots,
-/area/mine/cafeteria)
"Zb" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -9080,6 +9090,14 @@
},
/turf/open/floor/iron/dark/smooth_edge,
/area/mine/laborcamp/security)
+"Zn" = (
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 6
+ },
+/obj/item/radio/intercom/directional/east,
+/turf/open/floor/iron,
+/area/mine/cafeteria)
"Zp" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -9151,27 +9169,6 @@
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
-"ZG" = (
-/obj/structure/chair/comfy/teal{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/camera/autoname/directional/west{
- network = list("mine")
- },
-/obj/effect/turf_decal/trimline/blue/filled/line{
- dir = 8
- },
-/obj/effect/turf_decal/siding/yellow{
- dir = 4
- },
-/obj/machinery/light/directional/west,
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron/edge{
- dir = 4
- },
-/area/mine/lounge)
"ZH" = (
/obj/structure/closet/secure_closet/labor_camp_security,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -9194,6 +9191,10 @@
/obj/structure/lattice/catwalk/mining,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"ZN" = (
+/obj/structure/cable,
+/turf/open/floor/iron/smooth,
+/area/mine/laborcamp/production)
"ZP" = (
/obj/structure/sign/directions/engineering/directional/north{
pixel_y = 24
@@ -20251,7 +20252,7 @@ uU
uU
uU
pU
-hS
+NC
pU
uU
uU
@@ -21278,7 +21279,7 @@ uU
uU
uU
uU
-Qx
+uo
pU
uU
uU
@@ -22307,7 +22308,7 @@ uU
uU
uU
uU
-SK
+SI
uU
uU
uU
@@ -22563,7 +22564,7 @@ uU
uU
uU
uU
-Qx
+uo
pU
pU
uU
@@ -22821,7 +22822,7 @@ uU
uU
pU
pU
-Yd
+Gi
pU
pU
uU
@@ -23078,7 +23079,7 @@ pU
pU
pU
tL
-DT
+wT
pV
pU
pU
@@ -23335,7 +23336,7 @@ pU
pU
pU
ff
-oD
+Gf
ff
pU
pU
@@ -23592,7 +23593,7 @@ pU
pU
pU
ff
-FK
+yT
ff
pU
pU
@@ -23849,7 +23850,7 @@ ff
eR
eR
ff
-Ls
+gK
ff
eR
ff
@@ -24106,7 +24107,7 @@ YY
YY
LR
bb
-HC
+ZN
rm
Qe
ff
@@ -32590,7 +32591,7 @@ he
he
Ia
TT
-jg
+gZ
Ia
Ia
Ia
@@ -37983,7 +37984,7 @@ Tc
xJ
XA
eK
-MF
+Zn
px
DI
oS
@@ -38766,9 +38767,9 @@ pq
Vp
Zq
Me
-tQ
+PA
Zq
-QY
+lO
Zz
FT
Qa
@@ -39281,7 +39282,7 @@ pU
gx
Sn
Sz
-sb
+xr
yX
PV
Gx
@@ -39775,7 +39776,7 @@ aj
aj
pU
kY
-Za
+Mc
wJ
kY
Zj
@@ -40036,7 +40037,7 @@ kY
kY
kY
eP
-KD
+wq
DW
qg
kY
@@ -40058,7 +40059,7 @@ bw
XD
rU
Og
-oE
+Ko
Ly
dJ
aj
@@ -40822,7 +40823,7 @@ aj
xB
DK
Dz
-uy
+hB
vu
It
Xp
@@ -41337,7 +41338,7 @@ xB
ZT
Dz
ae
-yM
+tB
It
yf
mR
@@ -42365,7 +42366,7 @@ Zq
Rt
bK
Xi
-ZG
+ez
EE
XB
Zb
@@ -46200,9 +46201,9 @@ Ey
tV
tM
QX
-RU
+sX
ht
-Hx
+oJ
Ok
QX
Vh
@@ -46962,7 +46963,7 @@ aj
aj
aj
Ep
-Qq
+jn
fx
aj
oA
@@ -46971,9 +46972,9 @@ tV
tV
tM
QX
-xK
-pY
-Vs
+dh
+WJ
+HP
CE
Ni
IW
@@ -47479,20 +47480,20 @@ aj
gA
aj
Le
-bM
+Lh
Nh
NU
Yl
XT
NU
ld
-iT
+nk
ld
NU
WB
wt
jw
-DM
+fA
Le
Le
NU
@@ -48773,7 +48774,7 @@ Vw
wl
Ti
pK
-qL
+lg
se
Yg
li
@@ -49285,7 +49286,7 @@ RY
RY
dQ
Cg
-Mp
+YD
pK
Ob
IL
diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm
index 45c329b8b53..82eda8b9e7a 100644
--- a/_maps/map_files/NebulaStation/NebulaStation.dmm
+++ b/_maps/map_files/NebulaStation/NebulaStation.dmm
@@ -2131,7 +2131,7 @@
},
/obj/structure/closet/emcloset,
/obj/machinery/camera/autoname/directional/west,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
"apU" = (
@@ -3582,7 +3582,7 @@
"aBG" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/warning/vacuum/directional/west,
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/dark,
@@ -7018,7 +7018,7 @@
"bcd" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/small,
/area/station/hallway/primary/port)
"bcf" = (
@@ -17651,7 +17651,7 @@
},
/obj/item/radio/intercom/directional/south,
/obj/machinery/camera/autoname/directional/south,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness)
"cGz" = (
@@ -20759,7 +20759,7 @@
dir = 5
},
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
@@ -42387,7 +42387,7 @@
desc = "A very fashionable pair of flip flops.";
name = "flip-flops"
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/white/small,
/area/station/commons/toilet/shower)
@@ -49698,7 +49698,7 @@
/obj/effect/turf_decal/trimline/dark_red/mid_joiner{
dir = 8
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness)
@@ -51655,7 +51655,7 @@
dir = 4
},
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"hFV" = (
@@ -51915,7 +51915,7 @@
/obj/machinery/camera/autoname/directional/south{
dir = 5
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"hIe" = (
@@ -63750,7 +63750,7 @@
"jwy" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/light/directional/south,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/dark/small,
@@ -65731,7 +65731,7 @@
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"jKq" = (
@@ -66022,7 +66022,7 @@
},
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/structure/sign/poster/random/directional/west,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
"jMG" = (
@@ -67436,7 +67436,7 @@
/obj/structure/closet/wardrobe/white,
/obj/effect/turf_decal/trimline/white,
/obj/item/clothing/gloves/color/white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"jYb" = (
@@ -74151,7 +74151,7 @@
/obj/effect/turf_decal/delivery,
/obj/structure/closet/emcloset,
/obj/structure/sign/poster/random/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
"kTG" = (
@@ -85345,7 +85345,7 @@
dir = 8
},
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"mIB" = (
@@ -91009,7 +91009,7 @@
/obj/structure/sign/departments/medbay/alt/directional/north,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/siding/thinplating_new/light/corner,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white,
/area/station/hallway/primary/fore)
"nAX" = (
@@ -91103,7 +91103,7 @@
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"nBv" = (
@@ -92582,7 +92582,7 @@
},
/obj/structure/closet/secure_closet/personal/cabinet,
/obj/structure/sign/poster/random/directional/west,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/firealarm/directional/south,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
@@ -92942,7 +92942,7 @@
/obj/item/clothing/under/misc/assistantformal,
/obj/item/clothing/suit/hooded/wintercoat,
/obj/item/clothing/shoes/winterboots,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
@@ -94958,7 +94958,7 @@
/obj/effect/turf_decal/trimline/dark,
/obj/item/clothing/shoes/jackboots,
/obj/item/clothing/gloves/color/black,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/airalarm/directional/south,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
@@ -100601,7 +100601,7 @@
/obj/structure/sign/warning/vacuum/directional/north,
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"oTH" = (
@@ -107792,7 +107792,7 @@
dir = 8
},
/obj/structure/closet/secure_closet/personal/cabinet,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/wood/large,
/area/station/commons/dorms)
"pTC" = (
@@ -114600,7 +114600,7 @@
},
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/small,
/area/station/commons/toilet/shower)
"qWF" = (
@@ -123248,7 +123248,7 @@
dir = 4
},
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"skV" = (
@@ -123594,7 +123594,7 @@
/obj/effect/turf_decal/trimline/dark_red,
/obj/machinery/light/small/directional/east,
/obj/effect/spawner/random/clothing/gloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/herringbone,
/area/station/commons/locker)
"soc" = (
@@ -127203,7 +127203,7 @@
/obj/structure/sign/warning/vacuum/directional/north,
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/bot_white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/maintenance/central)
"sRX" = (
@@ -134637,7 +134637,7 @@
dir = 8
},
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"tUa" = (
@@ -138738,7 +138738,7 @@
"uCd" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/south,
/turf/open/floor/iron/dark/small,
/area/station/hallway/secondary/command)
@@ -139333,7 +139333,7 @@
/area/station/hallway/primary/port)
"uHw" = (
/obj/structure/closet,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/newscaster/directional/north,
/obj/effect/turf_decal/tile/dark_blue/opposingcorners{
dir = 1
@@ -146936,7 +146936,7 @@
/obj/effect/turf_decal/siding/thinplating_new/light/corner{
dir = 8
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white,
/area/station/hallway/primary/fore)
"vMd" = (
@@ -153186,7 +153186,7 @@
"wLa" = (
/obj/structure/closet/firecloset,
/obj/effect/turf_decal/delivery,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/small,
/area/station/hallway/primary/port)
"wLd" = (
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 1910893bd47..2ecb34e6d63 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -546,7 +546,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/station/escapepodbay)
@@ -1107,7 +1107,7 @@
dir = 4
},
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/escapepodbay)
@@ -7025,7 +7025,7 @@
/area/station/service/kitchen/coldroom)
"btC" = (
/obj/structure/closet/wardrobe/green,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -8130,7 +8130,7 @@
dir = 6
},
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
"bNa" = (
@@ -12687,7 +12687,7 @@
/area/station/maintenance/tram/left)
"dml" = (
/obj/structure/closet/lasertag/red,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/east,
/obj/effect/turf_decal/tile/red/full,
/turf/open/floor/iron/dark/smooth_large,
@@ -15788,7 +15788,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 5
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/tram/right)
@@ -19625,7 +19625,7 @@
/area/station/maintenance/solars/port)
"fNR" = (
/obj/structure/closet/lasertag/blue,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/structure/sign/poster/official/random/directional/east,
/obj/effect/turf_decal/tile/blue/full,
/turf/open/floor/iron/dark/smooth_large,
@@ -24166,7 +24166,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 9
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit)
@@ -38960,7 +38960,7 @@
dir = 10
},
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/service)
"mya" = (
@@ -39775,7 +39775,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"mMn" = (
@@ -41942,7 +41942,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 10
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"nBy" = (
@@ -55674,7 +55674,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 9
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/tram/right)
@@ -63574,7 +63574,7 @@
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 10
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit)
@@ -68023,7 +68023,7 @@
dir = 6
},
/obj/structure/closet/toolcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/machinery/camera/directional/east{
c_tag = "Civilian - Aux Tool Storage"
},
@@ -71954,7 +71954,7 @@
dir = 4
},
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/camera/autoname/directional/east,
/turf/open/floor/iron/dark,
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 92ddc56d0e9..586d6f4bbde 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -2840,7 +2840,7 @@
/area/station/hallway/primary/central)
"aUB" = (
/obj/structure/closet/wardrobe/black,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -8725,7 +8725,7 @@
"des" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"deY" = (
@@ -12657,7 +12657,7 @@
/area/station/maintenance/solars/port/aft)
"euF" = (
/obj/structure/closet/wardrobe/white,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -13267,7 +13267,7 @@
},
/obj/structure/closet/emcloset,
/obj/structure/window/spawner/directional/east,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"eEG" = (
@@ -14884,7 +14884,7 @@
/area/space/nearstation)
"flH" = (
/obj/structure/closet/boxinggloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness/recreation)
"flN" = (
@@ -17445,7 +17445,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"gdf" = (
@@ -18068,7 +18068,7 @@
"gpR" = (
/obj/machinery/light/dim/directional/south,
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
"gpV" = (
@@ -21434,7 +21434,7 @@
/obj/structure/closet/masks,
/obj/structure/window/spawner/directional/west,
/obj/machinery/light/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"huj" = (
@@ -26196,7 +26196,7 @@
/area/station/science/xenobiology)
"jgB" = (
/obj/structure/closet/emcloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
@@ -39900,7 +39900,7 @@
/area/station/science/xenobiology)
"nLb" = (
/obj/structure/closet/wardrobe/grey,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -42704,7 +42704,7 @@
/obj/structure/window/spawner/directional/west,
/obj/structure/window/spawner/directional/east,
/obj/machinery/camera/autoname/directional/north,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"oOe" = (
@@ -45691,7 +45691,7 @@
dir = 1
},
/obj/machinery/camera/autoname/directional/south,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"pMG" = (
@@ -54974,7 +54974,7 @@
/area/station/science/genetics)
"sPi" = (
/obj/structure/closet/firecloset,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/textured,
/area/station/hallway/primary/central)
"sPv" = (
@@ -55504,7 +55504,7 @@
/area/station/service/bar)
"sYu" = (
/obj/structure/closet/crate/wooden/toy,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/blue/opposingcorners,
/obj/effect/turf_decal/tile/red/opposingcorners{
dir = 1
@@ -57440,7 +57440,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark/smooth_large,
/area/station/hallway/primary/central)
"tGR" = (
@@ -58661,7 +58661,7 @@
/obj/structure/closet/lasertag/red,
/obj/structure/window/spawner/directional/east,
/obj/effect/turf_decal/tile/red/fourcorners,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"ubV" = (
@@ -62687,7 +62687,7 @@
/area/station/commons/locker)
"vAE" = (
/obj/structure/closet/wardrobe/green,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron/dark,
@@ -62740,7 +62740,7 @@
dir = 1
},
/obj/structure/closet/boxinggloves,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"vCy" = (
@@ -65860,7 +65860,7 @@
/area/station/science/lobby)
"wED" = (
/obj/structure/closet/masks,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/white/textured_large,
/area/station/commons/fitness/recreation)
"wEF" = (
@@ -70128,7 +70128,7 @@
/area/station/ai_monitored/turret_protected/aisat/foyer)
"yeS" = (
/obj/structure/closet/crate/grave,
-/obj/effect/landmark/start/hangover/closet,
+/obj/effect/landmark/start/hangover,
/turf/open/misc/asteroid,
/area/station/asteroid)
"yfl" = (
diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm
index 1ee833c6bf1..8afca99300b 100644
--- a/code/__DEFINES/botany.dm
+++ b/code/__DEFINES/botany.dm
@@ -21,6 +21,15 @@
#define CARNIVORY_POTENCY_MIN 30
/// Fungle megabolism plants have a min yield of 1.
#define FUNGAL_METAB_YIELD_MIN 1
+/// Semiaquatic plants gets 50% more weeds in soil.
+#define SEMIAQUATIC_SOIL_WEED_MALUS 1.5
+/// Soil loving plants get worse yield when grown in a medium that isn't soil.
+#define SOIL_LOVER_HYDRO_YIELD_MALUS 0.7
+/// Upper bound of produce size mod for soil lowers grown without soil.
+#define SOIL_LOVER_HYDRO_POTENCY_MAX 0.8
+/// Lower bound of produce size mod for soil lowers grown without soil
+#define SOIL_LOVER_HYDRO_POTENCY_MIN 0.5
+
/// -- Hydroponics tray defines. --
/// Base amount of nutrients a tray can old.
@@ -91,3 +100,29 @@
/// Used as a baseline plant rarity for more uncommon plants, usually requiring mutation
#define PLANT_MODERATELY_RARE 20
+
+/// How much water drain is reduced for trays with the SUPERWATER modifier such as superabsorbent hydrogel beads.
+#define SUPER_WATER_MODIFIER 0.5
+// How much faster our mushrooms mature on a good mushroom growing soil such as korta coir.
+#define FAST_MUSH_MODIFIER 1.4
+// How many grafts we harvest from one plant if planted in a tray with the MULTI_GRAFT flag.
+#define MULTI_GRAFT_MAX_COUNT 3
+
+/// TRAY BITFLAGS
+
+/// For watery trays, capable of growing aquatic plants.
+#define HYDROPONIC (1 << 0)
+/// For soil type trays that provide structure for soil loving plants.
+#define SOIL (1 << 1)
+/// Allows you to take up to 3 grafts from the same plant.
+#define MULTIGRAFT (1 << 2)
+/// Allows you to plant grafts into this tray to propagate them vegetativley.
+#define GRAFT_MEDIUM (1 << 3)
+/// Musrooms mature faster in this type of tray.
+#define FAST_MUSHROOMS (1 << 4)
+/// Extra slimy worms can be created by composting greens in this soil.
+#define WORM_HABITAT (1 << 5)
+/// Water drains at a slower rate from this soil.
+#define SUPERWATER (1 << 6)
+/// If this tray runs out of nutrients, add a little nitrogen from the breakdown of natural fertilizers or nitrogen fixating bacteria.
+#define SLOW_RELEASE (1 << 7)
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index 35a18fffdd3..116fb3adbea 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -135,6 +135,7 @@ GLOBAL_LIST_EMPTY(deathsquadspawn)
GLOBAL_LIST_EMPTY(emergencyresponseteamspawn)
GLOBAL_LIST_EMPTY(ruin_landmarks)
GLOBAL_LIST_EMPTY(bar_areas)
+GLOBAL_LIST_EMPTY(mining_center) // For determining vent size ranked lists, epicenters for comparison goes here.
/// List of all the maps that have been cached for /proc/load_map
GLOBAL_LIST_EMPTY(cached_maps)
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index c4d089402be..e33b1a2b8d0 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -755,10 +755,11 @@ SUBSYSTEM_DEF(job)
return joining_mob
/obj/structure/chair/JoinPlayerHere(mob/joining_mob, buckle)
- . = ..()
+ var/mob/created_joining_mob = ..()
// Placing a mob in a chair will attempt to buckle it, or else fall back to default.
- if(buckle && isliving(joining_mob))
- buckle_mob(joining_mob, FALSE, FALSE)
+ if(buckle && isliving(created_joining_mob))
+ buckle_mob(created_joining_mob, FALSE, FALSE)
+ return created_joining_mob
/datum/controller/subsystem/job/proc/send_to_late_join(mob/M, buckle = TRUE)
var/atom/destination
diff --git a/code/controllers/subsystem/ore_generation.dm b/code/controllers/subsystem/ore_generation.dm
index b364bfe0487..7f51c2bcbbe 100644
--- a/code/controllers/subsystem/ore_generation.dm
+++ b/code/controllers/subsystem/ore_generation.dm
@@ -22,12 +22,49 @@ SUBSYSTEM_DEF(ore_generation)
var/list/ore_vent_minerals = list()
/datum/controller/subsystem/ore_generation/Initialize()
+ /// First, lets sort each ore_vent here based on their distance to the landmark, then we'll assign sizes.
+ var/list/sort_vents = list()
+ for(var/obj/structure/ore_vent/vent as anything in possible_vents)
+
+ var/obj/landmark_anchor //We need to find the mining epicenter to gather distance from.
+ for(var/obj/possible_landmark as anything in GLOB.mining_center) // have to check multiple due to icebox
+ if(possible_landmark.z == vent.z)
+ landmark_anchor = possible_landmark
+ break
+
+ if(!landmark_anchor) //We're missing a mining epicenter landmark, but it's not crash-worthy.
+ vent.vent_size_setup(random = TRUE, force_size = null, map_loading = TRUE)
+ continue
+
+ sort_vents.Insert(length(sort_vents), vent)
+ sort_vents[vent] = get_dist(get_turf(vent),get_turf(landmark_anchor))
+
+ sortTim(sort_vents, GLOBAL_PROC_REF(cmp_numeric_asc), associative = TRUE) // Should sort list from closest to farthest.
+ possible_vents = sort_vents // Now we can work with the main list
+
+ var/cutoff = round((length(possible_vents) / 3))
+ var/vent_size_level = SMALL_VENT_TYPE
+
+ for(var/obj/structure/ore_vent/vent as anything in possible_vents)
+ vent.vent_size_setup(random = FALSE, force_size = vent_size_level, map_loading = TRUE)
+ cutoff--
+ if(cutoff > 0 || vent_size_level == LARGE_VENT_TYPE)
+ continue
+ cutoff = round((length(possible_vents) / 3))
+ switch(vent_size_level)
+ if(SMALL_VENT_TYPE)
+ vent_size_level = MEDIUM_VENT_TYPE
+ if(MEDIUM_VENT_TYPE)
+ vent_size_level = LARGE_VENT_TYPE
+
+ //Finally, we're going to round robin through the list of ore vents and assign a mineral to them until complete.
//Basically, we're going to round robin through the list of ore vents and assign a mineral to them until complete.
for(var/obj/structure/ore_vent/vent as anything in possible_vents)
if(vent.unique_vent)
continue //Ya'll already got your minerals.
vent.generate_mineral_breakdown(map_loading = TRUE)
+
/// Handles roundstart logging
logger.Log(
LOG_CATEGORY_CAVE_GENERATION,
diff --git a/code/controllers/subsystem/processing/personality.dm b/code/controllers/subsystem/processing/personality.dm
index e38789a6127..0f9c1021bef 100644
--- a/code/controllers/subsystem/processing/personality.dm
+++ b/code/controllers/subsystem/processing/personality.dm
@@ -19,6 +19,9 @@ PROCESSING_SUBSYSTEM_DEF(personalities)
/// Initialized personality singletons
/datum/controller/subsystem/processing/personalities/proc/init_personalities()
+ if(length(personalities_by_type))
+ return // Already initialized
+
personalities_by_type = list()
personalities_by_key = list()
incompatibilities_by_group = list()
diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm
index 32d301a18b1..66205b3e287 100644
--- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm
+++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm
@@ -41,11 +41,13 @@
*
* Returns the given overlay, which can be deleted to stop displaying it. Will return null if no bodypart matching the overlay's attached_body_zone field can be found.
*/
-/mob/living/carbon/human/proc/give_emote_overlay(overlay_typepath)
- var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath()
- var/obj/item/bodypart/bodypart = src.get_bodypart(overlay.attached_body_zone)
+/mob/living/carbon/human/proc/give_emote_overlay(datum/bodypart_overlay/simple/emote/overlay_typepath)
+ var/obj/item/bodypart/bodypart = get_bodypart(overlay_typepath::attached_body_zone)
if(!bodypart)
return null
+ if(locate(overlay_typepath) in bodypart.bodypart_overlays)
+ return null
+ var/datum/bodypart_overlay/simple/emote/overlay = new overlay_typepath()
bodypart.add_bodypart_overlay(overlay)
return overlay
diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm
index d29e5a59385..fca645e9158 100644
--- a/code/datums/components/material/material_container.dm
+++ b/code/datums/components/material/material_container.dm
@@ -720,7 +720,7 @@
continue
//now we can merge since we are done with it
for(var/obj/item/stack/item_stack in target)
- if(item_stack == new_stack || new_stack.type != type_to_retrieve) //don't merge with self or different type
+ if(item_stack == new_stack || item_stack.type != type_to_retrieve) //don't merge with self or different type
continue
//speed merge
var/merge_amount = min(item_stack.amount, new_stack.max_amount - new_stack.get_amount())
diff --git a/code/datums/components/shuttle_move_deferred_checks.dm b/code/datums/components/shuttle_move_deferred_checks.dm
index e7268fe98c0..3d05af66dd0 100644
--- a/code/datums/components/shuttle_move_deferred_checks.dm
+++ b/code/datums/components/shuttle_move_deferred_checks.dm
@@ -40,8 +40,6 @@
targets -= movable
moving_targets -= movable
UnregisterSignal(movable, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, COMSIG_QDELETING))
- if(!length(moving_targets) && length(targets))
- call_check()
return ..()
/datum/component/shuttle_move_deferred_checks/proc/call_check()
diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm
index 7f564d6fa04..f5347fab41c 100644
--- a/code/datums/mutations/antenna.dm
+++ b/code/datums/mutations/antenna.dm
@@ -68,10 +68,12 @@
if (!owner)
return
ADD_TRAIT(grant_to, TRAIT_MIND_READER, GENETIC_MUTATION)
+ RegisterSignal(grant_to, COMSIG_MOB_EXAMINATE, PROC_REF(on_examining))
/datum/action/cooldown/spell/pointed/mindread/Remove(mob/remove_from)
. = ..()
REMOVE_TRAIT(remove_from, TRAIT_MIND_READER, GENETIC_MUTATION)
+ UnregisterSignal(remove_from, COMSIG_MOB_EXAMINATE)
/datum/action/cooldown/spell/pointed/mindread/is_valid_target(atom/cast_on)
if(!isliving(cast_on))
@@ -83,12 +85,15 @@
if(living_cast_on.stat == DEAD)
to_chat(owner, span_warning("[cast_on] is dead!"))
return FALSE
+ if(living_cast_on.mob_biotypes & MOB_ROBOTIC)
+ to_chat(owner, span_warning("[cast_on] is robotic, you can't read [cast_on.p_their()] mind!"))
+ return FALSE
return TRUE
/datum/action/cooldown/spell/pointed/mindread/cast(mob/living/cast_on)
. = ..()
- if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0))
+ if(cast_on.can_block_magic(antimagic_flags, charge_cost = 0))
to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \
you are stopped by a mental blockage. It seems you've been foiled."))
return
@@ -102,21 +107,66 @@
you feel the overwhelming emptiness within. A truly evil being. \
[HAS_TRAIT(owner, TRAIT_EVIL) ? "It's nice to find someone who is like-minded." : "What is wrong with this person?"]"))
- to_chat(owner, span_boldnotice("You plunge into [cast_on]'s mind..."))
+ var/list/log_info = list()
+ var/list/discovered_info = list("You plunge into [cast_on]'s mind and discover...")
if(prob(20))
// chance to alert the read-ee
to_chat(cast_on, span_danger("You feel something foreign enter your mind."))
+ log_info += "Target alerted!"
var/list/recent_speech = cast_on.copy_recent_speech(copy_amount = 3, line_chance = 50)
if(length(recent_speech))
- to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations..."))
+ discovered_info += "...Drifting memories of past conversations:"
+ var/list/speech_block = list()
for(var/spoken_memory in recent_speech)
- to_chat(owner, span_notice("[spoken_memory]"))
+ speech_block += " \"[spoken_memory]\"..."
+ log_info += "Recent speech: \"[spoken_memory]\""
+ discovered_info += jointext(speech_block, "
")
if(iscarbon(cast_on))
var/mob/living/carbon/carbon_cast_on = cast_on
- to_chat(owner, span_boldnotice("You find that their intent is to [carbon_cast_on.combat_mode ? "harm" : "help"]..."))
- to_chat(owner, span_boldnotice("You uncover that [carbon_cast_on.p_their()] true identity is [carbon_cast_on.mind.name]."))
+ discovered_info += "...Intent to [carbon_cast_on.combat_mode ? "harm" : "help"]."
+ discovered_info += "...True identity of [carbon_cast_on.mind.name]."
+ log_info += "Intent: \"[carbon_cast_on.combat_mode ? "harm" : "help"]\""
+ log_info += "Identity: \"[carbon_cast_on.mind.name]\""
+
+ to_chat(owner, boxed_message(span_notice(jointext(discovered_info, "
"))))
+ log_combat(owner, cast_on, "mind read (cast intentionally)", null, "info: [english_list(log_info, and_text = ", ")]")
+
+/datum/action/cooldown/spell/pointed/mindread/proc/on_examining(mob/examiner, atom/examining)
+ SIGNAL_HANDLER
+ if(!isliving(examining) || examiner == examining)
+ return
+
+ INVOKE_ASYNC(src, PROC_REF(read_mind), examiner, examining)
+
+/datum/action/cooldown/spell/pointed/mindread/proc/read_mind(mob/living/examiner, mob/living/examined)
+ if(examined.stat >= UNCONSCIOUS || isnull(examined.mind) || (examined.mob_biotypes & MOB_ROBOTIC))
+ return
+
+ var/antimagic = examined.can_block_magic(antimagic_flags, charge_cost = 0)
+ var/read_text = ""
+ if(!antimagic)
+ read_text = examined.get_typing_text()
+ if(!read_text)
+ return
+
+ sleep(0.5 SECONDS) // small pause so it comes after all examine text and effects
+ if(QDELETED(examiner))
+ return
+ if(antimagic)
+ to_chat(examiner, boxed_message(span_warning("You attempt to analyze [examined]'s current thoughts, but fail to penetrate [examined.p_their()] mind - It seems you've been foiled.")))
+ return
+
+ var/list/log_info = list()
+ if(prob(10))
+ to_chat(examined, span_danger("You feel something foreign enter your mind."))
+ log_info += "Target alerted!"
+
+ to_chat(examiner, boxed_message(span_notice("You analyze [examined]'s current thoughts...
\"[read_text]\"...")))
+ log_info += "Current thought: \"[read_text]\""
+
+ log_combat(examiner, examined, "mind read (triggered on examine)", null, "info: [english_list(log_info, and_text = ", ")]")
/datum/mutation/mindreader/New(datum/mutation/copymut)
..()
diff --git a/code/datums/personality/personality_preference.dm b/code/datums/personality/personality_preference.dm
index c0965251d34..b33fe381806 100644
--- a/code/datums/personality/personality_preference.dm
+++ b/code/datums/personality/personality_preference.dm
@@ -20,6 +20,9 @@
if(!LAZYLEN(input))
return null
+ if(!SSpersonalities.initialized)
+ SSpersonalities.init_personalities()
+
var/list/input_sanitized
for(var/personality_key in input)
var/datum/personality/personality = SSpersonalities.personalities_by_key[personality_key]
diff --git a/code/datums/personality/reaction_to_recreation.dm b/code/datums/personality/reaction_to_recreation.dm
index b799dce815f..49bd1be3db3 100644
--- a/code/datums/personality/reaction_to_recreation.dm
+++ b/code/datums/personality/reaction_to_recreation.dm
@@ -31,7 +31,7 @@
if(!istype(new_area, /area/station/service))
return TRUE
// Service workers don't slack in service
- if(who.mind?.assigned_role.departments_bitflags & DEPARTMENT_SERVICE)
+ if(who.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_SERVICE)
return FALSE
return TRUE
@@ -42,7 +42,7 @@
desc = "I don't really feel like working today."
pos_gameplay_desc = "Happy in the bar or recreation areas"
mood_event_type = /datum/mood_event/slacking_off_lazy
- groups = list(PERSONALITY_GROUP_INTERACTION, PERSONALITY_GROUP_WORK, PERSONALITY_GROUP_ATHLETICS)
+ groups = list(PERSONALITY_GROUP_RECREATION, PERSONALITY_GROUP_WORK, PERSONALITY_GROUP_ATHLETICS)
/datum/personality/slacking/diligent
savefile_key = "diligent"
@@ -51,7 +51,7 @@
pos_gameplay_desc = "Happy when in their department"
neg_gameplay_desc = "Unhappy when slacking off in the bar or recreation areas"
mood_event_type = /datum/mood_event/slacking_off_diligent
- groups = list(PERSONALITY_GROUP_INTERACTION)
+ groups = list(PERSONALITY_GROUP_RECREATION)
/datum/personality/slacking/diligent/apply_to_mob(mob/living/who)
. = ..()
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index cf7209b3180..239c7204484 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -566,20 +566,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
return
/obj/effect/landmark/start/hangover/JoinPlayerHere(mob/joining_mob, buckle)
- . = ..()
- make_hungover(joining_mob)
-
-/obj/effect/landmark/start/hangover/closet
- name = "hangover spawn closet"
- icon_state = "hangover_spawn_closet"
-
-/obj/effect/landmark/start/hangover/closet/JoinPlayerHere(mob/joining_mob, buckle)
- . = ..()
+ var/mob/created_joining_mob = ..()
+ make_hungover(created_joining_mob)
for(var/obj/structure/closet/closet in get_turf(src))
if(closet.opened)
continue
- joining_mob.forceMove(closet)
- return
+ created_joining_mob.forceMove(closet)
+ return created_joining_mob
+ return created_joining_mob
//Landmark that creates destinations for the navigate verb to path to
/obj/effect/landmark/navigate_destination
diff --git a/code/game/objects/items/devices/scanners/plant_analyzer.dm b/code/game/objects/items/devices/scanners/plant_analyzer.dm
index fcce33141df..857454fb7fc 100644
--- a/code/game/objects/items/devices/scanners/plant_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/plant_analyzer.dm
@@ -262,16 +262,16 @@
if(graft)
last_scan_data["graft_data"] = list(
- "name" = graft.parent_name,
+ "name" = graft.plant_dna.name,
"icon" = graft.icon,
"icon_state" = graft.icon_state,
- "yield" = graft.yield,
- "production" = graft.production,
- "lifespan" = graft.lifespan,
- "endurance" = graft.endurance,
- "weed_rate" = graft.weed_rate,
- "weed_chance" = graft.weed_chance,
- "graft_gene" = graft.stored_trait.type,
+ "yield" = graft.plant_dna.yield,
+ "production" = graft.plant_dna.production,
+ "lifespan" = graft.plant_dna.lifespan,
+ "endurance" = graft.plant_dna.endurance,
+ "weed_rate" = graft.plant_dna.weed_rate,
+ "weed_chance" = graft.plant_dna.weed_chance,
+ "graft_gene" = graft.plant_dna.graft_gene.type
)
if(user)
diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm
index 3067be08f43..305ecf611fc 100644
--- a/code/game/objects/structures/lavaland/ore_vent.dm
+++ b/code/game/objects/structures/lavaland/ore_vent.dm
@@ -496,6 +496,42 @@
log_game("Vent-spawned mob [key_name_and_tag(killed)] was killed")
SSblackbox.record_feedback("tally", "ore_vent_mobs_killed", 1, killed.type)
+/**
+ * The part of initialization and the ore_generation subsystem's setup that assigns the size of an ore_vent and it's boulders.
+ * @param random: Used for random sized boulders, and the standard (pre 9-6-2025) behavior.
+ * @param force_size: An override we use for map_generation, when we know what size boulder we need from this ore vent already. Use the standard ore_vent size defines.
+ */
+/obj/structure/ore_vent/proc/vent_size_setup(random = FALSE, force_size, map_loading)
+ var/string_boulder_size
+
+ if(force_size)
+ string_boulder_size = force_size
+
+ else if(random)
+ string_boulder_size = pick_weight(ore_vent_options)
+
+ name = "[string_boulder_size] ore vent"
+ switch(string_boulder_size)
+ if(LARGE_VENT_TYPE)
+ boulder_size = BOULDER_SIZE_LARGE
+ wave_timer = WAVE_DURATION_LARGE
+ if(map_loading)
+ GLOB.ore_vent_sizes["large"] += 1
+ if(MEDIUM_VENT_TYPE)
+ boulder_size = BOULDER_SIZE_MEDIUM
+ wave_timer = WAVE_DURATION_MEDIUM
+ if(map_loading)
+ GLOB.ore_vent_sizes["medium"] += 1
+ if(SMALL_VENT_TYPE)
+ boulder_size = BOULDER_SIZE_SMALL
+ wave_timer = WAVE_DURATION_SMALL
+ if(map_loading)
+ GLOB.ore_vent_sizes["small"] += 1
+ else
+ boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value
+ wave_timer = WAVE_DURATION_SMALL
+ name = initial(name)
+
//comes with the station, and is already tapped.
/obj/structure/ore_vent/starter_resources
name = "active ore vent"
@@ -510,6 +546,7 @@
)
/obj/structure/ore_vent/random
+ // Todo: determine if we need a boulder_size default thats unique from the override performed in vent_size_setup.
/obj/structure/ore_vent/random/Initialize(mapload)
. = ..()
@@ -517,29 +554,8 @@
generate_mineral_breakdown(map_loading = mapload) //Default to random mineral breakdowns, unless this is a unique vent or we're still setting up default vent distribution.
generate_description()
artifact_chance = rand(0, MAX_ARTIFACT_ROLL_CHANCE)
- var/string_boulder_size = pick_weight(ore_vent_options)
- name = "[string_boulder_size] ore vent"
- switch(string_boulder_size)
- if(LARGE_VENT_TYPE)
- boulder_size = BOULDER_SIZE_LARGE
- wave_timer = WAVE_DURATION_LARGE
- if(mapload)
- GLOB.ore_vent_sizes["large"] += 1
- if(MEDIUM_VENT_TYPE)
- boulder_size = BOULDER_SIZE_MEDIUM
- wave_timer = WAVE_DURATION_MEDIUM
- if(mapload)
- GLOB.ore_vent_sizes["medium"] += 1
- if(SMALL_VENT_TYPE)
- boulder_size = BOULDER_SIZE_SMALL
- wave_timer = WAVE_DURATION_SMALL
- if(mapload)
- GLOB.ore_vent_sizes["small"] += 1
- else
- boulder_size = BOULDER_SIZE_SMALL //Might as well set a default value
- wave_timer = WAVE_DURATION_SMALL
- name = initial(name)
-
+ if(!mapload)
+ vent_size_setup(random = TRUE) // We only do this here specific to random distribution ore vents, and within mapload we handle this manually within SSore_generation.
/obj/structure/ore_vent/random/icebox //The one that shows up on the top level of icebox
@@ -642,6 +658,20 @@
/mob/living/simple_animal/hostile/megafauna/colossus,
)
+/obj/effect/landmark/mining_center
+ name = "Mining Epicenter"
+ icon_state = "mining_epicenter"
+
+/obj/effect/landmark/mining_center/Initialize(mapload)
+ ..()
+
+ for(var/obj/mining_mark as anything in GLOB.mining_center)
+ if(src.z == mining_mark.z)
+ CRASH("\The [src] spawned on Z level [z] already exists! Maps should only have at most one mining epicenter for normal ore generation.")
+
+ GLOB.mining_center += loc
+ return INITIALIZE_HINT_QDEL
+
#undef MAX_ARTIFACT_ROLL_CHANCE
#undef MINERAL_TYPE_OPTIONS_RANDOM
#undef OVERLAY_OFFSET_START
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 474efa4f973..efbb6b3fbf0 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -20,6 +20,7 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pixel_y = 22
appearance_flags = KEEP_TOGETHER
+ vis_flags = VIS_INHERIT_PLANE
/// The current occupant being presented
var/mob/living/occupant
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 0b935f9fa36..f7f868f7ba9 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -4,6 +4,7 @@
/datum/supply_pack/organic/hydroponics
access_view = ACCESS_HYDROPONICS
+ crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/beekeeping_suits
name = "Beekeeper Suit Crate"
@@ -125,7 +126,7 @@
crate_type = /obj/structure/closet/crate/secure
discountable = SUPPLY_PACK_RARE_DISCOUNTABLE
-/datum/supply_pack/organic/hydroponics
+/datum/supply_pack/organic/hydroponics/supplies
name = "Hydroponics Crate"
desc = "Supplies for growing a great garden! Contains two bottles of ammonia, \
two Plant-B-Gone spray bottles, a hatchet, cultivator, plant analyzer, \
@@ -140,7 +141,6 @@
/obj/item/clothing/suit/apron,
)
crate_name = "hydroponics crate"
- crate_type = /obj/structure/closet/crate/hydroponics
/datum/supply_pack/organic/hydroponics/hydrotank
name = "Hydroponics Backpack Crate"
@@ -396,3 +396,50 @@
contains = list(/obj/structure/reagent_dispensers/servingdish)
crate_name = "nutraslop serving dish crate"
+
+/datum/supply_pack/organic/hydroponics/soil_normal
+ name = "NT-Ag Potting Soil Crate"
+ desc = "A crate containing sacks of regular, commercial soil."
+ cost = CARGO_CRATE_VALUE * 2
+ crate_name = "potting soil crate"
+ contains = list(
+ /obj/item/soil_sack = 5,
+ )
+
+/datum/supply_pack/organic/hydroponics/soil_vermaculite
+ name = "NT-Ag Vermaculite Crate"
+ desc = "A crate containing sacks of NT-Ag vermaculite. Your favorite expanded mineral!"
+ cost = CARGO_CRATE_VALUE * 2
+ crate_name = "vermaculite crate"
+ contains = list(
+ /obj/item/soil_sack/vermaculite = 3,
+ )
+
+/datum/supply_pack/organic/hydroponics/soil_gel
+ name = "NT-Ag Hydrogel Beads Crate"
+ desc = "A crate containing sacks of prehydrated superabsorbent gel beads. Everyone likes some nice beads."
+ cost = CARGO_CRATE_VALUE * 2
+ crate_name = "hydrogel beads crate"
+ contains = list(
+ /obj/item/soil_sack/gel = 3,
+ )
+
+
+/datum/supply_pack/organic/hydroponics/soil_coir
+ name = "NT-Ag Korta Coir Crate"
+ desc = "A crate containing sacks of korta root coir. Good for starting a mushroom farm!"
+ cost = CARGO_CRATE_VALUE * 3
+ crate_name = "korta coir crate"
+ contains = list(
+ /obj/item/soil_sack/coir = 3,
+ )
+
+/datum/supply_pack/organic/hydroponics/soil_worm
+ name = "NT-Ag Worm Castings Crate"
+ desc = "A crate containing sacks of vermicompost. Worms not included! Or?.."
+ cost = CARGO_CRATE_VALUE * 4
+ crate_name = "worm castings crate"
+ contains = list(
+ /obj/item/soil_sack/worm = 3,
+ )
+
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index da5760ccde0..82550085236 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -167,9 +167,10 @@
/obj/item/clothing/under/equipped(mob/living/user, slot)
..()
- if((slot & ITEM_SLOT_ICLOTHING) && freshly_laundered)
- freshly_laundered = FALSE
- user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
+ if(slot & ITEM_SLOT_ICLOTHING)
+ if(freshly_laundered)
+ freshly_laundered = FALSE
+ user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
update_wearer_status()
/obj/item/clothing/under/dropped(mob/living/user)
diff --git a/code/modules/hydroponics/grafts.dm b/code/modules/hydroponics/grafts.dm
index 822169a8aef..35abfb08cfc 100644
--- a/code/modules/hydroponics/grafts.dm
+++ b/code/modules/hydroponics/grafts.dm
@@ -10,39 +10,30 @@
worn_icon_state = "graft"
attack_verb_continuous = list("plants", "vegitizes", "crops", "reaps", "farms")
attack_verb_simple = list("plant", "vegitize", "crop", "reap", "farm")
- ///The stored trait taken from the parent plant. Defaults to perenial growth.
- var/datum/plant_gene/stored_trait
- ///Determines the appearance of the graft. Rudimentary right now so it just picks randomly.
- var/graft_appearance
- /// The name of the plant this was taken from.
- var/parent_name = ""
- ///The lifespan stat of the parent seed when the graft was taken.
- var/lifespan
- ///The endurance stat of the parent seed when the graft was taken.
- var/endurance
- ///The production stat of the parent seed when the graft was taken.
- var/production
- ///The weed_rate stat of the parent seed when the graft was taken.
- var/weed_rate
- ///The weed_chance stat of the parent seed when the graft was taken.
- var/weed_chance
- ///The yield stat of the parent seed when the graft was taken.
- var/yield
+ /// Our internal seed used to modify stats or genes by grafting or passed as our seed when propagating vegetatively,
+ var/obj/item/seeds/plant_dna = /obj/item/seeds/apple
-
-/obj/item/graft/Initialize(mapload, datum/plant_gene/trait/trait_path)
+/obj/item/graft/Initialize(mapload, obj/item/seeds/mother_plant)
. = ..()
- //Default gene is repeated harvest.
- if(trait_path)
- stored_trait = new trait_path
- else
- stored_trait = new /datum/plant_gene/trait/repeated_harvest
+ //create our "plant dna" internal seed from the plant the cuttings are taken from.
+ if(mother_plant)
+ if(ispath(mother_plant))
+ plant_dna = new mother_plant()
+ if(!istype(plant_dna))
+ CRASH("Tried to create a graft using a non-seed path.")
+ else if(istype(mother_plant))
+ plant_dna = mother_plant.Copy()
+ else
+ CRASH("Tried to create a graft using a non-seed reference.")
+
icon_state = pick(
10 ; "graft_plant" , \
5 ; "graft_flower" , \
4 ; "graft_mushroom" , \
1 ; "graft_doom" )
+ name += " ([plant_dna.plantname])"
+
var/static/list/hovering_item_typechecks = list(
/obj/item/plant_analyzer = list(
SCREENTIP_CONTEXT_LMB = "Scan graft",
@@ -50,7 +41,3 @@
)
AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
-
-/obj/item/graft/Destroy()
- QDEL_NULL(stored_trait)
- return ..()
diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm
index f1fdfe807ef..0ebb2734b2f 100644
--- a/code/modules/hydroponics/grown/cereals.dm
+++ b/code/modules/hydroponics/grown/cereals.dm
@@ -61,6 +61,8 @@
product = /obj/item/food/grown/rice
mutatelist = null
growthstages = 3
+ genes = list(/datum/plant_gene/trait/semiaquatic)
+
/obj/item/food/grown/rice
seed = /obj/item/seeds/wheat/rice
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
index a9be7fc2c2f..10344bb82bd 100644
--- a/code/modules/hydroponics/grown/potato.dm
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -14,7 +14,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_grow = "potato-grow"
icon_dead = "potato-dead"
- genes = list(/datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite)
+ genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/battery, /datum/plant_gene/trait/one_bite)
mutatelist = list(/obj/item/seeds/potato/sweet)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
graft_gene = /datum/plant_gene/trait/battery
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index 201fdd1a660..e888738fb60 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -14,6 +14,7 @@
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
mutatelist = list(/obj/item/seeds/carrot/parsnip, /obj/item/seeds/carrot/cahnroot)
reagents_add = list(/datum/reagent/medicine/oculine = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05)
+ genes = list(/datum/plant_gene/trait/soil_lover)
/obj/item/food/grown/carrot
seed = /obj/item/seeds/carrot
@@ -91,7 +92,7 @@
species = "cahn'root"
plantname = "Cahn'root"
product = /obj/item/food/grown/cahnroot
- genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
+ genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/plant_type/weed_hardy)
endurance = 50
instability = 10
icon_dead = "cahn'root-dead"
@@ -142,6 +143,7 @@
instability = 10
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_dead = "whitebeet-dead"
+ genes = list(/datum/plant_gene/trait/soil_lover)
mutatelist = list(/obj/item/seeds/redbeet)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/sugar = 0.2, /datum/reagent/consumable/nutriment = 0.05)
@@ -168,7 +170,7 @@
instability = 15
growing_icon = 'icons/obj/service/hydroponics/growing_vegetables.dmi'
icon_dead = "whitebeet-dead"
- genes = list(/datum/plant_gene/trait/maxchem)
+ genes = list(/datum/plant_gene/trait/soil_lover, /datum/plant_gene/trait/maxchem)
reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05)
graft_gene = /datum/plant_gene/trait/maxchem
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 00d01c9732d..52ad4cb41ce 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -61,6 +61,11 @@
var/light_level = 0
///our snail overlay, if any
var/obj/effect/overlay/vis_effect/snail/our_snail
+ ///Flags to indicate special tray type behaviours.
+ var/tray_flags = HYDROPONIC
+ ///How many extra px to offset the plant sprite on the y axis, gets passed to the seed and added to the seeds offset
+ var/plant_offset_y = 0
+
/obj/machinery/hydroponics/Initialize(mapload)
//ALRIGHT YOU DEGENERATES. YOU HAD REAGENT HOLDERS FOR AT LEAST 4 YEARS AND NONE OF YOU MADE HYDROPONICS TRAYS HOLD NUTRIENT CHEMS INSTEAD OF USING "Points".
@@ -344,11 +349,11 @@
if(world.time > (lastcycle + cycledelay))
lastcycle = world.time
if(myseed && plant_status != HYDROTRAY_PLANT_DEAD)
- // Advance age
- age++
+ var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)
+ // Advance age, if planted in mushroom friendly soil and we are a mushroom we mature 40% faster.
+ age += 1 * (is_fungus && (tray_flags & FAST_MUSHROOMS)) ? FAST_MUSH_MODIFIER : 1
if(age < myseed.maturation)
lastproduce = age
-
needs_update = TRUE
@@ -360,22 +365,25 @@
else
reagents.remove_all(nutridrain)
- // Lack of nutrients hurts non-weeds
- if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
- adjust_plant_health(-rand(1,3))
+ if(reagents.total_volume <= 0)
+ //The microbiome slowly create nutrients by fixing nitrogen from the air or metabolizing organic matter.
+ if(tray_flags & SLOW_RELEASE)
+ reagents.add_reagent(/datum/reagent/nitrogen, 1) // In reality the nitrogen is in the form of ammonia or nitrates but this might be too OP and boring.
+ // Lack of nutrients hurts non-weeds
+ else if(!myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
+ adjust_plant_health(-rand(1,3))
//Photosynthesis/////////////////////////////////////////////////////////
// Lack of light hurts non-mushrooms
- var/is_fungus = myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)
if(light_level < (is_fungus ? 0.2 : 0.4))
adjust_plant_health((is_fungus ? -1 : -2) / rating)
//Water//////////////////////////////////////////////////////////////////
// Drink random amount of water
- adjust_waterlevel(-rand(1,6) / rating)
+ adjust_waterlevel(-rand(1,6) * ((tray_flags & SUPERWATER) ? SUPER_WATER_MODIFIER : 1) / rating )
// If the plant is dry, it loses health pretty fast, unless mushroom
- if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism))
+ if(waterlevel <= 10 && !is_fungus)
adjust_plant_health(-rand(0,1) / rating)
if(waterlevel <= 0)
adjust_plant_health(-rand(0,2) / rating)
@@ -428,7 +436,7 @@
if(weedlevel >= 5 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy))
if(myseed.yield >= 3)
myseed.adjust_yield(-rand(1,2)) //Weeds choke out the plant's ability to bear more fruit.
- myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
+ myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
//This is the part with pollination
pollinate()
@@ -475,7 +483,7 @@
if(weedlevel >= 10 && prob(50) && !self_sustaining) // At this point the plant is kind of fucked. Weeds can overtake the plant spot.
if(myseed && myseed.yield >= 3)
myseed.adjust_yield(-rand(1,2)) //Loses even more yield per tick, quickly dropping to 3 minimum.
- myseed.set_yield(min((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
+ myseed.set_yield(clamp((myseed.yield), WEED_HARDY_YIELD_MIN, MAX_PLANT_YIELD))
if(!myseed)
weedinvasion()
needs_update = 1
@@ -508,7 +516,7 @@
/obj/machinery/hydroponics/update_overlays()
. = ..()
if(myseed)
- . += myseed.get_tray_overlay(age, plant_status)
+ . += myseed.get_tray_overlay(age, plant_status, plant_offset_y)
. += update_status_light_overlays()
if(self_sustaining && self_sustaining_overlay_icon_state)
@@ -667,8 +675,12 @@
* Raises the plant's weed level stat by a given amount.
* * adjustamt - Determines how much the weed level will be adjusted upwards or downwards.
*/
-/obj/machinery/hydroponics/proc/adjust_weedlevel (amt)
- set_weedlevel(clamp(weedlevel + amt, 0, MAX_TRAY_WEEDS), FALSE)
+/obj/machinery/hydroponics/proc/adjust_weedlevel(amt)
+ var/weed_mod = 1
+ //If we are not a soil type tray and out plant is semiaquatic, increase weed.
+ if(!(tray_flags & SOIL) && myseed?.get_gene(/datum/plant_gene/trait/semiaquatic))
+ weed_mod *= SEMIAQUATIC_SOIL_WEED_MALUS
+ set_weedlevel(clamp(weedlevel + amt * weed_mod, 0, MAX_TRAY_WEEDS), FALSE)
/obj/machinery/hydroponics/examine(user)
. = ..()
@@ -793,13 +805,14 @@
* Plant Death Proc.
* Cleans up various stats for the plant upon death, including pests, harvestability, and plant health.
*/
-/obj/machinery/hydroponics/proc/plantdies()
+/obj/machinery/hydroponics/proc/plantdies(update_icon = TRUE)
set_plant_health(0, update_icon = FALSE, forced = TRUE)
set_plant_status(HYDROTRAY_PLANT_DEAD)
set_pestlevel(0, update_icon = FALSE) // Pests die
lastproduce = 0
- update_appearance()
SEND_SIGNAL(src, COMSIG_HYDROTRAY_PLANT_DEATH)
+ if(update_icon)
+ update_appearance()
/**
* Plant Cross-Pollination.
@@ -879,6 +892,11 @@
visi_msg="[user] composts [reagent_source], spreading it through [target]"
transfer_amount = reagent_source.reagents.total_volume
SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user)
+ if((tray_flags & WORM_HABITAT) && prob(transfer_amount / 2))
+ var/obj/item/food/bait/worm/premium/fat_worm = new(loc)
+ fat_worm.pixel_x = rand(-6,6)
+ fat_worm.pixel_y = rand(-6,6)
+ playsound(fat_worm, 'sound/items/eatfood.ogg', 20, TRUE)
else
transfer_amount = min(reagent_source.amount_per_transfer_from_this, reagent_source.reagents.total_volume)
if(istype(reagent_source, /obj/item/reagent_containers/syringe/))
@@ -919,21 +937,8 @@
return 1
else if(istype(O, /obj/item/seeds))
- if(!myseed)
- if(istype(O, /obj/item/seeds/kudzu))
- investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY)
- if(!user.transferItemToLoc(O, src))
- return
- SEND_SIGNAL(O, COMSIG_SEED_ON_PLANTED, src)
- to_chat(user, span_notice("You plant [O]."))
- set_seed(O)
- set_plant_health(myseed.endurance)
- lastcycle = world.time
- return
- else
- to_chat(user, span_warning("[src] already has seeds in it!"))
- return
-
+ propagate_plant(O, user)
+ return
else if(istype(O, /obj/item/cultivator))
if(weedlevel > 0)
user.visible_message(span_notice("[user] uproots the weeds."), span_notice("You remove the weeds from [src]."))
@@ -950,8 +955,8 @@
else if(plant_status != HYDROTRAY_PLANT_HARVESTABLE)
to_chat(user, span_notice("This plant must be harvestable in order to be grafted."))
return
- else if(myseed.grafted)
- to_chat(user, span_notice("This plant has already been grafted."))
+ else if(myseed.grafts_taken >= ((tray_flags & MULTIGRAFT) ? MULTI_GRAFT_MAX_COUNT : 1))
+ to_chat(user, span_notice("You can't take any more cuttings from this plant!"))
return
else
user.visible_message(span_notice("[user] grafts off a limb from [src]."), span_notice("You carefully graft off a portion of [src]."))
@@ -960,7 +965,7 @@
return // The plant did not return a graft.
snip.forceMove(drop_location())
- myseed.grafted = TRUE
+ myseed.grafts_taken++
adjust_plant_health(-5)
return
@@ -1003,12 +1008,17 @@
else if(istype(O, /obj/item/graft))
var/obj/item/graft/snip = O
if(!myseed)
+ if(tray_flags & GRAFT_MEDIUM)
+ propagate_plant(snip.plant_dna, user)
+ qdel(snip)
+ return
to_chat(user, span_notice("The tray is empty."))
return
- if(myseed.apply_graft(snip))
- to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [snip.stored_trait.get_name()]."))
+ var/datum/plant_gene/grafted_trait = myseed.apply_graft(snip)
+ if(grafted_trait)
+ to_chat(user, span_notice("You carefully integrate the grafted plant limb onto [myseed.plantname], granting it [grafted_trait.get_name()]."))
else
- to_chat(user, span_notice("You integrate the grafted plant limb onto [myseed.plantname], but it does not accept the [snip.stored_trait.get_name()] trait from the [snip]."))
+ to_chat(user, span_notice("You try to integrate the grafted plant limb onto [myseed.plantname], but it rejects the trait from the [snip]."))
qdel(snip)
return
@@ -1030,11 +1040,7 @@
span_notice("You start digging out [src]'s plants..."))
if(O.use_tool(src, user, 50, volume=50) || (!myseed && !weedlevel))
user.visible_message(span_notice("[user] digs out the plants in [src]!"), span_notice("You dig out all of [src]'s plants!"))
- if(myseed) //Could be that they're just using it as a de-weeder
- set_plant_health(0, update_icon = FALSE, forced = TRUE)
- lastproduce = 0
- set_seed(null)
- set_weedlevel(0) //Has a side effect of cleaning up those nasty weeds
+ remove_plant()
return
else if(istype(O, /obj/item/gun/energy/floragun))
var/obj/item/gun/energy/floragun/flowergun = O
@@ -1167,54 +1173,33 @@
var/mob/living/C = new chosen(get_turf(src))
C.faction = list(FACTION_PLANTS)
-///////////////////////////////////////////////////////////////////////////////
-/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
- name = "soil"
- desc = "A patch of dirt."
- icon = 'icons/obj/service/hydroponics/equipment.dmi'
- icon_state = "soil"
- gender = PLURAL
- circuit = null
- density = FALSE
- use_power = NO_POWER_USE
- unwrenchable = FALSE
- self_sustaining_overlay_icon_state = null
- maxnutri = 15
+/// Plants the seed / graft into the tray and resets growth related stats such as maturity on the tray.
+/obj/machinery/hydroponics/proc/propagate_plant(obj/item/seeds/young_plant, mob/living/user)
+ if(!istype(young_plant))
+ return
+ if(myseed)
+ to_chat(user, span_warning("[src] already has a plant growing in it!"))
+ return
+ if(istype(young_plant, /obj/item/seeds/kudzu))
+ investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY)
+ if(!user.transferItemToLoc(young_plant, src))
+ return
+ SEND_SIGNAL(young_plant, COMSIG_SEED_ON_PLANTED, src)
+ to_chat(user, span_notice("You plant [young_plant]."))
+ set_seed(young_plant)
+ set_plant_health(myseed.endurance)
+ lastcycle = world.time
-/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver)
- return NONE
-
-/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct)
- return NONE
-
-/obj/machinery/hydroponics/soil/update_icon(updates=ALL)
- . = ..()
- if(self_sustaining)
- add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY)
-
-/obj/machinery/hydroponics/soil/update_status_light_overlays()
- return // Has no lights
-
-/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
- if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click
- return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
- balloon_alert(user, "clearing up soil...")
- if(weapon.use_tool(src, user, 1 SECONDS, volume=50))
- balloon_alert(user, "cleared")
- deconstruct(disassembled = TRUE)
- return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-
-/obj/machinery/hydroponics/soil/click_ctrl(mob/user)
- return CLICK_ACTION_BLOCKING //Soil has no electricity.
-
-/obj/machinery/hydroponics/soil/on_deconstruction(disassembled)
- new /obj/item/stack/ore/glass(drop_location(), 3)
-
-/obj/machinery/hydroponics/soil/rich
- name = "rich soil"
- desc = "A rich patch of dirt, usually used in gardens."
- icon_state = "rich_soil"
- maxnutri = 20
+/// Clears the plant from the tray, killing it in the process, optionally clearing weeds as well.
+/obj/machinery/hydroponics/proc/remove_plant(clear_weeds = TRUE)
+ if(!myseed)
+ return
+ plantdies(FALSE)
+ if(clear_weeds)
+ set_weedlevel(0, FALSE)
+ if(self_sustaining) //No reason to pay for an empty tray.
+ set_self_sustaining(FALSE)
+ set_seed(null)
///The usb port circuit
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 02cbcd37ffc..6a2f6cccdc5 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -988,3 +988,21 @@
/datum/plant_gene/trait/plant_type/alien_properties
name ="?????"
icon = FA_ICON_DISEASE
+
+/datum/plant_gene/trait/carnivory
+ name = "Obligate Carnivory"
+ description = "Pests have positive effect on the plant health."
+ icon = FA_ICON_SPIDER
+
+/datum/plant_gene/trait/semiaquatic
+ name = "Semiaquatic"
+ description = "A type of plant that thrives in flooded conditions due to less competion from weeds, but can also grow on land."
+ icon = FA_ICON_BOWL_RICE
+ mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
+
+/datum/plant_gene/trait/soil_lover
+ name = "Soil Lover"
+ description = "A plant that needs the firm embrace of soil to develop properly, produces small irregular produce when grown hydroponically."
+ icon = FA_ICON_MOUND
+ mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE
+
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 64939d4ac87..c4ba18b1ecc 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -58,10 +58,10 @@
var/weed_rate = 1
///Percentage chance per tray update to grow weeds
var/weed_chance = 5
- ///Determines if the plant has had a graft removed or not.
- var/grafted = FALSE
+ ///How many grafts or cuttings have been taken from this plant.
+ var/grafts_taken = 0
///Type-path of trait to be applied when grafting a plant.
- var/graft_gene
+ var/datum/plant_gene/graft_gene = /datum/plant_gene/trait/repeated_harvest
///Determines if the plant should be allowed to mutate early at 30+ instability.
var/seed_flags = MUTATE_EARLY
@@ -198,19 +198,22 @@
// Harvest procs
/obj/item/seeds/proc/getYield()
var/return_yield = yield
-
+ var/obj/machinery/hydroponics/parent = loc
+ // Handle hydroponics malus for soil lovers like rootcrops.
+ if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover))
+ return_yield *= SOIL_LOVER_HYDRO_YIELD_MALUS
+ // Determine if the plant should get a yield bonus from bee pollination.
for(var/datum/plant_gene/trait/trait in genes)
if(trait.trait_flags & TRAIT_NO_POLLINATION)
return return_yield
- var/obj/machinery/hydroponics/parent = loc
if(istype(loc, /obj/machinery/hydroponics))
if(parent.yieldmod == 0)
return_yield = min(return_yield, 1)//1 if above zero, 0 otherwise
else
return_yield *= (parent.yieldmod)
- return return_yield
+ return round(return_yield)
/obj/item/seeds/proc/harvest(mob/user)
@@ -247,7 +250,13 @@
t_prod.seed.set_instability(round(instability * 0.5))
continue
else
- t_prod = new product(output_loc, new_seed = src)
+ // Create a descendent seed so we can modify our offspring before creating a grown from it.
+ var/obj/item/seeds/descendent_seed = Copy()
+ // Cuck potency if a soil lover such as a root crop is grown in water.
+ if(!(parent.tray_flags & SOIL) && get_gene(/datum/plant_gene/trait/soil_lover))
+ descendent_seed.set_potency(round(potency * RANDOM_DECIMAL(SOIL_LOVER_HYDRO_POTENCY_MIN, SOIL_LOVER_HYDRO_POTENCY_MAX)))
+
+ t_prod = new product(output_loc, new_seed = descendent_seed)
if(parent.myseed.plantname != initial(parent.myseed.plantname))
t_prod.name = LOWER_TEXT(parent.myseed.plantname)
if(productdesc)
@@ -564,24 +573,11 @@
* Creates a graft from this plant.
*
* Creates a new graft from this plant.
- * Sets the grafts trait to this plants graftable trait.
- * Gives the graft a reference to this plant.
- * Copies all the relevant stats from this plant to the graft.
+ * Passes this plant to the new graft so it can make a copy.
* Returns the created graft.
*/
/obj/item/seeds/proc/create_graft()
- var/obj/item/graft/snip = new(loc, graft_gene)
- snip.parent_name = plantname
- snip.name += " ([plantname])"
-
- // Copy over stats so the graft can outlive its parent.
- snip.lifespan = lifespan
- snip.endurance = endurance
- snip.production = production
- snip.weed_rate = weed_rate
- snip.weed_chance = weed_chance
- snip.yield = yield
-
+ var/obj/item/graft/snip = new(loc, src)
return snip
/**
@@ -596,25 +592,25 @@
* - [snip][/obj/item/graft]: The graft being used applied to this plant.
*/
/obj/item/seeds/proc/apply_graft(obj/item/graft/snip)
- . = TRUE
- var/datum/plant_gene/new_trait = snip.stored_trait
+ var/datum/plant_gene/new_trait = snip.plant_dna.graft_gene || /datum/plant_gene/trait/repeated_harvest
+ new_trait = new new_trait()
if(new_trait?.can_add(src))
- genes += new_trait.Copy()
+ genes += new_trait
else
- . = FALSE
+ return
// Adjust stats based on graft stats
- set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.lifespan - lifespan)))))
- set_endurance(round(max(endurance, (endurance + (2/3)*(snip.endurance - endurance)))))
- set_production(round(max(production, (production + (2/3)*(snip.production - production)))))
- set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.weed_rate - weed_rate)))))
- set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.weed_chance - weed_chance)))))
- set_yield(round(max(yield, (yield + (2/3)*(snip.yield - yield)))))
+ set_lifespan(round(max(lifespan, (lifespan + (2/3)*(snip.plant_dna.lifespan - lifespan)))))
+ set_endurance(round(max(endurance, (endurance + (2/3)*(snip.plant_dna.endurance - endurance)))))
+ set_production(round(max(production, (production + (2/3)*(snip.plant_dna.production - production)))))
+ set_weed_rate(round(max(weed_rate, (weed_rate + (2/3)*(snip.plant_dna.weed_rate - weed_rate)))))
+ set_weed_chance(round(max(weed_chance, (weed_chance+ (2/3)*(snip.plant_dna.weed_chance - weed_chance)))))
+ set_yield(round(max(yield, (yield + (2/3)*(snip.plant_dna.yield - yield)))))
// Add in any reagents, too.
reagents_from_genes()
-
- return
+ // Return the new trait so the tray can know we were successful and display its name.
+ return new_trait
/*
* Both `/item/food/grown` and `/item/grown` implement a seed variable which tracks
@@ -659,7 +655,7 @@
reagents_from_genes()
/// Returns a mutable appearance to be used as an overlay for the plant in hydro trays.
-/obj/item/seeds/proc/get_tray_overlay(age, status)
+/obj/item/seeds/proc/get_tray_overlay(age, status, tray_offset)
var/mutable_appearance/plant_overlay = mutable_appearance(growing_icon, layer = OBJ_LAYER + 0.01)
switch(status)
if(HYDROTRAY_PLANT_DEAD)
@@ -669,7 +665,7 @@
else
var/t_growthstate = clamp(round((age / maturation) * growthstages), 1, growthstages)
plant_overlay.icon_state = "[icon_grow][t_growthstate]"
- plant_overlay.pixel_z = plant_icon_offset
+ plant_overlay.pixel_z = plant_icon_offset + tray_offset
return plant_overlay
/// Called when the seed is set in a tray
diff --git a/code/modules/hydroponics/soil.dm b/code/modules/hydroponics/soil.dm
new file mode 100644
index 00000000000..0d23f2242d8
--- /dev/null
+++ b/code/modules/hydroponics/soil.dm
@@ -0,0 +1,235 @@
+
+///////////////////////////////////////////////////////////////////////////////
+/obj/machinery/hydroponics/soil //Not actually hydroponics at all! Honk!
+ name = "soil"
+ desc = "A patch of dirt."
+ icon = 'icons/obj/service/hydroponics/equipment.dmi'
+ icon_state = "soil"
+ gender = PLURAL
+ circuit = null
+ density = FALSE
+ use_power = NO_POWER_USE
+ unwrenchable = FALSE
+ self_sustaining_overlay_icon_state = null
+ maxnutri = 15
+ tray_flags = SOIL
+ armor_type = /datum/armor/obj_soil
+ //which type of sack to create when shovled.
+ var/sack_type = /obj/item/soil_sack
+
+/obj/machinery/hydroponics/soil/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver)
+ return NONE
+
+/obj/machinery/hydroponics/soil/default_deconstruction_crowbar(obj/item/crowbar, ignore_panel, custom_deconstruct)
+ return NONE
+
+/obj/machinery/hydroponics/soil/update_icon(updates=ALL)
+ . = ..()
+ if(self_sustaining)
+ add_atom_colour(rgb(255, 175, 0), FIXED_COLOUR_PRIORITY)
+
+/obj/machinery/hydroponics/soil/update_status_light_overlays()
+ return // Has no lights
+
+/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
+ if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+ balloon_alert(user, "digging up soil...")
+ if(weapon.use_tool(src, user, 3 SECONDS, volume=50))
+ balloon_alert(user, "bagged")
+ new sack_type(loc, src) //The bag handles sucking up the soil, stopping processing and setting relevants stats.
+
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/machinery/hydroponics/soil/click_ctrl(mob/user)
+ return CLICK_ACTION_BLOCKING //Soil has no electricity.
+
+/obj/machinery/hydroponics/soil/on_deconstruction(disassembled)
+ new /obj/item/stack/ore/glass(drop_location(), 3)
+
+///called when a soil is plopped down on the ground.
+/obj/machinery/hydroponics/soil/proc/on_place()
+ return
+
+/datum/armor/obj_soil
+ melee = 80
+ bullet = 100
+ laser = 90
+ fire = 70
+ acid = 30
+ bomb = 15
+
+/////////////// Advanced Soils //////////////
+
+/obj/machinery/hydroponics/soil/vermaculite
+ name = "vermaculite growing medium"
+ desc = "A plant bed made of light, expanded mineral granules.\n\nThe plant health benefits from the high degree of soil aeration is especially useful for when propagating grafts."
+ icon_state = "soil_verm"
+ maxnutri = 20
+ maxwater = 150
+ tray_flags = SOIL | MULTIGRAFT | GRAFT_MEDIUM
+ sack_type = /obj/item/soil_sack/vermaculite
+
+/obj/machinery/hydroponics/soil/gel
+ name = "hydrogel beads"
+ desc = "A plant bed made of superabsorbent polymer beads.\n\nThese types of water gel beads can hold onto an incredible amount of water and reduces evaporative losses to almost nothing."
+ icon_state = "soil_gel"
+ maxwater = 300
+ tray_flags = SOIL | HYDROPONIC | SUPERWATER
+ plant_offset_y = 2
+ sack_type = /obj/item/soil_sack/gel
+
+/obj/machinery/hydroponics/soil/coir
+ name = "korta root coir"
+ desc = "A type of traditional growing medium from Tizira.\n\nUsed by the natives as a resourceful way to cultivate seraka mushrooms using waste korta roots.\nMushrooms of all kinds thrive due to the high organic content enabling them to mature faster."
+ icon_state = "soil_coir"
+ maxnutri = 20
+ tray_flags = SOIL | FAST_MUSHROOMS
+ sack_type = /obj/item/soil_sack/coir
+
+/obj/machinery/hydroponics/soil/worm
+ name = "worm castings"
+ desc = "A type of compost created when the humble worm dutifully works the soil.\n\nIt is packed with nutrients unlocked by said creatures digestive system. Give thanks to the worm!"
+ icon_state = "soil_worm"
+ maxnutri = 35
+ maxwater = 200
+ tray_flags = SOIL | WORM_HABITAT | SLOW_RELEASE
+ plant_offset_y = 4
+ sack_type = /obj/item/soil_sack/worm
+
+/obj/machinery/hydroponics/soil/worm/on_place()
+ . = ..()
+ flick("soil_worm_wiggle", src)
+
+/obj/machinery/hydroponics/soil/rich
+ name = "rich soil"
+ desc = "A rich patch of dirt, usually used in gardens."
+ icon_state = "rich_soil"
+ maxnutri = 20
+ sack_type = /obj/item/soil_sack/rich
+
+/////////////////// Soil Sacks ///////////////////////
+/// Holder items that store the soils until deployed.
+/obj/item/soil_sack
+ name = "soil sack"
+ desc = "A large plastic bag containing commercial garden soil. It is packed with sand, peat and manure. While you might not care much for such mixture, the plants have strange tastes."
+ icon = 'icons/obj/service/hydroponics/equipment.dmi'
+ icon_state = "soil_sack"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
+ base_icon_state = "soil_sack"
+ force = 7
+ throwforce = 17
+ attack_speed = 1.2 SECONDS
+ damtype = STAMINA
+ block_sound = 'sound/effects/bodyfall/bodyfall1.ogg'
+ w_class = WEIGHT_CLASS_HUGE
+ item_flags = SLOWS_WHILE_IN_HAND
+ resistance_flags = ACID_PROOF
+ hitsound = 'sound/items/pillow/pillow_hit.ogg'
+ drop_sound = 'sound/effects/footstep/woodbarefoot3.ogg' //could use better sounds in the future.
+ throw_drop_sound = 'sound/effects/bodyfall/bodyfall3.ogg'
+ custom_premium_price = PAYCHECK_CREW
+ throw_range = 3
+ throw_speed = 1
+ slowdown = 1
+ drag_slowdown = 1
+ var/obj/machinery/hydroponics/soil/stored_soil = /obj/machinery/hydroponics/soil
+ var/placement_sound = 'sound/effects/soil_plop.ogg'
+
+/obj/item/soil_sack/Initialize(mapload, obj/machinery/hydroponics/soil/outside_soil)
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_multiplier = 2, wield_callback = CALLBACK(src, PROC_REF(on_wield)), unwield_callback = CALLBACK(src, PROC_REF(on_unwield)))
+
+ if(outside_soil)
+ stored_soil = outside_soil
+ stored_soil.remove_plant()
+ stored_soil.forceMove(src)
+ STOP_PROCESSING(SSmachines, stored_soil)
+ animate(src, 100 MILLISECONDS, pixel_z = 4, easing = QUAD_EASING | EASE_OUT)
+ animate(time = 100 MILLISECONDS, pixel_z = 0, easing = QUAD_EASING | EASE_IN)
+ animate(time = 250 MILLISECONDS, pixel_x = rand(-6, 6), pixel_y = rand(-4, 4), flags = ANIMATION_PARALLEL)
+
+/obj/item/soil_sack/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
+ if(!isopenturf(interacting_with) || isgroundlessturf(interacting_with))
+ return ..()
+
+ if(locate(/obj/machinery/hydroponics/soil) in interacting_with)
+ to_chat(user, span_alert("There is already a bed of soil there!"))
+ return ITEM_INTERACT_BLOCKING
+
+ if(!do_after(user, 1 SECONDS, interacting_with))
+ return ITEM_INTERACT_BLOCKING
+
+ if(ispath(stored_soil))
+ stored_soil = new stored_soil(src)
+ stored_soil.reagents.add_reagent(/datum/reagent/plantnutriment/eznutriment, stored_soil.maxnutri / 2)
+ stored_soil.waterlevel = stored_soil.maxwater
+ else
+ START_PROCESSING(SSmachines, stored_soil)
+
+
+ stored_soil.forceMove(interacting_with)
+ playsound(stored_soil, placement_sound, 65, vary = TRUE)
+ stored_soil.on_place()
+ qdel(src)
+ return ITEM_INTERACT_SUCCESS
+
+///Remove slowdown and add block chance when wielded.
+/obj/item/soil_sack/proc/on_wield()
+ slowdown = 0
+ if(ismob(loc))
+ var/mob/wearer = loc
+ wearer.update_equipment_speed_mods()
+ block_chance = 25
+ inhand_icon_state = "[base_icon_state]_w"
+
+///Reapply slowdown and remove block chance when unwielded.
+/obj/item/soil_sack/proc/on_unwield()
+ slowdown = initial(slowdown)
+ if(ismob(loc))
+ var/mob/wearer = loc
+ wearer.update_equipment_speed_mods()
+ block_chance = initial(block_chance)
+ inhand_icon_state = base_icon_state
+
+
+/obj/item/soil_sack/vermaculite
+ name = "NT vermaculite sack"
+ desc = "A sack of expanded mineral granules that can be used as soilless growing medium.\n\nYou like to think of it a bag of rocky popcorn that lets the roots breathe."
+ icon_state = "soil_sack_verm"
+ base_icon_state = "soil_sack_verm"
+ custom_premium_price = PAYCHECK_CREW * 2
+ stored_soil = /obj/machinery/hydroponics/soil/vermaculite
+ slowdown = 0
+
+/obj/item/soil_sack/gel
+ name = "hydrogel bead sack"
+ desc = "A sack of space age superabsorbent gel beads! You wonder how shipping them prehydrated would ever make business sense..."
+ icon_state = "soil_sack_gel"
+ base_icon_state = "soil_sack_gel"
+ custom_premium_price = PAYCHECK_CREW * 2
+ placement_sound = 'sound/effects/meatslap.ogg'
+ stored_soil = /obj/machinery/hydroponics/soil/gel
+
+/obj/item/soil_sack/coir
+ name = "#1™ korta coir sack"
+ desc = "A sack of Tiziran korta root coir. The fiberous roots are composted until they separate into individual fibres.\n\nProvides an excellent food source for saprotrophic mushrooms and helps hold onto water in the hot Tizirian climate."
+ icon_state = "soil_sack_coir"
+ base_icon_state = "soil_sack_coir"
+ custom_premium_price = PAYCHECK_CREW * 3
+ stored_soil = /obj/machinery/hydroponics/soil/coir
+
+/obj/item/soil_sack/worm
+ name = "worm castings sack"
+ desc = "A sack of vermicompost, also known as worm castings.\n\nThis invertebrate manure not only contains plant nutrients and undigested organic matter, it also harbours a rich flora of beneficial microorganisms."
+ icon_state = "soil_sack_worm"
+ base_icon_state = "soil_sack_worm"
+ custom_premium_price = PAYCHECK_CREW * 4
+ stored_soil = /obj/machinery/hydroponics/soil/worm
+
+/obj/item/soil_sack/rich
+ name = "rich soil sack"
+ desc = "A sack of rich black soil.\nAs your gaze falls upon it, you feel a bit more connected to the land."
+ custom_premium_price = PAYCHECK_CREW * 1.5
+ stored_soil = /obj/machinery/hydroponics/soil/rich
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 3e522d0fc7c..5255db1b7b8 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -64,7 +64,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
//SKYRAT EDIT REMOVAL
/*
if(ishuman(spawning))
- setup_department(spawning, player_client)
+ setup_department(spawning, player_client, move_to = TRUE)
*/
//SKYRAT EDIT END
@@ -82,7 +82,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
/// Returns the department this mob was assigned to, if any.
-/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client)
+/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client, move_to = FALSE)
var/department = player_client?.prefs?.read_preference(/datum/preference/choiced/security_department)
if (!isnull(department))
department = get_my_department(spawning, department)
@@ -140,15 +140,15 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
var/spawn_point = pick(LAZYACCESS(GLOB.department_security_spawns, department))
- if(!CONFIG_GET(flag/sec_start_brig) && (destination || spawn_point))
+ if(!CONFIG_GET(flag/sec_start_brig) && move_to && (destination || spawn_point))
if(spawn_point)
- spawning.Move(get_turf(spawn_point))
+ spawning.forceMove(get_turf(spawn_point))
else
var/list/possible_turfs = get_area_turfs(destination)
while (length(possible_turfs))
var/random_index = rand(1, length(possible_turfs))
var/turf/target = possible_turfs[random_index]
- if (spawning.Move(target))
+ if (spawning.forceMove(target))
break
possible_turfs.Cut(random_index, random_index + 1)
diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
index ef14b2701a3..da58c2a9702 100644
--- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm
@@ -12,7 +12,7 @@
max_ammo = 4
/obj/item/ammo_box/magazine/internal/shot/tube/fire
- ammo_type = /obj/projectile/bullet/incendiary/shotgun/no_trail
+ ammo_type = /obj/item/ammo_casing/shotgun/incendiary/no_trail
/obj/item/ammo_box/magazine/internal/shot/tube/buckshot
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 7be79d60b39..bd0a12df573 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -50,13 +50,15 @@
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
- //component for seclight attachment
+
+//component for seclight attachment
/obj/item/gun/ballistic/shotgun/riot/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \
light_overlay = "flight", \
overlay_x = 20, \
overlay_y = 11)
+
// Automatic Shotguns//
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
@@ -71,6 +73,7 @@
projectile_damage_multiplier = 1.5
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
+
//component for seclight attachment
/obj/item/gun/ballistic/shotgun/automatic/combat/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
@@ -78,6 +81,7 @@
light_overlay = "flight", \
overlay_x = 20, \
overlay_y = 11)
+
/obj/item/gun/ballistic/shotgun/automatic/combat/compact
name = "compact combat shotgun"
desc = "A compact version of the semi automatic combat shotgun. Lower magazine capacity, but more easily carried."
@@ -85,6 +89,7 @@
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_MEDIUM
+
//component for seclight attachment
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_seclight_point()
AddComponent(/datum/component/seclite_attachable, \
@@ -92,6 +97,7 @@
light_overlay = "flight", \
overlay_x = 16, \
overlay_y = 11)
+
//Dual Feed Shotgun
/obj/item/gun/ballistic/shotgun/automatic/dual_tube
@@ -105,7 +111,6 @@
inhand_y_dimension = 32
worn_icon_state = "cshotgun"
w_class = WEIGHT_CLASS_HUGE
- semi_auto = TRUE
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/tube
interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
/// If defined, the secondary tube is this type, if you want different shell loads
@@ -138,7 +143,7 @@
return ..()
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/attack_self(mob/living/user)
- if(!chambered && magazine.contents.len)
+ if(!chambered && get_ammo())
rack()
else
toggle_tube(user)
@@ -278,6 +283,7 @@
/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
pin = /obj/item/firing_pin
+
/////////////////////////////
// DOUBLE BARRELED SHOTGUN //
/////////////////////////////
diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
index d22235c0846..1056277538b 100644
--- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm
@@ -670,8 +670,8 @@ Basically, we fill the time between now and 2s from now with hands based off the
traumalist = shuffle(traumalist)
var/obj/item/organ/brain/brain = affected_mob.get_organ_slot(ORGAN_SLOT_BRAIN)
for(var/trauma in traumalist)
- if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC))
- temp_trauma = trauma
+ temp_trauma = brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)
+ if(temp_trauma)
return
/datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/affected_mob)
@@ -680,7 +680,8 @@ Basically, we fill the time between now and 2s from now with hands based off the
return
if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what
return
- affected_mob.cure_trauma_type(temp_trauma, resilience = TRAUMA_RESILIENCE_MAGIC)
+ qdel(temp_trauma)
+ temp_trauma = null
/datum/reagent/inverse/corazargh
name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an homage to an older chem
diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm
index 0da810bd620..d7548e9612f 100644
--- a/code/modules/tgui_input/say_modal/modal.dm
+++ b/code/modules/tgui_input/say_modal/modal.dm
@@ -24,13 +24,15 @@
/// The user who opened the window
var/client/client
/// Injury phrases to blurt out
- var/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!")
+ var/static/list/hurt_phrases = list("GACK!", "GLORF!", "OOF!", "AUGH!", "OW!", "URGH!", "HRNK!")
/// Max message length
var/max_length = MAX_MESSAGE_LEN
/// The modal window
var/datum/tgui_window/window
/// Boolean for whether the tgui_say was opened by the user.
var/window_open
+ /// What text was present in the say box the last time save_text was called
+ var/saved_text = ""
/** Creates the new input window to exist in the background. */
/datum/tgui_say/New(client/client, id)
@@ -128,7 +130,7 @@
if (type == "typing")
start_typing()
return TRUE
- if (type == "entry" || type == "force")
+ if (type == "entry" || type == "force" || type == "save")
handle_entry(type, payload)
return TRUE
return FALSE
diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm
index 8fff832477c..aa40da10c86 100644
--- a/code/modules/tgui_input/say_modal/speech.dm
+++ b/code/modules/tgui_input/say_modal/speech.dm
@@ -65,6 +65,13 @@
window.send_message("force")
stop_typing()
+/**
+ * Exports whatever text is currently in the input box to this datum
+ */
+/datum/tgui_say/proc/save_text()
+ saved_text = null
+ window.send_message("save")
+
/**
* Makes the player force say what's in their current input box.
*/
@@ -78,6 +85,19 @@
log_speech_indicators("[key_name(client)] FORCED to stop typing, indicators DISABLED.")
SEND_SIGNAL(src, COMSIG_HUMAN_FORCESAY)
+/**
+ * Gets whatever text is currently in this mob's say box and returns it.
+ *
+ * Note: Sleeps, due to waiting for say to respond.
+ */
+/mob/proc/get_typing_text()
+ if(!client?.tgui_say?.window_open)
+ return
+ client.tgui_say.save_text()
+ var/safety = world.time
+ UNTIL(istext(client?.tgui_say?.saved_text) || world.time - safety > 2 SECONDS)
+ return client?.tgui_say?.saved_text
+
/**
* Handles text entry and forced speech.
*
@@ -101,4 +121,10 @@
target_channel = SAY_CHANNEL // No ooc leaks
delegate_speech(alter_entry(payload), target_channel)
return TRUE
+ if(type == "save")
+ saved_text = "" // so we can differentiate null (nothing saved) and empty (nothing typed)
+ var/target_channel = payload["channel"]
+ if(target_channel == SAY_CHANNEL || target_channel == RADIO_CHANNEL)
+ saved_text = payload["entry"] // only save IC text
+ return TRUE
return FALSE
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index b5e987ba870..e8cdbfe5899 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -228,6 +228,7 @@
#include "movement_order_sanity.dm"
#include "mutant_hands_consistency.dm"
#include "mutant_organs.dm"
+#include "neurine_trauma_cleanup.dm"
#include "novaflower_burn.dm"
#include "nuke_cinematic.dm"
#include "omnitools.dm"
diff --git a/code/modules/unit_tests/hydroponics_harvest.dm b/code/modules/unit_tests/hydroponics_harvest.dm
index 8ff72c40b06..c0881909f27 100644
--- a/code/modules/unit_tests/hydroponics_harvest.dm
+++ b/code/modules/unit_tests/hydroponics_harvest.dm
@@ -20,14 +20,14 @@
* they aren't the same type so everything that works with one isn't guaranteed to work with the other.
*/
/datum/unit_test/hydroponics_harvest/Run()
- var/obj/machinery/hydroponics/hydroponics_tray = allocate(/obj/machinery/hydroponics)
+ var/obj/machinery/hydroponics/soil/testing_soil = allocate(/obj/machinery/hydroponics/soil)
var/obj/item/seeds/planted_food_seed = allocate(/obj/item/seeds/apple) //grown food
var/obj/item/seeds/planted_not_food_seed = allocate(/obj/item/seeds/sunflower) //grown inedible
var/obj/item/seeds/planted_densified_seed = allocate(/obj/item/seeds/redbeet) //grown + densified chemicals
var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human/consistent)
- hydroponics_tray.forceMove(run_loc_floor_bottom_left)
+ testing_soil.forceMove(run_loc_floor_bottom_left)
var/nearby_loc = locate((run_loc_floor_bottom_left.x + 1), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)
human.forceMove(nearby_loc)
@@ -38,11 +38,11 @@
planted_densified_seed.forceMove(seeds_loc)
// Apples should harvest 10 apples with 10u nutrients and 4u vitamins.
- test_seed(hydroponics_tray, planted_food_seed, human)
+ test_seed(testing_soil, planted_food_seed, human)
// Sunflowers should harvest 10 sunflowers with 4u nutriment and 0u vitamins. It should also have 8u oil.
- test_seed(hydroponics_tray, planted_not_food_seed, human)
+ test_seed(testing_soil, planted_not_food_seed, human)
// Redbeets should harvest 5 beets (10 / 2) with 10u nutriments (5 x 2) and 10u vitamins (5 x 2) thanks to densified chemicals.
- test_seed(hydroponics_tray, planted_densified_seed, human)
+ test_seed(testing_soil, planted_densified_seed, human)
/datum/unit_test/hydroponics_harvest/proc/plant_and_update_seed(obj/machinery/hydroponics/tray, obj/item/seeds/seed)
seed.set_yield(10) // Sets the seed yield to 10. This gets clamped to 5 if the plant has traits to half the yield.
@@ -92,10 +92,11 @@
var/found_nutriments = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment)
var/found_vitamins = all_harvested_items[1].reagents.get_reagent_amount(/datum/reagent/consumable/nutriment/vitamin)
+
QDEL_LIST(all_harvested_items) //We got everything we needed from our harvest, we can clean it up.
TEST_ASSERT_EQUAL(found_nutriments, expected_nutriments * max_volume, "Hydroponics harvest from [saved_name] has a [expected_nutriments] nutriment gene (expecting [expected_nutriments * max_volume]) but only had [found_nutriments] units of nutriment inside.")
- TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_nutriments * max_volume]) but only had [found_vitamins] units of vitamins inside.")
+ TEST_ASSERT_EQUAL(found_vitamins, expected_vitamins * max_volume, "Hydroponics harvest from [saved_name] has a [expected_vitamins] vitamin gene (expecting [expected_vitamins * max_volume]) but only had [found_vitamins] units of vitamins inside.")
if(tray.myseed)
tray.age = 0
diff --git a/code/modules/unit_tests/neurine_trauma_cleanup.dm b/code/modules/unit_tests/neurine_trauma_cleanup.dm
new file mode 100644
index 00000000000..fee8ca6eb78
--- /dev/null
+++ b/code/modules/unit_tests/neurine_trauma_cleanup.dm
@@ -0,0 +1,58 @@
+/// Tests that neurine reagent properly creates and cleans up temporary traumas
+/datum/unit_test/neurine_trauma_cleanup
+
+/datum/unit_test/neurine_trauma_cleanup/Run()
+ var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent)
+ dummy.mind_initialize()
+
+ // Create neurine reagent
+ var/datum/reagent/inverse/neurine/neurine_reagent = new()
+
+ // Ensure the dummy has a brain
+ var/obj/item/organ/brain/brain = dummy.get_organ_slot(ORGAN_SLOT_BRAIN)
+ TEST_ASSERT(brain, "Test dummy should have a brain")
+
+ // Get initial trauma count
+ var/initial_trauma_count = length(brain.traumas)
+
+ // Trigger neurine to add a trauma (simulate on_mob_life)
+ // We need to ensure it creates a trauma by setting high purity
+ neurine_reagent.creation_purity = 10 // This ensures SPT_PROB(creation_purity*10) will be 100%
+ neurine_reagent.on_mob_life(dummy, 1, 1)
+
+ // Check that a trauma was added
+ var/post_add_trauma_count = length(brain.traumas)
+ TEST_ASSERT(post_add_trauma_count == initial_trauma_count + 1, "Neurine should have added exactly one trauma")
+ TEST_ASSERT(neurine_reagent.temp_trauma, "Neurine should have stored a reference to the trauma it created")
+
+ // Verify the trauma is actually there and has the right resilience
+ var/datum/brain_trauma/added_trauma = neurine_reagent.temp_trauma
+ TEST_ASSERT(added_trauma in brain.traumas, "The trauma stored in temp_trauma should be in the brain's trauma list")
+ TEST_ASSERT(added_trauma.resilience == TRAUMA_RESILIENCE_MAGIC, "Neurine-created trauma should have TRAUMA_RESILIENCE_MAGIC")
+
+ // Now simulate the reagent being deleted (on_mob_delete)
+ neurine_reagent.on_mob_delete(dummy)
+
+ // Check that the trauma was properly removed
+ var/post_delete_trauma_count = length(brain.traumas)
+ TEST_ASSERT(post_delete_trauma_count == initial_trauma_count, "Neurine trauma should have been removed when reagent was deleted")
+ TEST_ASSERT(!neurine_reagent.temp_trauma, "Neurine should have cleared its temp_trauma reference")
+ TEST_ASSERT(!(added_trauma in brain.traumas), "The specific trauma should no longer be in the brain's trauma list")
+
+ // Test special case: imaginary friend should NOT be removed
+ var/datum/brain_trauma/special/imaginary_friend/friend_trauma = new()
+ brain.add_trauma_to_traumas(friend_trauma)
+ friend_trauma.owner = dummy
+ friend_trauma.resilience = TRAUMA_RESILIENCE_MAGIC
+ neurine_reagent.temp_trauma = friend_trauma
+
+ var/pre_friend_test_count = length(brain.traumas)
+ neurine_reagent.on_mob_delete(dummy)
+
+ // Imaginary friend should still be there
+ TEST_ASSERT(length(brain.traumas) == pre_friend_test_count, "Imaginary friend trauma should not be removed by neurine cleanup")
+ TEST_ASSERT(friend_trauma in brain.traumas, "Imaginary friend should still be in trauma list")
+
+ // Clean up for next test
+ qdel(friend_trauma)
+ qdel(neurine_reagent)
diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm
index d7b3a0aaa5c..0f26c32acba 100644
--- a/code/modules/vending/nutrimax.dm
+++ b/code/modules/vending/nutrimax.dm
@@ -19,6 +19,13 @@
/obj/item/shovel/spade = 3,
/obj/item/storage/bag/plants = 5,
)
+
+ premium = list(
+ /obj/item/soil_sack = 8,
+ /obj/item/soil_sack/vermaculite = 3,
+ /obj/item/soil_sack/gel = 3,
+ )
+
contraband = list(
/obj/item/reagent_containers/cup/bottle/ammonia = 10,
/obj/item/reagent_containers/cup/bottle/diethylamine = 5,
diff --git a/html/changelogs/AutoChangeLog-pr-92513.yml b/html/changelogs/AutoChangeLog-pr-92513.yml
new file mode 100644
index 00000000000..043ba1db81f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-92513.yml
@@ -0,0 +1,10 @@
+author: "Krysonism"
+delete-after: True
+changes:
+ - rscadd: "Added 4 new types of soil"
+ - rscadd: "Added soils sacks to the nutrimax"
+ - rscadd: "Added soil sack crates to cargo."
+ - balance: "Soil now has higher armor values."
+ - balance: "Rice now gets more weeds if grown in soil."
+ - balance: "Carrots, potatoes, beets and their mutations now get reduced yield and potency if grown hydroponically."
+ - bugfix: "Weed overgrowth no longer instantly sets yield to 3."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93208.yml b/html/changelogs/AutoChangeLog-pr-93208.yml
new file mode 100644
index 00000000000..2ce425464c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93208.yml
@@ -0,0 +1,4 @@
+author: "loganuk"
+delete-after: True
+changes:
+ - bugfix: "Fixes endless Neurine trauma farming & adds unit test to keep it safe"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93250.yml b/html/changelogs/AutoChangeLog-pr-93250.yml
new file mode 100644
index 00000000000..71c4d158782
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93250.yml
@@ -0,0 +1,4 @@
+author: "JohnFulpWillard"
+delete-after: True
+changes:
+ - bugfix: "Latejoiners are buckled in to their chairs & Hangover station trait now kicks their effects in again."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93257.yml b/html/changelogs/AutoChangeLog-pr-93257.yml
new file mode 100644
index 00000000000..565646b855f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93257.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Multi-z map cryo no longer makes locked fighting game characters"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93259.yml b/html/changelogs/AutoChangeLog-pr-93259.yml
new file mode 100644
index 00000000000..336a02d850a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93259.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Latejoin officers no longer teleport"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93260.yml b/html/changelogs/AutoChangeLog-pr-93260.yml
new file mode 100644
index 00000000000..99864f92905
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93260.yml
@@ -0,0 +1,4 @@
+author: "ArcaneMusic"
+delete-after: True
+changes:
+ - bugfix: "Sheets removed from the protolathe/techfab will properly remove the correct quantity and merge into the right material."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93261.yml b/html/changelogs/AutoChangeLog-pr-93261.yml
new file mode 100644
index 00000000000..dea42c011fa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93261.yml
@@ -0,0 +1,6 @@
+author: "paganiy"
+delete-after: True
+changes:
+ - bugfix: "fixed cycler shotgun double ammo consumption"
+ - bugfix: "fixed racking action on the cycler shotgun"
+ - bugfix: "bounty hunter cycler shotgun now properly fires incendiary rounds from secondary tube"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93262.yml b/html/changelogs/AutoChangeLog-pr-93262.yml
new file mode 100644
index 00000000000..cbdc5d3596a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93262.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Emotes with visuals can no longer cause errors if spammed to an extreme degree"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93263.yml b/html/changelogs/AutoChangeLog-pr-93263.yml
new file mode 100644
index 00000000000..e62bc550157
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93263.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Lazy/Diligent is not incompatible with Introvert/lazy"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93264.yml b/html/changelogs/AutoChangeLog-pr-93264.yml
new file mode 100644
index 00000000000..356b9a24095
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93264.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Equipping clothes adds you to suit sensors correctly if your clothes are unlaundered"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-93265.yml b/html/changelogs/AutoChangeLog-pr-93265.yml
new file mode 100644
index 00000000000..85c8070f18c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-93265.yml
@@ -0,0 +1,4 @@
+author: "Melbert"
+delete-after: True
+changes:
+ - bugfix: "Fixed personality wiping"
\ No newline at end of file
diff --git a/html/changelogs/archive/2025-10.yml b/html/changelogs/archive/2025-10.yml
index 066286ef5e8..9bfbdc8f5db 100644
--- a/html/changelogs/archive/2025-10.yml
+++ b/html/changelogs/archive/2025-10.yml
@@ -149,3 +149,15 @@
- map: Replace snow cabin gateway geothermal generator with real turbine
vinylspiders:
- qol: improves admin logging of forced dynamic events.
+2025-10-04:
+ ArcaneMusic:
+ - balance: Ore vents on lavaland/icebox now scale their size, and therefore difficulty,
+ based on their distance from the mining station.
+ Melbert:
+ - rscadd: When a mind reader examines a mob, they'll get a glimpse into what that
+ mob is currently typing, before they even send the message.
+ - qol: Mind Reader now groups up all the information it gives you in a box
+ - admin: Mind Reader now logs everything the reader gleamed from the read-ee
+ Y0SH1M4S73R:
+ - bugfix: Snapping USB cables by dragging the attached objects too far away from
+ each other will no longer crash the server.
diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi
index ce7b1e53cf0..134c62cdd21 100644
Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ
diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi
index 5f771404f26..2d69140c07d 100644
Binary files a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi and b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/hydroponics_righthand.dmi b/icons/mob/inhands/equipment/hydroponics_righthand.dmi
index 11b91952032..a288a5c6aa1 100644
Binary files a/icons/mob/inhands/equipment/hydroponics_righthand.dmi and b/icons/mob/inhands/equipment/hydroponics_righthand.dmi differ
diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi
index 73166cd179d..24a8d7bc5f9 100644
Binary files a/icons/obj/service/hydroponics/equipment.dmi and b/icons/obj/service/hydroponics/equipment.dmi differ
diff --git a/sound/effects/license.txt b/sound/effects/license.txt
index 04bb7108d95..d55e035eb6a 100644
--- a/sound/effects/license.txt
+++ b/sound/effects/license.txt
@@ -6,4 +6,14 @@ cartoon_pop.ogg by Tobiasz 'unfa' Karoń
It has been licensed under CC-BY 3.0, which can be found at http://creativecommons.org/licenses/by/3.0/
alert.ogg by bbrocer. Extended, looped, and reverbed
-https://freesound.org/people/bbrocer/sounds/389511/
\ No newline at end of file
+https://freesound.org/people/bbrocer/sounds/389511/
+
+{
+soil_plop.ogg is made using:
+
+https://freesound.org/people/jorickhoofd/sounds/169551/ -- License: Attribution 4.0
+https://freesound.org/people/Ali_6868/sounds/384361/, -- License: Creative Commons 0
+https://freesound.org/people/lolamadeus/sounds/179341/, -- License: Creative Commons 0
+https://freesound.org/people/fthrll/sounds/522200/, -- License: Creative Commons 0
+https://freesound.org/people/Hankof/sounds/655630/, -- License: Creative Commons 0
+}
\ No newline at end of file
diff --git a/sound/effects/soil_plop.ogg b/sound/effects/soil_plop.ogg
new file mode 100644
index 00000000000..6713bc1f36f
Binary files /dev/null and b/sound/effects/soil_plop.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 9b6ab58eb05..9724e591479 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4620,6 +4620,7 @@
#include "code\modules\hydroponics\seed_extractor.dm"
#include "code\modules\hydroponics\seeds.dm"
#include "code\modules\hydroponics\snail_overlay.dm"
+#include "code\modules\hydroponics\soil.dm"
#include "code\modules\hydroponics\unique_plant_genes.dm"
#include "code\modules\hydroponics\beekeeping\bee_smoker.dm"
#include "code\modules\hydroponics\beekeeping\beebox.dm"
diff --git a/tgui/packages/tgui-say/TguiSay.tsx b/tgui/packages/tgui-say/TguiSay.tsx
index fc3cdc2a34a..0fdcab89d7c 100644
--- a/tgui/packages/tgui-say/TguiSay.tsx
+++ b/tgui/packages/tgui-say/TguiSay.tsx
@@ -82,7 +82,11 @@ export function TguiSay() {
setButtonContent(currentPrefix.current ?? iterator.current());
// Empty input, resets the channel
- } else if (currentPrefix.current && iterator.isSay() && value?.length === 0) {
+ } else if (
+ currentPrefix.current &&
+ iterator.isSay() &&
+ value?.length === 0
+ ) {
setCurrentPrefix(null);
setButtonContent(iterator.current());
}
@@ -152,6 +156,15 @@ export function TguiSay() {
handleClose();
}
+ function handleSaveText(): void {
+ const iterator = channelIterator.current;
+ const currentValue = innerRef.current?.value;
+
+ if (!currentValue || !iterator.isVisible()) return;
+
+ messages.current.saveText(currentValue, iterator.current());
+ }
+
function handleIncrementChannel(): void {
const iterator = channelIterator.current;
@@ -248,6 +261,7 @@ export function TguiSay() {
Byond.subscribeTo('props', handleProps);
Byond.subscribeTo('force', handleForceSay);
Byond.subscribeTo('open', handleOpen);
+ Byond.subscribeTo('save', handleSaveText);
}, []);
/** Value has changed, we need to check if the size of the window is ok */
diff --git a/tgui/packages/tgui-say/timers.ts b/tgui/packages/tgui-say/timers.ts
index b13e09ede75..6b4a9f46f08 100644
--- a/tgui/packages/tgui-say/timers.ts
+++ b/tgui/packages/tgui-say/timers.ts
@@ -17,6 +17,12 @@ export const byondMessages = {
1 * SECONDS,
true,
),
+ saveText: debounce(
+ (entry: string, channel: Channel) =>
+ Byond.sendMessage('save', { entry, channel }),
+ 1 * SECONDS,
+ true,
+ ),
// Throttle: Prevents spamming the server
typingMsg: throttle(() => Byond.sendMessage('typing'), 4 * SECONDS),
} as const;
diff --git a/tools/UpdatePaths/Scripts/93198_alert_consoles.txt b/tools/UpdatePaths/Scripts/93198_alert_consoles.txt
index 2152a8a092c..18b83c2238a 100644
--- a/tools/UpdatePaths/Scripts/93198_alert_consoles.txt
+++ b/tools/UpdatePaths/Scripts/93198_alert_consoles.txt
@@ -1 +1,2 @@
/obj/machinery/computer/station_alert/station_only : /obj/machinery/computer/station_alert{@OLD}
+/obj/effect/landmark/start/hangover/closet : /obj/effect/landmark/start/hangover{@OLD}