From f74b72596150109057fbeab81267f8222c5fa7c2 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Fri, 3 Oct 2025 12:07:52 -0400 Subject: [PATCH 01/29] Ore vent sizes are now divided up based on their distance to the mining base (#92943) --- .../IceRuins/icemoon_surface_ore_vent.dmm | 3 + .../IceRuins/icemoon_underground_ore_vent.dmm | 4 + .../map_files/IceBoxStation/IceBoxStation.dmm | 120 +-- _maps/map_files/Mining/Lavaland.dmm | 697 +++++++++--------- code/_globalvars/lists/mapping.dm | 1 + code/controllers/subsystem/ore_generation.dm | 37 + .../objects/structures/lavaland/ore_vent.dm | 76 +- icons/effects/landmarks_static.dmi | Bin 22234 -> 21855 bytes 8 files changed, 514 insertions(+), 424 deletions(-) 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/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 6ef09de3adb..124b15c804d 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -5748,6 +5748,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) @@ -9595,6 +9603,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, @@ -24619,6 +24632,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, @@ -25019,6 +25044,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, @@ -27113,12 +27146,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 @@ -38804,6 +38831,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 @@ -59109,14 +59151,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, @@ -60494,11 +60528,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, @@ -66264,6 +66293,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{ @@ -66470,6 +66505,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, @@ -72156,14 +72196,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{ @@ -75311,12 +75343,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, @@ -75452,18 +75478,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" @@ -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/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/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/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/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/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi index ce7b1e53cf0ee5cf5ec43bf4083916eb3fc94088..134c62cdd21bbb3b8cef208f22e0c3c89711ba92 100644 GIT binary patch literal 21855 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

^ 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 Hu0mjfhRQY~ literal 22234 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 Date: Fri, 3 Oct 2025 12:08:14 -0400 Subject: [PATCH 02/29] [NO GBP] Fixes USB cables infinitely recursing when snapped. (#93240) --- code/datums/components/shuttle_move_deferred_checks.dm | 2 -- 1 file changed, 2 deletions(-) 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() From 090c19f28f7d606609d085a49ef0955282acba40 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 16:08:29 +0000 Subject: [PATCH 03/29] Automatic changelog for PR #92943 [ci skip] --- html/changelogs/AutoChangeLog-pr-92943.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92943.yml diff --git a/html/changelogs/AutoChangeLog-pr-92943.yml b/html/changelogs/AutoChangeLog-pr-92943.yml new file mode 100644 index 00000000000..f830bb0f21c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92943.yml @@ -0,0 +1,4 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - balance: "Ore vents on lavaland/icebox now scale their size, and therefore difficulty, based on their distance from the mining station." \ No newline at end of file From ee20fa4a1c87c815c16df90b3ca24bc572e89d69 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 16:08:47 +0000 Subject: [PATCH 04/29] Automatic changelog for PR #93240 [ci skip] --- html/changelogs/AutoChangeLog-pr-93240.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93240.yml diff --git a/html/changelogs/AutoChangeLog-pr-93240.yml b/html/changelogs/AutoChangeLog-pr-93240.yml new file mode 100644 index 00000000000..85e1953874c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93240.yml @@ -0,0 +1,4 @@ +author: "Y0SH1M4S73R" +delete-after: True +changes: + - bugfix: "Snapping USB cables by dragging the attached objects too far away from each other will no longer crash the server." \ No newline at end of file From ce50179f7cabfb47db39dc04fe2a0c520e86f3d6 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:29:31 -0500 Subject: [PATCH 05/29] Mind readers can read what people are typing (#93059) ## About The Pull Request When a Mind Reader examines someone who is typing, it will show them what they are actively typing image No, it won't read OOC messages. ## Why It's Good For The Game Your next line is, "This sounds really funny for gimmicks like security interrogations or fortune telling, or for getting the jump on someone as they try to get the jump on you, or just to be a badass by finishing people sentences" ## Changelog :cl: Melbert add: 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 /:cl: --- code/datums/mutations/antenna.dm | 62 +++++++++++++++++++-- code/modules/tgui_input/say_modal/modal.dm | 6 +- code/modules/tgui_input/say_modal/speech.dm | 26 +++++++++ tgui/packages/tgui-say/TguiSay.tsx | 16 +++++- tgui/packages/tgui-say/timers.ts | 6 ++ 5 files changed, 107 insertions(+), 9 deletions(-) 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/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm index 876c4476f67..551b8fc12e1 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 0d95b855a15..b5b7099868e 100644 --- a/code/modules/tgui_input/say_modal/speech.dm +++ b/code/modules/tgui_input/say_modal/speech.dm @@ -57,6 +57,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. */ @@ -70,6 +77,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. * @@ -93,4 +113,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/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; From c6c831dfc128c4624382198c21da7ac4484dc2c3 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 23:29:47 +0000 Subject: [PATCH 06/29] Automatic changelog for PR #93059 [ci skip] --- html/changelogs/AutoChangeLog-pr-93059.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93059.yml diff --git a/html/changelogs/AutoChangeLog-pr-93059.yml b/html/changelogs/AutoChangeLog-pr-93059.yml new file mode 100644 index 00000000000..cc7a50ec688 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93059.yml @@ -0,0 +1,6 @@ +author: "Melbert" +delete-after: True +changes: + - 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" \ No newline at end of file From 8b6424f0ec7ed56b45f00b759511f34f9df06596 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:26:25 +0000 Subject: [PATCH 07/29] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-92943.yml | 4 ---- html/changelogs/AutoChangeLog-pr-93059.yml | 6 ------ html/changelogs/AutoChangeLog-pr-93240.yml | 4 ---- html/changelogs/archive/2025-10.yml | 12 ++++++++++++ 4 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-92943.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93059.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-93240.yml diff --git a/html/changelogs/AutoChangeLog-pr-92943.yml b/html/changelogs/AutoChangeLog-pr-92943.yml deleted file mode 100644 index f830bb0f21c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92943.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - balance: "Ore vents on lavaland/icebox now scale their size, and therefore difficulty, based on their distance from the mining station." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93059.yml b/html/changelogs/AutoChangeLog-pr-93059.yml deleted file mode 100644 index cc7a50ec688..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93059.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - 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" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93240.yml b/html/changelogs/AutoChangeLog-pr-93240.yml deleted file mode 100644 index 85e1953874c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93240.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Y0SH1M4S73R" -delete-after: True -changes: - - bugfix: "Snapping USB cables by dragging the attached objects too far away from each other will no longer crash the server." \ 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. From 178a8c12d20fada6dbe151b54e5f49449eb0be44 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:35:08 -0500 Subject: [PATCH 08/29] Avoid adding dupe emote bodypart overlays (#93262) ## About The Pull Request You can hit the overlay cap by spamming emotes ## Changelog :cl: Melbert fix: Emotes with visuals can no longer cause errors if spammed to an extreme degree /:cl: --- code/datums/bodypart_overlays/emote_bodypart_overlay.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm index cabb10558a0..fbdea601839 100644 --- a/code/datums/bodypart_overlays/emote_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/emote_bodypart_overlay.dm @@ -39,11 +39,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 From 1ce04e62d1694e55d6e3c82e484c83f7955e2c69 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:35:28 +0000 Subject: [PATCH 09/29] Automatic changelog for PR #93262 [ci skip] --- html/changelogs/AutoChangeLog-pr-93262.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93262.yml 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 From dfc917e1b07ab59c34a70e4868c437e7fc7654f3 Mon Sep 17 00:00:00 2001 From: paganiy <126676387+paganiy@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:35:58 +0000 Subject: [PATCH 10/29] Cycler shotgun fixing (#93261) ## About The Pull Request closes https://github.com/tgstation/tgstation/issues/93214 - Fixed the cycler shotgun consuming two rounds per shot. - Fixed racking action on the cycler shotgun. - Bounty hunter cycler shotgun now correctly uses incendiary rounds in its secondary tube. ## Changelog :cl: fix: fixed cycler shotgun double ammo consumption fix: fixed racking action on the cycler shotgun fix: bounty hunter cycler shotgun now properly fires incendiary rounds from secondary tube /:cl: --- .../projectiles/boxes_magazines/internal/shotgun.dm | 2 +- code/modules/projectiles/guns/ballistic/shotgun.dm | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) 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 1110d302a6a..053f3dbf99a 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 // ///////////////////////////// From 6b1f91541be9eedf6ea6b254681299ad4e264eb6 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:36:14 +0000 Subject: [PATCH 11/29] Automatic changelog for PR #93261 [ci skip] --- html/changelogs/AutoChangeLog-pr-93261.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93261.yml 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 From 90f2b92c0ff8142b455f76516cd541bbbd24b679 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:36:28 -0500 Subject: [PATCH 12/29] Fix latejoin seccies teleporting to departments (#93259) ## About The Pull Request Don't send latejoins to their departments, let them ride the shuttle Why did this break? My GUESS Is that this uses `Move` for some reason instead of `forceMove`, and as latejoiners spawn buckled, it stopped them from moving Meaning #93250 also fixes it but let's just nip the issue in the bud and NOT teleport latejoiners ## Changelog :cl: Melbert fix: Latejoin officers no longer teleport /:cl: --- code/modules/jobs/job_types/security_officer.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 8ea2ca84429..6822538a32c 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) /datum/job/security_officer/after_roundstart_spawn(mob/living/spawning, client/player_client) . = ..() if(ishuman(spawning)) - setup_department(spawning, player_client) + setup_department(spawning, player_client, move_to = TRUE) /datum/job/security_officer/after_latejoin_spawn(mob/living/spawning) @@ -74,7 +74,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) @@ -132,15 +132,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) From 3e4a3cd45999f5d4c54c617f602213774e4c5ccb Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:36:44 +0000 Subject: [PATCH 13/29] Automatic changelog for PR #93259 [ci skip] --- html/changelogs/AutoChangeLog-pr-93259.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93259.yml 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 From 2560ceb44772dfc15c0066707c72c202c29f8358 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:37:21 -0500 Subject: [PATCH 14/29] Fix cryo visuals on multiz maps (#93257) ## About The Pull Request It needs to match parent plane ## Changelog :cl: Melbert fix: Multi-z map cryo no longer makes locked fighting game characters /:cl: --- .../atmospherics/machinery/components/unary_devices/cryo.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index ab608377cd8..bc3707dabd9 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 From 79a00366c41d822c9956782dcae0e34e1abc3d84 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:37:38 +0000 Subject: [PATCH 15/29] Automatic changelog for PR #93257 [ci skip] --- html/changelogs/AutoChangeLog-pr-93257.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93257.yml 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 From 2b72fce561d497c26e88e430c24b48dddd5ce7fd Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:37:47 -0500 Subject: [PATCH 16/29] Lazy people can be extroverted (#93263) ## About The Pull Request Last minute error with these keys. ## Changelog :cl: Melbert fix: Lazy/Diligent is not incompatible with Introvert/lazy /:cl: --- code/datums/personality/reaction_to_recreation.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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) . = ..() From 89e636293b1726e5c835219cb81b5297839be5ce Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:38:06 +0000 Subject: [PATCH 17/29] Automatic changelog for PR #93263 [ci skip] --- html/changelogs/AutoChangeLog-pr-93263.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93263.yml 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 From b617fb3877060c51034d7c30b3e8afd3c4b5c3e7 Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:39:00 -0400 Subject: [PATCH 18/29] Fix for stacks transforming into other stacks when removed from the Protolathe/Techfab. (#93260) ## About The Pull Request I *think* this should be all that's required to fix this, it looks like it's just the variable that iterates over all available stacks on the dropturf needed to compare against the iterator's type as opposed to the stack we're about to create otherwise. Fixes #93256 ## Why It's Good For The Game Prevents a tiiiiny little material transformation/duplication bug. ## Changelog :cl: fix: Sheets removed from the protolathe/techfab will properly remove the correct quantity and merge into the right material. /:cl: --- code/datums/components/material/material_container.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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()) From 67653800986f5d44af70a56d32d4338be430a89a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:39:17 +0000 Subject: [PATCH 19/29] Automatic changelog for PR #93260 [ci skip] --- html/changelogs/AutoChangeLog-pr-93260.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93260.yml 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 From a82a8057272ffd0610561a22913aa7bae91fa380 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:39:45 -0500 Subject: [PATCH 20/29] Fixed suit sensors only working on laundered clothes (#93264) ## About The Pull Request I don't think I need to explain anything ## Changelog :cl: Melbert fix: Equipping clothes adds you to suit sensors correctly if your clothes are unlaundered /:cl: --- code/modules/clothing/under/_under.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 8f4468e483a..32af00a069f 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -165,9 +165,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) From da0e3dbe3bf9f3b7fb17a55dface421d362739ee Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:40:01 +0000 Subject: [PATCH 21/29] Automatic changelog for PR #93264 [ci skip] --- html/changelogs/AutoChangeLog-pr-93264.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93264.yml 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 From d664be4c785be659c88515b81903e04d041cbe0d Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:40:16 -0500 Subject: [PATCH 22/29] Ensures personalities are loaded before prefs are loaded (#93265) ## About The Pull Request Aaaaa if you load fast personalities aren't instantiated so personality loading wipes everything out. I don't know the best way to ensure personalities are loaded before anyone could load in unfortunately, so I just threw it in. Will need to ask around. ## Changelog :cl: Melbert fix: Fixed personality wiping /:cl: --- code/controllers/subsystem/processing/personality.dm | 3 +++ code/datums/personality/personality_preference.dm | 3 +++ 2 files changed, 6 insertions(+) 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/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] From 0e27601054cb493fe7fda238bfd156dc0cc9a2d6 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:40:33 +0000 Subject: [PATCH 23/29] Automatic changelog for PR #93265 [ci skip] --- html/changelogs/AutoChangeLog-pr-93265.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93265.yml 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 From 57028c78f8d63e0d921d0b1efc544f2981b9a58e Mon Sep 17 00:00:00 2001 From: SimplyLogan <47579821+loganuk@users.noreply.github.com> Date: Sat, 4 Oct 2025 03:41:39 +0100 Subject: [PATCH 24/29] Neurine Trauma Exploit - Unit Test & Fix (#93208) ## About The Pull Request I was a solo doctor when someone chem factorised this and killed most of the crew :) Fixes #93133 temp_trauma was declared as an instance reference but stored a type path Store the actual trauma better and direct delete it, then cleans it up. Also adds a unit test. ## Why It's Good For The Game - Exploit farming bad ## Changelog :cl: fix: Fixes endless Neurine trauma farming & adds unit test to keep it safe /:cl: Co-authored-by: loganuk --- .../impure_medicine_reagents.dm | 7 ++- code/modules/unit_tests/_unit_tests.dm | 1 + .../unit_tests/neurine_trauma_cleanup.dm | 58 +++++++++++++++++++ 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 code/modules/unit_tests/neurine_trauma_cleanup.dm 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 10a9c95a3dd..ef0066218a2 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 @@ -669,8 +669,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) @@ -679,7 +679,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/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index ad13a50d18e..304dcb66a44 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/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) From 2082364ad9b0c8cb67548c65798aa466ebf9871d Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:41:56 +0000 Subject: [PATCH 25/29] Automatic changelog for PR #93208 [ci skip] --- html/changelogs/AutoChangeLog-pr-93208.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93208.yml 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 From e9e3df89d98d16518b5a8f590fd87311342adc24 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:43:06 -0400 Subject: [PATCH 26/29] Latejoiners are buckled in again. (#93250) ## About The Pull Request Not reported yet but I noticed this and immediately knew I broke it, my bad. Fixes latejoiners not being buckled into their chairs & Hangover station trait effects, also merges the two hangover landmarks into one cause i dont see why they had to be two, I put it in the same updatepaths as the PR this is a fix to. ## Why It's Good For The Game Bug fixes ## Changelog :cl: fix: Latejoiners are buckled in to their chairs & Hangover station trait now kicks their effects in again. /:cl: --- .../CatwalkStation/CatwalkStation_2023.dmm | 28 +++---- .../map_files/Deltastation/DeltaStation2.dmm | 74 +++++++++---------- .../map_files/IceBoxStation/IceBoxStation.dmm | 32 ++++---- _maps/map_files/MetaStation/MetaStation.dmm | 36 ++++----- .../map_files/NebulaStation/NebulaStation.dmm | 62 ++++++++-------- _maps/map_files/tramstation/tramstation.dmm | 30 ++++---- _maps/map_files/wawastation/wawastation.dmm | 40 +++++----- code/controllers/subsystem/job.dm | 7 +- code/game/objects/effects/landmarks.dm | 16 ++-- .../Scripts/93198_alert_consoles.txt | 1 + 10 files changed, 161 insertions(+), 165 deletions(-) diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index c95e81d965f..b44b9ae7d9f 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -11409,7 +11409,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) @@ -12417,7 +12417,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" = ( @@ -19806,7 +19806,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, @@ -27983,7 +27983,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) @@ -37358,7 +37358,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" = ( @@ -44942,7 +44942,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" = ( @@ -45239,7 +45239,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" = ( @@ -55587,7 +55587,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" = ( @@ -60166,7 +60166,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" = ( @@ -67252,7 +67252,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 }, @@ -69187,7 +69187,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" = ( @@ -72266,7 +72266,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) @@ -76727,7 +76727,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" = ( @@ -81149,7 +81149,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 124b15c804d..672569e1bbf 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -11462,7 +11462,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" = ( @@ -14441,7 +14441,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" = ( @@ -17962,7 +17962,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 }, @@ -19135,7 +19135,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) @@ -26110,7 +26110,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" = ( @@ -28432,7 +28432,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 }, @@ -50708,7 +50708,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 }, @@ -50953,7 +50953,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" = ( @@ -51918,8 +51918,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 }, @@ -54351,7 +54351,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, @@ -55742,7 +55742,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" = ( @@ -56249,7 +56249,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" = ( @@ -71495,7 +71495,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" = ( @@ -84446,7 +84446,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" = ( @@ -84538,7 +84538,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, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 9cbb054863d..02a3b68625d 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) @@ -5431,7 +5431,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, @@ -13114,7 +13114,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, @@ -22631,7 +22631,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) @@ -23729,7 +23729,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) @@ -25858,7 +25858,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) @@ -28030,7 +28030,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" = ( @@ -33207,7 +33207,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, @@ -33578,7 +33578,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) @@ -37077,7 +37077,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, @@ -38760,7 +38760,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, @@ -39163,7 +39163,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, @@ -63986,7 +63986,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, @@ -64982,7 +64982,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" = ( @@ -66532,7 +66532,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/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 ac8cbf8cd52..82c19283e01 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) @@ -7017,7 +7017,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 }, @@ -8132,7 +8132,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" = ( @@ -12671,7 +12671,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, @@ -15765,7 +15765,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) @@ -19614,7 +19614,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, @@ -24149,7 +24149,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) @@ -38931,7 +38931,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" = ( @@ -39746,7 +39746,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" = ( @@ -41913,7 +41913,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" = ( @@ -55623,7 +55623,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) @@ -63535,7 +63535,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) @@ -67984,7 +67984,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" }, @@ -71943,7 +71943,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/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 6cb6dd8f760..c37577d24bd 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -742,10 +742,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/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 93b967773ce..f7e04e3d04e 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -555,20 +555,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/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} From cece0eb0adc658fbbe944ecf227e80d832f46b8d Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 02:43:22 +0000 Subject: [PATCH 27/29] Automatic changelog for PR #93250 [ci skip] --- html/changelogs/AutoChangeLog-pr-93250.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-93250.yml 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 From def17fd90a5ae0ed9d9537910164f7ec3cb556c6 Mon Sep 17 00:00:00 2001 From: Krysonism <49783092+Krysonism@users.noreply.github.com> Date: Sat, 4 Oct 2025 05:01:26 +0200 Subject: [PATCH 28/29] Rare Earths! Advanced soils for botany. (#92513) ## About The Pull Request This PR adds 4 new types of soil and a holder item; the soil sack, to contain and transport said soils. bild Two of the new soils + the regular old soil are available in the premium section of the nutrimax. All 5 soil types are available from cargo. It also adds two new plant traits; soil lover and semiaquatic, that allows coders to confer maluses to plants growing in trays or soil respectively. Potatoes, sweet potatoes, carrots, parsnips, cahn'roots, white and red beets currently have soil lover, reducing their produced yield by 30% and their potency randomly between 20-80% if grown hydroponically. Rice has semiaquatic which increases the amount of weeds gained by 50% if grown in soil rather than hydroponically. ## Advanced soil types ### Vermaculite #### Stats Max Nutrients: 20u Max Water: 150u #### Special Effects Multigraft: Up to 3 grafts can be cut from a plant planted in vermaculite. Graft Medium: Graft cuttiongs can be directly placed into vermaculite to create a new plant vegetatively. ### Hydrogel Beads #### Stats Max Nutrients: 15u Max Water: 300u #### Special Effects Hydroponic + Soil: Both water loving and soil loving plants can grow without maluses. Super Water: Water consumption rate is decreased by 50% ### Korta Coir #### Stats Max Nutrients: 20u Max Water: 100u #### Special Effects Fast Mushrooms: Mushrooms mature(and age) 40% faster if planted in this soil. ### Worm Castings #### Stats Max Nutrients = 35u Max Water = 200u #### Special Effects Slow Release: If the nutrients run out, 1u nitrogen will be automatically added to the nutient pool. Worm Habitat: Composting veggies in this soil has a chance to produce an extra slimy worm. ### Soil Sacks Use them on the floor to place a soil at that location. You can reverse this process by right clicking a soil with a shovel. The sacks are huge items that deals stamina damage, but have slowdown when carried. They can be wielded to remove slowdown, double the damage output and gain 25% block chance. They have unique normal and wielded inhands for each sack type. #### Price List **Soil** Nutrimax: 50 cr Cargo: 400 cr / 5 sacks **Vermaculite** Nutrimax: 100 cr Cargo: 400 cr / 3 sacks **Hydrogel** Nutrimax: 100 cr Cargo: 400 cr / 3 sacks **Coir** Nutrimax: N/A Cargo: 600 cr / 3 sacks **Worm Castings** Nutrimax: N/A Cargo: 800 cr / 3 sacks #### Misc Soil Changes Soil now have a new armour type and are generally much harder to destroy by shooting or bashing them. Fixed a bug where weeds would instantly reduce yield to 3 instead of lowering it by 1-2 per cycle. ## Why It's Good For The Game I have long been a fan of using soils in botany, they are the cheapest and easiest way to make new trays and enable many interesting strategies. The default soil is fine for what is but it kinda sucks, not only having low stats but also missing autogrow, a feature botanist have grown completely addicted and dependent on. When self sustaining trays were removed and autogrow added, it was intended as a way to keep a couple of plants alive while you ran out to do errands or grab a drink. However, the feature has devolved into basically a shift start self sustaining for all your trays and standard practice is using it on every single tray that currently is not trying to mutate. This has resulted in certain core botany mechanics like water and pests being made totally irrelevant, shrinking design space a lot. Rather than just reaching for the stick, I thought it would be fun to instead offer them a carrot in the form of an expanded toolset of soils with unique effects that cannot be replicated by trays. These new soils offer niche benefits that enable advanced botany gameplay and provides a framwork for deepening plant / tray interactions in the furture. ## Changelog :cl: add: Added 4 new types of soil add: Added soils sacks to the nutrimax add: 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. fix: Weed overgrowth no longer instantly sets yield to 3. /:cl: --- code/__DEFINES/botany.dm | 35 +++ .../items/devices/scanners/plant_analyzer.dm | 16 +- code/modules/cargo/packs/organic.dm | 51 +++- code/modules/hydroponics/grafts.dm | 45 ++-- code/modules/hydroponics/grown/cereals.dm | 2 + code/modules/hydroponics/grown/potato.dm | 2 +- code/modules/hydroponics/grown/root.dm | 6 +- code/modules/hydroponics/hydroponics.dm | 163 ++++++------ code/modules/hydroponics/plant_genes.dm | 18 ++ code/modules/hydroponics/seeds.dm | 68 +++-- code/modules/hydroponics/soil.dm | 235 ++++++++++++++++++ .../modules/unit_tests/hydroponics_harvest.dm | 13 +- code/modules/vending/nutrimax.dm | 7 + .../equipment/hydroponics_lefthand.dmi | Bin 1298 -> 3938 bytes .../equipment/hydroponics_righthand.dmi | Bin 1306 -> 3866 bytes icons/obj/service/hydroponics/equipment.dmi | Bin 31633 -> 45212 bytes sound/effects/license.txt | 12 +- sound/effects/soil_plop.ogg | Bin 0 -> 25783 bytes tgstation.dme | 1 + 19 files changed, 500 insertions(+), 174 deletions(-) create mode 100644 code/modules/hydroponics/soil.dm create mode 100644 sound/effects/soil_plop.ogg 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/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/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/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 48220dd0b99..c1c9b23d5da 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -989,3 +989,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 2f0f026110e..47889839f70 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 @@ -186,19 +186,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) @@ -235,7 +238,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) @@ -552,24 +561,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 /** @@ -584,25 +580,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 @@ -647,7 +643,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) @@ -657,7 +653,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/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/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/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi index 5f771404f2636af6ef5bf3a1c792a1978336a486..2d69140c07d1ce5c69eefb7b7a5dce6941efdeec 100644 GIT binary patch delta 3886 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 delta 1234 zcmV;@1TFiT9-0bYiBL{Q4GJ0x0000DNk~Le0002M0002M2m=5B0A&K4H2?qrpHNIx zMgRZ*e@z1anE<2+2yGM;J#QTV|9DhXR6syLY;0@*wg3QL0463T0000xJ3CofSt~0m z1>kIvUp5R|KsCIEZEH(Df?G?Gl_!7FEi|wI0004WQchCV=-0C=30kv$HBFbsv~%)gnV;?3r)P3A=l9ZF2R#ez{eP42f~jI8K^fkJJYo*=y<{Ng73!$La%)?KSm~Bn1zs*MWDyrbT~-#5if3tVK%* zA%qY@2qAK^dWte(~>)cs&0igq>s`}|7+&xNmP|9kdQuti(b%l z(W-KVKBQmW*K*u5sN>8{dk2K7dWAmY-ckx2kn*Vkq)hwtA!{;&cR~mugb+dqA%u|c z#QFKAn%2X``5)Yj>A8PcgO@ybmlrv_n4U{-@tfkc<+>? zN9RN-+m`Pcvqu*oyV*oy)D5+ia#2qA@?C2ue4l(geLyY30cONRc)SU= z=zx6rK7Lw&^xBtjK<<3s_`zNQk*RnWLM(TW6`jtu=Xr_TJyM*NHf#tbnY%}-rnXT# wI2kd$DR0nBE|R%>w7mTXr04Do<;f4^A0cj67z+jd6aWAK07*qoM6N<$g5a}BGynhq diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi index 73166cd179d99a7d098149d5c12d0edffbaddba3..24a8d7bc5f9338ce0e4756d104ca8e5a61a110bd 100644 GIT binary patch literal 45212 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

@9!%h-KRCP=oOJ?XwU@WliUKMF^K+XMC?&; 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 T^q~+yzO)|dseOK6AM<|zo67Ko literal 31633 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 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 0000000000000000000000000000000000000000..6713bc1f36f7981265aef8c0f089e878b8b0ab2e GIT binary patch literal 25783 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 z X{O7vPKioGPYGVUNtz%q&Li1J#fxxJo#bmwnx8*HuFFb zSlWfQ zVRv!~z<{1{u+C7$&P|=QsL~;e(=nwnNiVCk`p0KhzYglmdN>p?NcDa8;Ty`kXyN+f z`m=!%_73iLIN)KIWPckS!67snzq#Aiz_%y+fDhjdcuBTkP%z-GbY+4rA@9tbOP$wt zzd5QT8jv(@^aENXX<<$0iyXJK0%<{>T4}jP{)G}O66%?8rbYx?VJol!N|FTMBZ|DL zcB8N{mojZMuIvW@lhK9M#UzQGu1MPxCoJhj7r?+^a9i)I2OiU%TD~fIYL6~%)A;@f zm(pY5q^XqIOgAew;IJPDyijIxpKc-v%&cr8lx^%Sd$BEIHF~aKtdBJKVS2(&);&7l zY%yS7$!@Wo2+x+zQ_8sDoL-VsEIn(Q2CrH*%8ne#b`r4SoVvWX=yOiNvtokI6%=_r zgHYw_>pp-5_oH+?EVv4SEau!53T<+RyO65 z*$}y+UbzHydQ;nBK6)hN3fva_FwXjmf%%D?u-j8cJlK#$Q^~sqIWJlW#eq}Kp5WF+ zYweZkciyX7zt3?~+8F6V%rdZ2GxDlPLu!zEhZ#L&o(ekW56vs+Wwh9Q!N@8XQex`! zh96=iWPBX#l^6cCeIhc`4%u*vdy$ax z_m4pIBBXCay4f$G+8K)tC{(>F{Z-5d8pjd693^0WMfi*PMO^K5a!&mi5rh~-H+;7<%b-N zDE8boVyw6CwBEkERyrzEZYEnO^|{8;b|R%rlUQP~PX@dST>^BH8n}s~aAKg%ZCw7GO$PW$sR9CdK zu2qr5nC30n>d}=5t^Vi!dS!g_VG={qeWxBnC-{1L5ZSc0Nd1u{)ja3BQsh3mewb~k z*PFY;+KqFWP}|+#hi~*nkC0mHa7}sP%X+t0;O?~=A(ZX6PiP*@>RpqduR@ivu?ysS zJgyH6QlChzj5lm4@=%ClxPB-g{djRq-e34F?d=$Cc)iiVPdUpq@4Xj{t7 z997bH1U3!v0bMCAS*eR$!c}ALQu+?ws&{mZ?0#ElH=mlI->=>ASbR~G%>^4QfVUKwffG_Kqt^jsU z{I?%NV2GEYUE$|2NpZzyeP1PI9~#kEFThv6#HFV61{cJ9eoqud6+=D)yHF8Tmw{C8 zABmOz+z)f(Z4A#f$BPtotr9aIuiZ)C4O{Ef)t+<1&%j&red3CoJBwyD;tipQcMlSn z0c22;qfyIn${2WK|Fa`p!}J>xnm?Yo9qY~Om6BVz=ib!vOw9Y~g)@H5ChVks6J}J> z6n9}0*{85N+fYBJw*A@4DXZ%3n_hQsY-5+x=+gQPt|*B^%RQg8w-R1{D9uoBne76_ zD)!4Fm8Jl-Bk_bDD9LpTQT(+EQ0a7bn@YFe>pK$Lp00g}?B2iVIKmC6v?m}R4 zR|X$>Uc0M17h@DxA(D1HXR0?v{ZvGmz3RK^vLMo@ESDDb!Jxfwo26{7o1p*9vv(nf zk#pL3;RC%qN7ein5k37VqkMn)munhKQDXtIBNuG#<;C#lN+hN{SHe)0@hmOJ7}ZNFD%wmZu2Id z#JZRlX3M!Dxo+0LX#+>iHw2ZlA|xB1{9Mo3IKzOX3KJ=jLIG(Ls*+YAE$RNs2(CSY zvWP7zsg47?-Gyw9=A96^Bq1+GfP#A9J4_30n6ujSbb!3iZ zrKF1_f-Wq{ zYPMK|@=d1dIy-r)HM z@_nJ^B&FU_2{1~uUMlJ@U@^k*(j;JYdH+X(>q2>wc5!FJHGbW+l}kr0b{B46p_g7E z)3GVjYTRJ1Y+)+aDoW8)?${JYTwX~!7H&9~if{E36{&_uDpR{N99#V@=%}@Ps`199 zHBi?r+f)Vco#D9QwZVrk7J`KrHokDfOZGT@!yN1D&m5_h#Jn~hay3>v*Y8caUY`Zo zlS1TH&7j~BCDCV~n z23Nus#M5D###9~U=ufOVLO({i40dNfz#6mglzKw%?s)e#fuiEI$7GIfJP__o=z47j zAwaf1alcv~`qxHn^BofHAFD@yFanon&D?GCE+jS_m~DUbWAJ78I|{wOeB_N%o6rZ|J|-u|NN65nCjx*HdNATK(l`FKvv)@umhq3 zt4pMdUP3aqpNYf*=AUMrxj&&m(V-vBR~!G7;7t7dL2jfAMs>Pa`gl8}&|Og~2T~o; z{!)o_yUU^P#_J*YNvDV16>5L_8F!{yuh!O{%UHh`VEHxse$ByCF56z5LN_UlKxqF_bBj#*Qc0@}? z;<92m{~UQ{btS*_%riZ9(HhD0!b!qi^)t;4)&*l_sj?T}uE;c^12DC=&2ALWD%04y zIJ>oOcQJXM9)VCPX1lmQLY><(3e7M?K9kml;gU|)k8pgPeFW+sso@;UAbwTYC#Qp7 za`gQ)PnAu5mYtIZ1K*`9G16}gx}SK;D0~-22rb&4!n3}#&jN+nNnoITn-yf_LUP0_ z)lT?o$?M#zuQsv*{57!O*NZg0wt8LdUiILQlEEBgxA#UD}!Lz{+m}^xleWPH?29?YmM%2=44BDC~%x6pbFM z_t&%dgF`a3#Ke~G?LkiZbFKl*v3tx|VPnUOWBXigPN{1{mhI59z+9)U#^Wyl7!_OI zv;~m@l*dnlhn z!1uF^Iydc}rP)b!uEtg%@$;7g`?dSeD>8Y)Ha;uFb8u04cK51>o{D}W+4t*&*L7`c z!*+$yKMc*(G7xuy+Y`~qaBYNC<=VKnZRVZ*!=i*0OQ)hGfw^z;WTULqy{_rbG0rtX z!3T^4Vo{Sg>&{a8tDR?zOqE1831Jzkn8d23CZr5Dq0|6aM}e>Hm7VdK=-5-S&* zBb`Vhb-;XW{Lxc0n=QXA)v~OJz`#Ib8r@cPFCC@z9IfyOKN%8)HOa;MnZANZ?Jp31 zWzJQ)Ysf2L;TfjlFn6B%0)r=I{)qn+mUU^FAe%&Hy&OVWqa$xf@e8`cTLLRwy~>Jp z4usuMsjP_dr(ONY-f%n|sM%Y2`|G6E#8K4sdlq9{R#=tY>-R1xd9PGie4ri0M;QgQ zo?rEU9odsx-0&_qO*P4uzM}a!_U7fFqYuI>3*wLu(d?^x530$)(4uuk`BjIsPhnjo zvNhZsgoVAzWCquvA5?ASbPM_4jXSEh{v%@T#>nYe!Z7dfyeJyK)!gj&Uze9 zh)?MM4RpF7!M}`J`ag~xH?B$Bh%fM=W>Z-u;&ov3i~EwJ-SYmHM?4}1bUv0&{9SR? zwr%ESjSwh*TQtS0AX$TS+5l!T+^S2t2dI_d0(v7DNL2hQFb3>9OP}nBxZriSNdHyp2))F_iKf}%6QPB@iEl6qt zYb-U)0oD^u{@UJ`;9HyPfQQRiJxNz4DA@KQBvz;kUQvrS9k7(YDSzM1k$}H}ALY$e z^my!h1Z-{vF$f%E+V+{`vqIF8TzQReg9I|*nwM8;0BHdT(hLOs~oct0b!>1oOiR6InRFA^N>+NKSjmJsJ)Cc$@G(SbMA1*jnYd zwv`0mS=e@;w|o9rDdfTPA_MP#4pS!;uiU+?Oz4t4jc=e`uzuxAYEj;2Os*KEH{0ip z+`FxvP03Z@lyrCj87py3X+)OdA+Q*V5Bot{$rwmgf@IHksRfFozi**fpLYd4G*pr= zH#Z+-Q+0$L&?jLwvVZ8Y#?zOluN@{l-5(BB30SrYzwfhb67?hI#h=%w6mDOC_4e&m zX7Zb^n%(KLp9jyboAgCDkzeewio3gWXw}cOH^}4>n_bXhk9owieqA8#+i0sFhuY*E zRZuXX#X7!#&KEAjaWp4e1Z&PD722fHGMMJ75D9W_@TtVDn@3^RcqFVZ$qu!gYa|ox zp2rNmfu&G}hsWl%=ZS4qnDT*el+T*Ispp1e@p_bm^cALrc8%+y=3@|I0GfQwuqZ** zvAYAWxS%CuU})>KdCbXA)>~`f6M3NOMrL2n-4i3c-X`%ly+BgjZLN2Fy{h`8siTc) zPcaNHxde>_A@Gfyze^++mVV_L| z9sSA_ml%~5bePDk13o@D^XEU8lg)gdL`hF`F4_#t=qU!MP-_C6AD)ztx^x zxb~r1D9WP0XV%P;ekdl?NNHsJYVV8A;q2LLM`}~Qj2c~poNY^=ip_Ss$bupH@;|X5}Ci`%5QDnw2fg zh1WJDI8361Vs-Q5(d_06g~-EOn+CZu(K*-7=Ca9Si}wuo}^l1 z?#6VBRpn8C+r}bES=ihE;uXiRdpjHcE%9KA6V(+a7wIBRo=VUm%=z0t$#mdp>bY6Tg&& zG)(K?KelWj3lS@H%W$mwT|cjtQ$tZu%NDq68#npvh5Totr)=`R&5fL(2M@NMxmdp0 zu%sHZye=KB;|oTr;dAL_h;L$TbzdB+zW^Yrw!wV6YC`#1$;j6W9@_Q_)(R&e zP*SQ^s=jNi-w?FgvZF+7QgMXfbT`D8H|1yoUHq}2EDmXFE8 zC-<<1W%)3VAGk{u6PMpvd0BXXAv&)QO8HvVljYZVL70Y_T8|L)yl>y^Ut2L+shH|* zLa>sb$k}pJ+vN-SCMGFwLG93yJ+=f91oR5`52DY}6%x5I*>GuV=ZN@# zK@*QjY&6QQbgOFc#l^0~)PZtoWJn{u3g_iJzAO$jz57+t4=E}iTs>SuVo8qo8a@(L z6U%b|i7%|~=rPH}Xtl~9c!(j>$Ej(FZQ#etzH@IL-FNBdZwA<5jn`UMbNzX&fC&Jx zv}wmfehEwb^ESooBkMsqX!qx&Jz=_edJ@YFsUod+7^yeqMV*CzKzU`{zHpAG^FqW} z@GOa+?-;Wov_L~BjZ>TsbIstPIqx$9mWF!?jYggzO$?hMFs?Akvq98MK#q_>ZX%zi z#KVvY61#+Z@Mu=3l3!MSWJ=`Dy?p7iwM{v4Dy2#LA%#v*7n+sa?hbcbgb&ozEvrka z$Rv~(KG#8n1-NE z2zmK%9(36)vX%lu`Zj~rtf_wGpjZ&n;%vR-)Ofbk`%D#W3n_1RaC20PshRTT@IaE- z)h*lCL7&S9R;u1~(Q=d3d-kZ3FJ7F#bgDN3vk5y3+&r1E2y6>U-Fu>Iea0GxV(gwg zU=X@^UtL>P=0j>RW5n@az=R|CMCOe2{nLy=WSW z+SGz*4~#KG!{XwC@R6}#4K9lfx7k%KAmyR~-wKd}wHn{1uXXdU(5L#Z3oFziJlMze zh&TiTDAxmHQ1!I--43hD1+>fP+xZpYM{mCX;fmpMfigcm4^&`XkF@mayq!4qyJhvq zR2IQSSK_)DRiV^9^ur3b7$+*%IF|~sC_VkD#k=Bop8M!y?c+szBqSIA*1V%{?*d-7 z1}#zvIA|&gN=3|dqQOSC5JOJobFbgx#h2#cN`uFgm5Wk`&Xv2hB8`n@jPqDUQ7@Qh z?rh5`rI$@DN{XFu<#4c}t?eAfOWru5(G0^-H^U}1Fd0N&S6ylbRTu4zClVoG_ZEaD z%vz0_74=E3DcTPB7zCl{V$9oJ5=cuQd*9e4>_rr+;lk7ni0WO@CTd~s^7xC?i^@Z9UgA0s!I(tkBN}$NhBC z3Jq14&-}_mBalR4@*9f?(OS_@cS_A zpwLwtLLcZb@O)7!=M1nHXqSg|x;D62IAfKUd*g++Pzgo4q<`zDT&~e%wjrb?&s(ms z7h7mXOX<+#;D^`&4b1vrT1TQ!CELdd)Gs}aQlz+saAv9fXjoWt$07>FI!$S0Gu>;f zGUG5Qvq2O}BlE+T=^s0N1-tSJMQ;vklr(=hUJ9}CA7oSJ*&S5M-rqBqU);LXx+Vl% z%aHOOkxWQ9EBoLDOrsD-l7s1YDtl|t2e%jq=1Od9q6-MT1A4;31a>C>2e+VP^Au=pGJnUayAiiWLZi)4L-`; zvJ{KnFzQgnT;oc^c(#M!IzR!ged~wwP#hAjTS)ocV|VSc5)|~szs-=)!f>P3(;CFM z`_W}_5tc^68s4I>%Hy6(hdbx`#&gZNdcf>^;+#!xVU(tHC5R&|5hCQhhX<=)`hl&> zX*)L~Fhzw${q8R~4uprDe$;dSeb4yggWhh20@p1I-;yCktJoh{IkG-O0YS`L0kQHA z`5nf8LN_m%%Qz$b9?H8FjFGi049i8%05^$<+k8|8j1wT0*pLHL2RD7A;m)+gOuw@| zyp>?K9l2a`SI=31Zvi${5c=`gI+lBwX;-eW3+8ISd>I)wSt#~3lfqM4DXrT(u&TP6|36V(&LRV;J)qEXDy^m>vBI}Obj#n3fV z$342}1^}BRn^oC+;(OtY-3T6;z>D?&XZ^!aEXZ%g#AFF2o}sDRG)CytnY;{G=J$g+ zID|?WSRo#YI$JQML+%-3s!aoqd(2#5!$7rA7g;%xXOt0&w}p!~ShycK0KgJk#f&ar z@JdUTHb9A?YT&^%Psu4DTM{sc!yvq~pDeV0db2b9azs%QH#J+S0|iE7Q!@nYyZZu& zqmy~Y4AZKQ2@jrA`Ufm*_Sb%(&)?(ZK7k_2lm9zKm<$C&&!Q$m?$~-qMXc3Nn{KzZ zk2-n?;>Ohx<1c&CdO>ng^ zxIPG9-_eOBWC_j7sn1q2?Q=P;EsUxXD)PZ^*t7C+nU_~T*C=g}L-9cwhg1YDi(%me zAMF%QQ&&bNg6%24$4Mp`Vd0Tk|rfRVYI)sLy}lcBG9E7vjzz^*RUxmI9=0lTJ_DR8c8n zCq^8NjfH@w67|S5DZ}7W{!f#|zOkaeEUx}~#CT8BH;YYNwQLj@00*B1B*eUVwxDbO zhv&Dy23M|$MW0J0k1P;s{V8cwbU3V^m^Sw*0#gzpH^DS9ZKqZs-Te&_B2%qJQpV_1 zF-{)cV1m9%ycj;Hi{wfSXBk?qx;WS z$S*s_*TC!G@Pb4d20a7!#S%URAV3bO$h#TT^YJx$-wr_^8zM=C=W`8O)eKv2M8Ku< zDd2j?yd0fVYD=V_sb@1G=9;@a;H=!H5L@v?!G8ia8yqtG!#wumA;e` z-fB8(MAx^Mz@n{rKCzh)$51igx|)XH!0ldA68|+`0QWgQcc?J8ZI`4fNshSqZvD<4 zM%vK{IzO!ZtEd0@z)Q*zv7np&_fK!Uv;$D17v`t$uOnRz? zd5WR2v4FeDqNmq`;&rIamGor(G(|>n`H$2Yt5+jG{`R+r896Dr<=vh6N5;+-ylHdV>0qclQY{zJPp+^n#sBKOk^I~Z zGE;MELz76)5x2(=@e}Zpibq&Ni~g5S{gf96Jnm(D2-%GTu{O+3SeV1xkj94TQvde( zJi$*rB7`AkC@gD8)TP0NU5OOgvb6e?7H}mkS;x{<3W1P)jz-g+;bgq5?((mh137IqM7efF5B{)TxqF_{`*;S*|%jk;&U$>e6;f5Bep4@|a4KMAR zUrUFJ?mRf^GGG4T@;7*j-qhZ^0rcdnk}-*>S2f4x-yY|6B$dS|eVV_QU=V@o&-0AF zl3t=Hn~CaGem2t+^4*;phCRT};&jO|i%kYU-cPvVN7IcDjM;rNPg_)eeI^?U!|nTV zdn|9gZk2N!U9xTi}~{XKOY$@j|Wz9ohPa+8fIQGNCO8G;K^8 zP&v^IbBgqlvvSWJ;h;i~M305&n?~)}eHR$_{hzIb89enYh*8l-AOS%Pzv-PS0VJRQ vX8}k<9{*p&1#b{{X(hp9$=DYx*!V&3ls&L#&1fgO@PH=kKfL(=-7EP&QC8n| literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 352460d9010..9a18762f6c9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4475,6 +4475,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" From a378b2eb53d2fa1007be394abd98ad80b5aa1523 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Sat, 4 Oct 2025 03:01:42 +0000 Subject: [PATCH 29/29] Automatic changelog for PR #92513 [ci skip] --- html/changelogs/AutoChangeLog-pr-92513.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-92513.yml 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