diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index 5bc3a711a1b03..c60ba12150276 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -82,6 +82,12 @@
/obj/item/clothing/glasses/meson,
/turf/open/floor/iron/dark,
/area/mine/storage/public)
+"as" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"av" = (
/obj/machinery/computer/arcade/orion_trail{
dir = 4
@@ -93,6 +99,16 @@
/obj/structure/cable,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"aF" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
+"aH" = (
+/obj/structure/railing{
+ dir = 10
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"aM" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
cycle_id = "lavaland_living_east_maint"
@@ -137,6 +153,20 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"aX" = (
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/structure/railing{
+ dir = 9
+ },
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
+"ba" = (
+/obj/structure/chair/sofa/middle{
+ dir = 1;
+ color = "#AA4A44"
+ },
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"bb" = (
/obj/structure/closet/crate/internals,
/obj/item/tank/internals/emergency_oxygen,
@@ -154,6 +184,13 @@
dir = 4
},
/area/mine/laborcamp/production)
+"be" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Raptor Ranch External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lobby/raptor)
"bf" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth_large,
@@ -197,6 +234,10 @@
},
/turf/open/floor/plating,
/area/mine/maintenance/production)
+"bE" = (
+/obj/structure/table/wood,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"bH" = (
/obj/structure/table,
/obj/item/book/manual/chef_recipes{
@@ -344,11 +385,10 @@
/turf/open/floor/plating,
/area/mine/maintenance/service)
"ct" = (
-/obj/structure/railing/wooden_fence{
- dir = 6
- },
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/structure/marker_beacon/purple,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"cw" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -506,6 +546,13 @@
},
/turf/open/floor/iron/white,
/area/mine/cafeteria)
+"de" = (
+/obj/structure/railing{
+ dir = 6
+ },
+/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
@@ -581,6 +628,19 @@
/obj/structure/lattice/catwalk/mining,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"dF" = (
+/obj/structure/table/wood,
+/obj/item/food/meat/slab,
+/obj/item/food/meat/slab{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
+"dI" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lobby/raptor)
"dJ" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -628,6 +688,12 @@
/obj/item/soap/homemade,
/turf/open/floor/iron/freezer,
/area/mine/laborcamp)
+"ej" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"eo" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -713,6 +779,18 @@
dir = 8
},
/area/mine/cafeteria)
+"eL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
+"eN" = (
+/obj/structure/chair/wood{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"eP" = (
/obj/structure/chair/sofa/left/brown,
/obj/effect/turf_decal/tile/bar/opposingcorners{
@@ -754,6 +832,9 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/laborcamp/security/maintenance)
+"fa" = (
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"fb" = (
/obj/structure/railing/corner{
dir = 4
@@ -855,6 +936,11 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"fK" = (
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/structure/railing,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"fL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -1197,6 +1283,10 @@
/obj/structure/sign/poster/official/cleanliness/directional/north,
/turf/open/floor/iron/freezer,
/area/mine/living_quarters)
+"hl" = (
+/obj/structure/tank_holder/extinguisher,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"hn" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 9
@@ -1315,8 +1405,12 @@
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"hM" = (
-/turf/closed/wall/mineral/wood/nonmetal,
-/area/lavaland/surface)
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"hR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1418,7 +1512,7 @@
"il" = (
/obj/item/flashlight/lantern/on,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"io" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -1523,6 +1617,13 @@
dir = 1
},
/area/mine/living_quarters)
+"jb" = (
+/obj/structure/railing{
+ dir = 10
+ },
+/obj/structure/lattice/catwalk/mining,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
"jc" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -1598,6 +1699,10 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"jt" = (
+/obj/structure/fireplace,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"jw" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -1642,6 +1747,11 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
+"jJ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"jL" = (
/obj/structure/stone_tile/surrounding_tile,
/obj/structure/stone_tile/surrounding_tile{
@@ -1692,11 +1802,12 @@
},
/area/mine/production)
"jX" = (
-/obj/structure/railing/wooden_fence{
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
dir = 1
},
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"ka" = (
/obj/structure/table,
/obj/machinery/newscaster/directional/north,
@@ -1707,9 +1818,19 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
+"kf" = (
+/obj/structure/railing{
+ dir = 9
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"kg" = (
/turf/closed/wall/r_wall,
/area/mine/laborcamp)
+"ki" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lobby/raptor)
"kk" = (
/obj/structure/stone_tile/block{
dir = 8
@@ -1959,10 +2080,7 @@
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"lt" = (
-/obj/structure/railing/wooden_fence{
- dir = 5
- },
-/turf/open/misc/asteroid/basalt/lava_land_surface,
+/turf/open/misc/hay/lavaland,
/area/lavaland/surface/outdoors)
"lv" = (
/obj/structure/stone_tile/block/cracked{
@@ -2100,6 +2218,10 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/mine/lounge)
+"lP" = (
+/obj/item/flashlight/lantern/on,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"lQ" = (
/obj/structure/stone_tile/surrounding/cracked{
dir = 6
@@ -2200,7 +2322,7 @@
},
/obj/item/raptor_dex,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"ml" = (
/obj/structure/stone_tile/block/cracked{
dir = 8
@@ -2613,6 +2735,12 @@
/obj/effect/spawner/random/trash/food_packaging,
/turf/open/floor/iron/checker,
/area/mine/laborcamp)
+"nO" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"nP" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/portable_atmospherics/scrubber,
@@ -2789,6 +2917,15 @@
/obj/effect/turf_decal/trimline/green/filled/line,
/turf/open/floor/iron/dark,
/area/mine/laborcamp)
+"oO" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Mining External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lobby/raptor)
"oS" = (
/obj/machinery/door/airlock/external/glass{
name = "Mining External Airlock"
@@ -2935,6 +3072,12 @@
},
/turf/open/floor/plating,
/area/mine/laborcamp)
+"pF" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"pH" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -2960,6 +3103,10 @@
/obj/structure/sign/poster/official/cleanliness/directional/north,
/turf/open/floor/iron/freezer,
/area/mine/laborcamp/quarters)
+"pM" = (
+/obj/structure/bookcase/random/reference,
+/turf/open/floor/wood,
+/area/mine/lobby/raptor)
"pO" = (
/obj/machinery/shower/directional/south,
/obj/machinery/door/window/left/directional/south,
@@ -3051,12 +3198,6 @@
dir = 4
},
/area/mine/laborcamp/quarters)
-"qi" = (
-/obj/structure/railing/wooden_fence{
- dir = 4
- },
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
"qo" = (
/obj/machinery/door/airlock/glass{
name = "Equipment Storage"
@@ -3125,6 +3266,11 @@
},
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
+"qB" = (
+/obj/machinery/smartfridge/drying_rack,
+/obj/item/food/cheese/firm_cheese,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"qH" = (
/obj/machinery/door/airlock{
id_tag = "miningbathroomprivate";
@@ -3184,6 +3330,35 @@
},
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
+"rf" = (
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
+"rj" = (
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = -1;
+ pixel_x = 5
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 9;
+ pixel_x = 8
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 9;
+ pixel_x = 2
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"rm" = (
/obj/structure/sign/warning/gas_mask/directional/west,
/obj/effect/decal/cleanable/dirt,
@@ -3225,6 +3400,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"rB" = (
+/obj/structure/chair/sofa/corner{
+ dir = 1;
+ color = "#AA4A44"
+ },
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"rF" = (
/turf/closed/wall/r_wall,
/area/mine/maintenance/labor)
@@ -3299,7 +3481,7 @@
/obj/structure/table/wood,
/obj/item/flashlight/lantern/on,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"se" = (
/turf/open/floor/iron/dark/textured_large,
/area/mine/eva)
@@ -3399,7 +3581,7 @@
"sQ" = (
/obj/structure/ore_container/food_trough/raptor_trough,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"sR" = (
/obj/machinery/light/small/directional/west,
/obj/effect/decal/cleanable/dirt,
@@ -3473,6 +3655,13 @@
dir = 4
},
/area/mine/cafeteria)
+"tf" = (
+/obj/structure/chair/sofa/corner{
+ dir = 8;
+ color = "#AA4A44"
+ },
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"tg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/door/airlock/maintenance{
@@ -3628,6 +3817,12 @@
/obj/item/crowbar/large/emergency,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"up" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"uq" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -3654,7 +3849,7 @@
"uw" = (
/obj/effect/spawner/random/lavaland_mob/raptor,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"ux" = (
/obj/machinery/door/airlock{
id_tag = "miningdorm1";
@@ -3817,6 +4012,12 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/hydroponics)
+"vr" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"vu" = (
/obj/structure/bed/medical/emergency,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -3885,6 +4086,14 @@
/obj/item/cigbutt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
+"vM" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"vN" = (
/obj/machinery/computer/records/security,
/obj/structure/cable,
@@ -3936,6 +4145,12 @@
/obj/effect/turf_decal/siding/wideplating_new,
/turf/open/floor/iron/checker,
/area/mine/laborcamp)
+"wa" = (
+/obj/machinery/camera/autoname/directional/north{
+ network = list("mine")
+ },
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"wb" = (
/obj/structure/chair{
dir = 8
@@ -4225,6 +4440,12 @@
dir = 1
},
/area/mine/storage/public)
+"xW" = (
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"yc" = (
/obj/docking_port/stationary{
dir = 2;
@@ -4399,8 +4620,7 @@
/turf/open/floor/plating,
/area/mine/maintenance/service)
"ze" = (
-/obj/effect/spawner/random/lavaland_mob/raptor,
-/turf/open/misc/asteroid/basalt/lava_land_surface,
+/turf/open/misc/ashplanet/rocky,
/area/lavaland/surface/outdoors)
"zf" = (
/obj/machinery/door/airlock{
@@ -4459,9 +4679,12 @@
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
"zs" = (
-/obj/structure/railing/wooden_fence,
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/obj/structure/railing{
+ dir = 5
+ },
+/obj/structure/lattice/catwalk/mining,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
"zw" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -4552,6 +4775,13 @@
/obj/structure/cable,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"zX" = (
+/obj/structure/chair/wood{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"Ae" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -4567,6 +4797,13 @@
},
/turf/open/floor/plating,
/area/mine/laborcamp/production)
+"Ah" = (
+/obj/machinery/microwave{
+ pixel_y = 6
+ },
+/obj/structure/table/wood,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"Ai" = (
/obj/structure/stone_tile/cracked{
dir = 1
@@ -4602,11 +4839,21 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/mining_station,
/turf/open/floor/iron/dark/textured_large,
/area/mine/production)
+"Av" = (
+/obj/structure/railing{
+ dir = 9
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Ax" = (
/obj/item/pickaxe,
/obj/effect/mob_spawn/corpse/human/miner,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Az" = (
+/obj/item/flashlight/lantern/on,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"AA" = (
/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment,
@@ -4620,6 +4867,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
+"AF" = (
+/obj/structure/lattice/catwalk/mining,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
"AI" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -4797,12 +5051,31 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
-"Cv" = (
-/obj/structure/railing/wooden_fence{
- dir = 5
+"Cn" = (
+/obj/structure/table/wood,
+/obj/item/plate{
+ pixel_x = 6;
+ pixel_y = 7
},
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/obj/item/plate{
+ pixel_x = -6;
+ pixel_y = -6
+ },
+/obj/item/reagent_containers/cup/glass/mug/tea{
+ pixel_x = 8;
+ pixel_y = -3
+ },
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
+"Cv" = (
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/structure/marker_beacon/purple,
+/obj/effect/turf_decal/sand/plating/volcanic,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"Cz" = (
/obj/machinery/door/airlock/medical/glass{
name = "Infirmary"
@@ -4901,6 +5174,9 @@
/obj/structure/curtain,
/turf/open/floor/iron/freezer,
/area/mine/living_quarters)
+"CV" = (
+/turf/closed/wall/mineral/iron,
+/area/mine/lobby/raptor)
"CX" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -4978,10 +5254,9 @@
/turf/closed/wall,
/area/mine/medical)
"DB" = (
-/obj/structure/railing/wooden_fence{
- dir = 8
- },
-/turf/open/misc/asteroid/basalt/lava_land_surface,
+/obj/structure/marker_beacon/purple,
+/obj/effect/turf_decal/sand/plating/volcanic,
+/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
"DF" = (
/obj/structure/cable,
@@ -5149,6 +5424,10 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/maintenance/service)
+"EL" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lounge)
"EM" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -5162,6 +5441,12 @@
dir = 1
},
/area/mine/production)
+"EP" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"EQ" = (
/turf/open/floor/iron/smooth_edge{
dir = 8
@@ -5216,6 +5501,12 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Fo" = (
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"Fp" = (
/obj/structure/table,
/obj/machinery/recharger,
@@ -5224,6 +5515,13 @@
},
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
+"Fr" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Mining Shuttle Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/supply/mining,
+/turf/open/floor/iron/dark/textured_large,
+/area/mine/production)
"Fs" = (
/obj/effect/turf_decal/sand/plating/volcanic,
/obj/effect/spawner/random/maintenance/two,
@@ -5267,6 +5565,10 @@
"FH" = (
/turf/closed/wall,
/area/lavaland/surface/outdoors)
+"FI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"FL" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/small/directional/west,
@@ -5388,11 +5690,8 @@
},
/area/mine/production)
"GG" = (
-/obj/structure/railing/wooden_fence{
- dir = 9
- },
-/turf/open/misc/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"GH" = (
/obj/machinery/door/airlock/glass{
name = "Arrival Lounge"
@@ -5402,6 +5701,12 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/area/mine/lounge)
+"GI" = (
+/obj/structure/rack,
+/obj/item/stack/sheet/mineral/wood/fifty,
+/obj/item/lighter,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"GL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -5464,6 +5769,18 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/plating,
/area/mine/maintenance/public/north)
+"Hj" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Mining External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lounge)
+"Hl" = (
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lounge)
"Hp" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -5781,6 +6098,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
+"Jg" = (
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/structure/railing{
+ dir = 10
+ },
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"Jh" = (
/obj/structure/cable,
/obj/machinery/light/small/directional/east,
@@ -5950,6 +6274,13 @@
dir = 1
},
/area/mine/living_quarters)
+"JQ" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Raptor Ranch External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lounge)
"JR" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -6031,6 +6362,41 @@
/obj/structure/girder,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Km" = (
+/obj/structure/rack,
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 9
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 9;
+ pixel_x = 2
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 6
+ },
+/obj/item/food/grown/grass/fairy{
+ name = "weird hay";
+ desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?";
+ pixel_y = 6;
+ pixel_x = 9
+ },
+/obj/item/crowbar/large,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"Kn" = (
/obj/machinery/telecomms/relay/preset/mining,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -6123,6 +6489,12 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
+"KO" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"KV" = (
/obj/structure/table,
/obj/machinery/light/directional/east,
@@ -6243,6 +6615,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/storage)
+"Lv" = (
+/obj/machinery/power/apc/auto_name/directional/south,
+/obj/structure/cable,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"Lw" = (
/obj/effect/turf_decal/sand/plating/volcanic,
/obj/effect/turf_decal/stripes/line{
@@ -6348,6 +6729,13 @@
},
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
+"LV" = (
+/obj/structure/railing{
+ dir = 9
+ },
+/obj/structure/lattice/catwalk/mining,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
"LY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -6392,6 +6780,10 @@
dir = 8
},
/area/mine/lounge)
+"Mf" = (
+/obj/item/kirbyplants/random,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"Mr" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -6574,6 +6966,10 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth_large,
/area/mine/laborcamp/production)
+"Ns" = (
+/obj/structure/flora/ash/fireblossom,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"Nt" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/light/small/directional/west,
@@ -6627,11 +7023,8 @@
/turf/open/floor/iron/dark,
/area/mine/production)
"NK" = (
-/obj/structure/railing/wooden_fence{
- dir = 1
- },
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/turf/open/misc/ashplanet/ash,
+/area/lavaland/surface/outdoors)
"NL" = (
/obj/structure/railing,
/obj/structure/lattice/catwalk/mining,
@@ -6641,6 +7034,13 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/mine/laborcamp/security/maintenance)
+"NP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/turf/open/floor/plating/lavaland_atmos,
+/area/mine/lobby/raptor)
"NR" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -6652,7 +7052,7 @@
/area/mine/laborcamp/production)
"NS" = (
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"NT" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6747,6 +7147,13 @@
},
/turf/open/floor/iron,
/area/mine/lounge)
+"Oo" = (
+/obj/structure/railing{
+ dir = 5
+ },
+/obj/item/reagent_containers/cup/bucket/wooden,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"Op" = (
/obj/structure/stone_tile/slab,
/turf/open/misc/asteroid/basalt/lava_land_surface,
@@ -6768,6 +7175,16 @@
dir = 4
},
/area/mine/laborcamp/security)
+"OE" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/chair/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"OH" = (
/obj/item/storage/fancy/cigarettes/cigpack_robust{
pixel_x = -8;
@@ -6824,7 +7241,7 @@
},
/obj/item/soap/deluxe,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"OZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -6834,6 +7251,10 @@
dir = 1
},
/area/mine/mechbay)
+"Pb" = (
+/obj/structure/water_source/puddle,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"Pc" = (
/obj/structure/closet/crate/grave,
/turf/open/misc/asteroid/basalt/lava_land_surface,
@@ -6844,6 +7265,13 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
+"Pe" = (
+/obj/structure/lattice/catwalk/mining,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"Pi" = (
/obj/machinery/light/small/directional/south,
/obj/effect/turf_decal/trimline/red/filled/line,
@@ -6881,6 +7309,12 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/mine/cafeteria)
+"Pn" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"Po" = (
/obj/structure/table,
/obj/item/paper/guides/jobs/security/labor_camp,
@@ -7187,6 +7621,28 @@
},
/turf/open/floor/iron/dark,
/area/mine/production)
+"Ri" = (
+/obj/item/canvas/twentythree_nineteen,
+/obj/structure/easel,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
+"Rj" = (
+/obj/machinery/suit_storage_unit/mining,
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 8
+ },
+/area/mine/eva)
+"Rm" = (
+/obj/structure/bed,
+/obj/effect/spawner/random/bedsheet,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"Ro" = (
/obj/effect/turf_decal/loading_area,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -7271,6 +7727,13 @@
/obj/structure/lattice/catwalk,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"RO" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/mine/eva)
"RV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -7332,6 +7795,11 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Sj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"Sm" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/turf_decal/siding/yellow,
@@ -7345,6 +7813,14 @@
},
/turf/open/floor/iron/dark,
/area/mine/hydroponics)
+"Sp" = (
+/obj/structure/easel,
+/obj/item/canvas/fortyfive_twentyseven,
+/obj/item/canvas/thirtysix_twentyfour,
+/obj/item/canvas/twentythree_nineteen,
+/obj/item/paint_palette,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"Sq" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/structure/cable,
@@ -7517,17 +7993,22 @@
},
/area/mine/production)
"Tt" = (
-/obj/structure/railing/wooden_fence{
- dir = 10
+/obj/item/kirbyplants/random,
+/obj/effect/turf_decal/siding/wood/end{
+ dir = 4
},
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"Tu" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/mine/laborcamp)
+"Tw" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"Tx" = (
/obj/machinery/light/small/directional/north,
/obj/effect/decal/cleanable/dirt,
@@ -7706,6 +8187,10 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"Uz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"UD" = (
/obj/structure/toilet{
dir = 8
@@ -7713,9 +8198,7 @@
/turf/open/floor/iron/freezer,
/area/mine/living_quarters)
"UI" = (
-/obj/structure/railing/wooden_fence{
- dir = 4
- },
+/obj/structure/flora/ash/stem_shroom,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"UK" = (
@@ -7796,11 +8279,9 @@
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"Vd" = (
-/obj/structure/railing/wooden_fence{
- dir = 9
- },
+/obj/structure/railing,
/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/area/mine/lobby/raptor)
"Ve" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark/textured_large,
@@ -7922,6 +8403,15 @@
},
/turf/open/floor/iron/checker,
/area/mine/laborcamp)
+"VI" = (
+/obj/effect/spawner/random/food_or_drink/donkpockets,
+/obj/effect/spawner/random/food_or_drink/donkpockets{
+ pixel_x = 6;
+ pixel_y = 5
+ },
+/obj/structure/table/wood,
+/turf/open/floor/carpet/red,
+/area/mine/lobby/raptor)
"VJ" = (
/obj/structure/closet/crate,
/obj/item/food/mint,
@@ -7945,11 +8435,11 @@
/turf/open/floor/plating,
/area/mine/maintenance/labor)
"VP" = (
-/obj/structure/railing/wooden_fence{
+/obj/effect/turf_decal/siding/wood/end{
dir = 8
},
-/turf/open/misc/hay/lavaland,
-/area/lavaland/surface)
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"VS" = (
/obj/machinery/hydroponics/constructable,
/obj/effect/decal/cleanable/dirt,
@@ -7959,6 +8449,12 @@
/obj/item/seeds/potato,
/turf/open/floor/iron/dark,
/area/mine/laborcamp)
+"VU" = (
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"VX" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -7989,6 +8485,18 @@
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/mine/lounge)
+"Wh" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Wk" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"Wl" = (
/obj/machinery/door/airlock/external/glass{
name = "Mining External Airlock"
@@ -8008,6 +8516,12 @@
dir = 1
},
/area/mine/laborcamp/security)
+"Wq" = (
+/obj/structure/railing{
+ dir = 5
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
"Wt" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/structure/disposalpipe/segment,
@@ -8174,6 +8688,10 @@
dir = 4
},
/area/mine/production)
+"Xk" = (
+/obj/effect/spawner/random/lavaland_mob/raptor,
+/turf/open/misc/hay/lavaland,
+/area/lavaland/surface/outdoors)
"Xp" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -8265,7 +8783,7 @@
/area/mine/laborcamp)
"XM" = (
/obj/structure/sign/directions/evac/directional/south{
- pixel_x = 32;
+ pixel_x = -32;
pixel_y = 0
},
/turf/open/floor/iron/dark/textured_large,
@@ -8360,6 +8878,8 @@
/area/mine/lounge)
"Yg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
/turf/open/floor/iron/dark/textured_large,
/area/mine/eva)
"Yk" = (
@@ -8438,6 +8958,14 @@
/obj/structure/barricade/wooden,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"YP" = (
+/obj/structure/bookcase/random/reference,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
"YR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -8520,6 +9048,10 @@
},
/turf/open/floor/iron/smooth,
/area/mine/laborcamp/production)
+"Zs" = (
+/obj/structure/closet/secure_closet/personal/cabinet,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"Zt" = (
/turf/closed/wall,
/area/mine/laborcamp)
@@ -8559,6 +9091,18 @@
dir = 8
},
/area/mine/lounge)
+"ZB" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood/large,
+/area/mine/lobby/raptor)
+"ZF" = (
+/obj/effect/turf_decal/sand/plating/volcanic,
+/obj/effect/turf_decal/sand/plating/volcanic,
+/turf/open/floor/plating/lavaland_atmos,
+/area/lavaland/surface/outdoors)
"ZH" = (
/obj/structure/closet/secure_closet/labor_camp_security,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -8567,6 +9111,13 @@
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/iron/dark,
/area/mine/laborcamp/security)
+"ZL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/chair/wood,
+/obj/structure/cable,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"ZM" = (
/obj/structure/railing{
dir = 8
@@ -8597,6 +9148,17 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
/turf/open/floor/plating,
/area/mine/maintenance/public/north)
+"ZU" = (
+/obj/structure/railing{
+ dir = 6
+ },
+/turf/open/misc/hay/lavaland,
+/area/mine/lobby/raptor)
+"ZX" = (
+/obj/structure/table/wood,
+/obj/item/knife,
+/turf/open/floor/wood/parquet,
+/area/mine/lobby/raptor)
"ZY" = (
/turf/closed/mineral/random/volcanic,
/area/lavaland/surface/outdoors/unexplored)
@@ -41748,8 +42310,8 @@ eA
eA
pU
pU
-aj
-aj
+pU
+pU
aj
aj
aj
@@ -41998,16 +42560,16 @@ MS
QP
LE
os
-SP
+JQ
+Hl
+Hj
+pU
+BP
+pU
+NK
+ze
pU
-ai
-ai
-ai
pU
-aj
-aj
-aj
-aj
aj
aj
"}
@@ -42255,16 +42817,16 @@ JZ
PR
ib
os
-SP
+EL
+EL
+EL
pU
pU
-ai
-ai
+ze
+BP
+ze
+pU
pU
-aj
-aj
-aj
-aj
aj
aj
"}
@@ -42515,12 +43077,12 @@ Jt
Zq
pU
pU
-ai
pU
-aj
-aj
-aj
-aj
+pU
+ze
+ze
+pU
+pU
aj
aj
aj
@@ -42773,11 +43335,11 @@ Zq
pU
pU
aj
-aj
-aj
pU
-aj
-aj
+pU
+DB
+BP
+DB
aj
aj
aj
@@ -43030,11 +43592,11 @@ pU
pU
aj
aj
-pU
-pU
-aj
aj
aj
+LV
+tF
+jb
aj
aj
aj
@@ -43289,9 +43851,9 @@ aj
aj
aj
aj
-aj
-aj
-pU
+zs
+tF
+de
aj
aj
aj
@@ -43546,9 +44108,9 @@ aj
aj
aj
pU
-aj
-pU
-pU
+DB
+BP
+DB
aj
aj
aj
@@ -43803,9 +44365,9 @@ aj
aj
aj
pU
-ad
-ad
-ai
+pU
+pU
+pU
aj
aj
aj
@@ -44059,11 +44621,11 @@ aj
aj
aj
pU
-ai
-ad
-ad
-ai
-aj
+pU
+pU
+BP
+pU
+pU
aj
aj
"}
@@ -44315,14 +44877,14 @@ aj
aj
aj
aj
-pU
-ad
-ad
-ad
-ad
+aj
+aj
+NK
+NK
pU
aj
aj
+aj
"}
(140,1,1) = {"
aa
@@ -44573,13 +45135,13 @@ aj
aj
aj
aj
-ad
-ad
-ad
-ad
+pU
+pU
+ze
pU
aj
aj
+aj
"}
(141,1,1) = {"
aa
@@ -44831,10 +45393,10 @@ aj
aj
aj
pU
-ad
-ad
-ad
-ai
+BP
+ze
+pU
+pU
aj
aj
"}
@@ -45088,11 +45650,11 @@ aj
aj
aj
pU
-ai
-ad
-ad
-ad
-aj
+NK
+pU
+pU
+pU
+pU
aj
"}
(143,1,1) = {"
@@ -45344,10 +45906,10 @@ aj
aj
aj
aj
+aj
+pU
pU
pU
-ai
-ai
pU
aj
aj
@@ -45603,9 +46165,9 @@ aj
aj
aj
aj
-pU
-pU
-aj
+DB
+BP
+DB
aj
aj
"}
@@ -45860,9 +46422,9 @@ aj
aj
aj
aj
-aj
-aj
-aj
+LV
+tF
+jb
aj
aj
"}
@@ -46116,10 +46678,10 @@ aj
aj
aj
aj
-pU
-aj
-aj
aj
+zs
+tF
+de
aj
aj
"}
@@ -46372,11 +46934,11 @@ pU
aj
aj
aj
-aj
pU
-ai
-aj
-aj
+pU
+DB
+BP
+DB
aj
aj
"}
@@ -46628,12 +47190,12 @@ pU
pU
aj
aj
-aj
pU
-ad
-ad
pU
-aj
+pU
+pU
+pU
+pU
aj
aj
"}
@@ -46882,16 +47444,16 @@ BP
BP
Lw
pU
-pU
-aj
-aj
-aj
-aj
-ai
-ad
aj
aj
aj
+pU
+pU
+NK
+BP
+ze
+pU
+pU
aj
"}
(150,1,1) = {"
@@ -47139,14 +47701,14 @@ BP
BP
Lw
pU
-pU
-aj
-aj
aj
aj
aj
pU
-aj
+ze
+ze
+ze
+ze
aj
aj
aj
@@ -47381,7 +47943,7 @@ lb
Yl
Le
Le
-NU
+Fr
Le
Le
BP
@@ -47396,14 +47958,14 @@ BP
BP
Lw
pU
-pU
-aj
-aj
aj
aj
aj
pU
-aj
+BP
+ze
+NK
+pU
aj
aj
aj
@@ -47637,9 +48199,9 @@ Ra
oh
pK
NU
-pU
-aj
-aj
+BP
+BP
+BP
JD
BP
BP
@@ -47656,11 +48218,11 @@ pU
pU
aj
aj
-aj
-aj
-aj
-aj
-aj
+pU
+NK
+NK
+pU
+pU
aj
aj
aj
@@ -47894,9 +48456,9 @@ Kc
mT
pK
pU
-aj
-aj
-pU
+BP
+ZF
+BP
JD
BP
BP
@@ -47913,12 +48475,12 @@ pU
pU
aj
aj
-aj
-aj
pU
pU
-aj
-aj
+pU
+pU
+pU
+pU
aj
aj
"}
@@ -48151,9 +48713,9 @@ Yg
li
dK
pU
-aj
-aj
-pU
+Cv
+BP
+Cv
zk
mc
mc
@@ -48170,14 +48732,14 @@ pU
pU
aj
aj
-aj
pU
+DB
+BP
+DB
pU
aj
aj
aj
-aj
-aj
"}
(155,1,1) = {"
aa
@@ -48408,9 +48970,9 @@ Yg
TQ
dK
pU
-aj
-aj
-pU
+aX
+BP
+Jg
pU
pU
pU
@@ -48428,9 +48990,9 @@ pU
aj
aj
aj
-pU
-aj
-aj
+LV
+tF
+jb
aj
aj
aj
@@ -48661,13 +49223,13 @@ lb
pK
Ob
IL
-IL
+Rj
KV
pK
aj
-aj
-aj
-aj
+yV
+BP
+fK
pU
pU
pU
@@ -48685,9 +49247,9 @@ aj
aj
aj
aj
-aj
-aj
-aj
+yV
+tF
+NL
aj
aj
aj
@@ -48918,13 +49480,13 @@ NU
pK
pK
dK
-dK
+RO
pK
pK
aj
-aj
-aj
-aj
+yV
+tF
+NL
aj
aj
pU
@@ -48942,9 +49504,9 @@ aj
aj
aj
aj
-aj
-aj
-aj
+zs
+tF
+de
aj
aj
aj
@@ -49175,13 +49737,13 @@ NU
ai
pU
pU
+Pn
pU
aj
aj
-aj
-pU
-pU
-aj
+yV
+tF
+NL
aj
aj
aj
@@ -49197,11 +49759,11 @@ aj
aj
pU
pU
-pU
-pU
-pU
-pU
-pU
+aj
+aj
+DB
+BP
+DB
pU
pU
aj
@@ -49432,37 +49994,37 @@ pU
pU
pU
pU
-aj
+AF
aj
aj
pU
-ad
-ad
+yV
+tF
+NL
+aj
+aj
pU
aj
aj
aj
aj
+pU
+aj
+aj
aj
aj
pU
pU
+pU
+pU
aj
+pU
+pU
+pU
+pU
aj
aj
aj
-GG
-DB
-DB
-hM
-hM
-hM
-hM
-hM
-hM
-hM
-hM
-hM
"}
(160,1,1) = {"
aa
@@ -49689,16 +50251,16 @@ pU
aj
aj
aj
+AF
aj
-aj
-pU
-pU
-pU
pU
aj
+yV
+tF
+NL
aj
pU
-aj
+pU
aj
aj
aj
@@ -49708,18 +50270,18 @@ aj
aj
aj
pU
-jX
pU
pU
-NK
-sQ
-NS
-zs
-NS
-NS
-sQ
-NS
-hM
+pU
+ze
+ze
+ze
+pU
+pU
+pU
+aj
+aj
+aj
"}
(161,1,1) = {"
aa
@@ -49946,37 +50508,37 @@ aj
aj
aj
aj
+AF
aj
aj
aj
-pU
-aj
-aj
-aj
-aj
+zs
+tF
+de
aj
aj
aj
aj
aj
+pU
aj
aj
aj
aj
aj
pU
-jX
pU
pU
+ze
NK
-il
-NS
-zs
-NS
-NS
-il
-NS
-hM
+ze
+BP
+pU
+pU
+pU
+aj
+aj
+pU
"}
(162,1,1) = {"
aa
@@ -50203,13 +50765,13 @@ aj
aj
aj
aj
+AF
aj
aj
aj
-aj
-aj
-aj
-aj
+ct
+BP
+ct
pU
aj
aj
@@ -50220,20 +50782,20 @@ aj
aj
aj
aj
-aj
pU
-jX
pU
pU
+ze
+BP
NK
-NS
-NS
-zs
-NS
-NS
-NS
-NS
-hM
+ze
+pU
+pU
+pU
+aj
+aj
+pU
+pU
"}
(163,1,1) = {"
aa
@@ -50460,37 +51022,37 @@ ai
ai
pU
pU
-pU
-pU
-aj
+AF
aj
aj
aj
+BP
+BP
+BP
pU
pU
aj
aj
-aj
-aj
-aj
-aj
+pU
+pU
+pU
pU
aj
pU
pU
pU
-jX
+ze
+ze
+NK
+ze
+lP
+pU
+pU
+pU
+aj
+aj
pU
pU
-Cv
-qi
-NS
-ct
-NS
-NS
-qi
-qi
-hM
"}
(164,1,1) = {"
aa
@@ -50717,37 +51279,37 @@ ai
ai
ai
ai
+Pn
+AF
+AF
+AF
+Pe
+BP
+BP
+BP
+BP
pU
pU
pU
pU
-aj
-aj
pU
-aj
-aj
-aj
-pU
-aj
-aj
-aj
pU
pU
+lt
+Ri
+eN
pU
+ze
+ze
+ze
+ze
pU
pU
+aj
+aj
+aj
pU
-ze
pU
-NS
-NS
-NS
-NS
-NS
-uw
-NS
-NS
-hM
"}
(165,1,1) = {"
aa
@@ -50978,33 +51540,33 @@ ai
pU
pU
pU
+AF
+BP
+BP
+BP
+BP
+ct
pU
-aj
-aj
-aj
-aj
pU
pU
-aj
-aj
pU
pU
+lt
+Ns
+lt
pU
pU
pU
pU
+ze
pU
pU
+aj
+aj
+aj
+aj
+pU
pU
-NS
-mk
-sa
-NS
-NS
-NS
-OW
-sa
-hM
"}
(166,1,1) = {"
aa
@@ -51232,36 +51794,36 @@ aj
aj
ai
ai
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-pU
+CV
+CV
+ki
+NP
+ki
+CV
+CV
+CV
+lt
pU
pU
pU
pU
pU
pU
+lt
pU
+lP
pU
+BP
pU
pU
pU
+aj
+aj
+aj
+aj
+aj
+aj
pU
-NS
-NS
-uw
-NS
-NS
-NS
-NS
-NS
-hM
"}
(167,1,1) = {"
aa
@@ -51488,14 +52050,19 @@ aj
aj
aj
aj
-aj
-pU
-pU
-pU
-pU
+CV
+CV
+Km
+qB
+eL
+Ah
+VI
+ZX
+ki
+Ns
+lt
pU
-aj
-aj
+BP
pU
pU
pU
@@ -51506,19 +52073,14 @@ pU
pU
pU
pU
+aj
+aj
+aj
pU
-jX
pU
+aj
+aj
pU
-Vd
-VP
-NS
-Tt
-NS
-NS
-VP
-VP
-hM
"}
(168,1,1) = {"
aa
@@ -51745,37 +52307,37 @@ aj
aj
aj
aj
-aj
-aj
-pU
-pU
-pU
-pU
-pU
-aj
-pU
-pU
-pU
-pU
+CV
+GG
+jX
+Tw
+eL
+aF
+pF
+dF
+ki
+lt
+lt
+lt
pU
pU
pU
+BP
+NK
+NK
+ze
pU
pU
pU
+aj
+aj
+aj
pU
-jX
pU
pU
-NK
-NS
-NS
-zs
-NS
-NS
-NS
-NS
-hM
+aj
+aj
+aj
"}
(169,1,1) = {"
aa
@@ -52002,296 +52564,39 @@ ai
pU
aj
aj
-aj
-aj
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
+CV
+Sp
+OE
+as
+ZL
+Cn
+zX
+CV
+CV
pU
+lt
pU
pU
-jX
pU
pU
+ze
NK
-il
-NS
-zs
-NS
-NS
-il
-NS
-hM
-"}
-(170,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-pU
-pU
-pU
-ad
-ad
-ai
-ai
-ai
-ai
-ad
+ze
+BP
pU
pU
pU
aj
aj
aj
-aj
-aj
-aj
-aj
-pU
-pU
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-fQ
-fQ
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-pU
-pU
-pU
-pU
-pU
-pU
-pU
pU
pU
-pU
-ai
-ai
-ai
-ai
-pU
aj
aj
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-jX
-pU
-pU
-NK
-sQ
-NS
-zs
-NS
-NS
-sQ
-NS
-hM
+aj
+aj
"}
-(171,1,1) = {"
+(170,1,1) = {"
aa
aa
aa
@@ -52306,14 +52611,14 @@ aa
pU
pU
pU
-pU
+ad
ad
ai
ai
ai
ai
ad
-ad
+pU
pU
pU
aj
@@ -52482,162 +52787,152 @@ fQ
fQ
fQ
fQ
-fQ
-fQ
-fQ
-ZY
-ZY
-ZY
-ZY
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-ai
-ai
-ai
-ai
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-lt
-UI
-UI
-hM
-hM
-hM
-hM
-hM
-hM
-hM
-hM
-hM
-"}
-(172,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-pU
-pU
-pU
-pU
-ad
-ai
-ai
-ai
-ai
-ad
-ad
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-pU
-pU
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+fQ
+fQ
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+ai
+ai
+ai
+ai
+pU
+CV
+GG
+Tt
+fa
+eL
+ZB
+GG
+CV
+pU
+pU
+pU
+lP
+pU
+BP
+pU
+ze
+NK
+pU
+UI
+pU
+pU
+pU
+pU
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+"}
+(171,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+pU
+pU
+pU
+pU
+ad
+ai
+ai
+ai
+ai
+ad
+ad
+pU
+pU
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+pU
+pU
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
fQ
fQ
fQ
@@ -52756,6 +53051,16 @@ ZY
ZY
ZY
ZY
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+ZY
+ZY
+ZY
+ZY
ZY
ZY
ZY
@@ -52770,42 +53075,42 @@ aj
aj
aj
aj
-aj
-pU
ai
ai
+ai
+CV
+wa
+rB
+fa
+eL
+Lv
+CV
+CV
+CV
+ct
pU
pU
pU
pU
pU
+ze
pU
pU
+lt
+lt
+lt
+UI
pU
+aj
pU
pU
+aj
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
aj
aj
"}
-(173,1,1) = {"
+(172,1,1) = {"
aa
aa
aa
@@ -52817,7 +53122,7 @@ aa
aa
aa
aa
-ok
+pU
pU
pU
pU
@@ -52827,7 +53132,7 @@ ai
ai
ai
ad
-pU
+ad
pU
pU
aj
@@ -53009,7 +53314,6 @@ fQ
fQ
fQ
fQ
-fQ
ZY
ZY
ZY
@@ -53022,47 +53326,48 @@ pU
pU
pU
pU
+pU
+pU
aj
aj
aj
aj
aj
-aj
-aj
-aj
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
pU
+ai
+CV
+jt
+ba
+fa
+jJ
+ZB
+be
+dI
+oO
+BP
pU
+BP
pU
pU
pU
+ct
+BP
+lt
+lt
+Ns
+lt
+lt
pU
pU
pU
pU
pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
pU
-aj
pU
aj
aj
"}
-(174,1,1) = {"
+(173,1,1) = {"
aa
aa
aa
@@ -53074,7 +53379,7 @@ aa
aa
aa
aa
-ad
+ok
pU
pU
pU
@@ -53274,8 +53579,8 @@ ZY
ZY
ZY
ZY
-ZY
-ZY
+pU
+pU
pU
pU
pU
@@ -53287,39 +53592,39 @@ aj
aj
aj
aj
-aj
-aj
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
+CV
+GG
+tf
+fa
+Sj
+ZB
+CV
+CV
+CV
+ct
pU
pU
pU
pU
pU
+BP
+Av
+Wh
+Wh
+CV
+ki
+ki
+CV
+CV
+ki
+ki
+CV
+CV
pU
pU
aj
-aj
-aj
-aj
-aj
-aj
-aj
"}
-(175,1,1) = {"
+(174,1,1) = {"
aa
aa
aa
@@ -53332,15 +53637,15 @@ aa
aa
aa
ad
-ad
pU
pU
-Si
+pU
+ad
ai
ai
ai
ai
-yy
+ad
pU
pU
pU
@@ -53524,7 +53829,6 @@ fQ
fQ
fQ
fQ
-fQ
ZY
ZY
ZY
@@ -53545,41 +53849,39 @@ aj
aj
aj
aj
-aj
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
+CV
+rf
+VP
+fa
+Sj
+ZB
+Mf
+CV
+hl
pU
+lt
+lt
pU
pU
+lt
+lt
+up
+lt
pU
-aj
-aj
+vr
+sQ
+NS
+Vd
+NS
+NS
+sQ
+NS
+CV
pU
pU
aj
-aj
-aj
"}
-(176,1,1) = {"
-aa
-aa
-aa
+(175,1,1) = {"
aa
aa
aa
@@ -53591,12 +53893,16 @@ aa
aa
aa
aa
-ok
+ad
+ad
+pU
pU
+Si
ai
ai
ai
ai
+yy
pU
pU
pU
@@ -53607,7 +53913,6 @@ aj
aj
aj
aj
-aj
pU
pU
fQ
@@ -53782,8 +54087,6 @@ fQ
fQ
fQ
fQ
-fQ
-ZY
ZY
ZY
ZY
@@ -53802,38 +54105,40 @@ aj
aj
aj
aj
+aj
+CV
+GI
+vM
+FI
+jJ
+Fo
+hM
+CV
+CV
+Ns
+lt
pU
pU
+lt
+lt
+lt
+up
pU
pU
+vr
+il
+NS
+Vd
+NS
+NS
+il
+NS
+ki
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-pU
-aj
-aj
-aj
-aj
aj
aj
"}
-(177,1,1) = {"
+(176,1,1) = {"
aa
aa
aa
@@ -53848,12 +54153,12 @@ aa
aa
aa
aa
+ok
pU
-pU
-pU
-ad
-ad
-pU
+ai
+ai
+ai
+ai
pU
pU
pU
@@ -54040,8 +54345,7 @@ fQ
fQ
fQ
fQ
-fQ
-fQ
+ZY
ZY
ZY
ZY
@@ -54054,43 +54358,44 @@ ZY
pU
pU
pU
+aj
+aj
+aj
+aj
+aj
+CV
+pM
+YP
+GG
+Uz
+Uz
+Uz
+Zs
+ki
+lt
+lt
pU
pU
pU
+lt
pU
+Wk
+UI
+ct
+vr
+NS
+NS
+Vd
+NS
+NS
+NS
+NS
+ki
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
aj
"}
-(178,1,1) = {"
+(177,1,1) = {"
aa
aa
aa
@@ -54108,8 +54413,8 @@ aa
pU
pU
pU
-pU
-pU
+ad
+ad
pU
pU
pU
@@ -54299,111 +54604,110 @@ fQ
fQ
fQ
fQ
-fQ
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-"}
-(179,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ad
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-pU
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+pU
+pU
+pU
+pU
+pU
+aj
+aj
+CV
+CV
+YP
+GG
+fa
+fa
+Rm
+bE
+ki
+lt
+pU
+pU
+pU
+pU
+pU
+pU
+Wk
+pU
+lt
+Wq
+EP
+NS
+ZU
+NS
+NS
+EP
+EP
+CV
+CV
+pU
+aj
+"}
+(178,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+pU
+pU
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
fQ
fQ
fQ
@@ -54567,44 +54871,48 @@ ZY
ZY
ZY
ZY
-ZY
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
pU
pU
pU
pU
pU
+aj
+aj
+CV
+CV
+ki
+ki
+ki
+CV
+CV
+CV
+lt
pU
pU
+lt
pU
pU
pU
-aj
-aj
-aj
-aj
-aj
+VU
+Xk
+lt
+NS
+NS
+NS
+NS
+NS
+uw
+NS
+NS
+NS
+ki
pU
aj
-aj
-aj
"}
-(180,1,1) = {"
+(179,1,1) = {"
+aa
+aa
+aa
aa
aa
aa
@@ -54616,8 +54924,6 @@ aa
aa
aa
aa
-HX
-pU
ad
pU
pU
@@ -54628,10 +54934,9 @@ pU
pU
pU
pU
-pU
-pU
-pU
-pU
+aj
+aj
+aj
aj
aj
aj
@@ -54815,8 +55120,7 @@ fQ
fQ
fQ
fQ
-fQ
-fQ
+ZY
ZY
ZY
ZY
@@ -54830,6 +55134,9 @@ pU
pU
pU
pU
+aj
+aj
+aj
pU
pU
pU
@@ -54839,29 +55146,27 @@ pU
pU
pU
pU
+Ns
+Az
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
+lt
+lt
+lt
+NS
+mk
+sa
+NS
+NS
+NS
+OW
+sa
+NS
+ki
aj
-pU
aj
"}
-(181,1,1) = {"
+(180,1,1) = {"
aa
aa
aa
@@ -54873,7 +55178,9 @@ aa
aa
aa
aa
+HX
pU
+ad
pU
pU
pU
@@ -54887,10 +55194,8 @@ pU
pU
pU
pU
-pU
-pU
-pU
-pU
+aj
+aj
aj
aj
pU
@@ -55098,27 +55403,27 @@ pU
pU
pU
pU
+lt
+lt
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-pU
-pU
-pU
-aj
-aj
+xW
+lt
+lt
+lt
+NS
+NS
+uw
+NS
+NS
+NS
+NS
+NS
+NS
+ki
pU
aj
"}
-(182,1,1) = {"
+(181,1,1) = {"
aa
aa
aa
@@ -55143,11 +55448,11 @@ pU
pU
pU
pU
-aj
-aj
-aj
-aj
-aj
+pU
+pU
+pU
+pU
+pU
aj
aj
pU
@@ -55340,12 +55645,6 @@ ZY
ZY
ZY
ZY
-ZY
-pU
-pU
-pU
-pU
-pU
pU
pU
pU
@@ -55362,20 +55661,26 @@ pU
pU
pU
pU
+lt
pU
pU
-aj
-aj
-pU
-pU
-pU
-pU
+Wk
+lt
+lt
+kf
+KO
+NS
+aH
+NS
+NS
+KO
+KO
+CV
+CV
pU
aj
-aj
-aj
"}
-(183,1,1) = {"
+(182,1,1) = {"
aa
aa
aa
@@ -55399,7 +55704,7 @@ pU
pU
pU
pU
-aj
+pU
aj
aj
aj
@@ -55616,23 +55921,23 @@ pU
pU
pU
pU
+Wk
pU
+ct
+vr
+NS
+rj
+Vd
+NS
+NS
+NS
+NS
+ki
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
aj
aj
-aj
-pU
"}
-(184,1,1) = {"
+(183,1,1) = {"
aa
aa
aa
@@ -55645,8 +55950,8 @@ aa
aa
aa
pU
-ad
-ai
+pU
+pU
pU
pU
pU
@@ -55871,25 +56176,25 @@ pU
pU
pU
pU
+lt
+lt
+Wk
pU
pU
+vr
+il
+NS
+Vd
+NS
+NS
+il
+NS
+ki
pU
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-pU
-pU
-aj
-aj
"}
-(185,1,1) = {"
+(184,1,1) = {"
aa
aa
aa
@@ -55901,10 +56206,10 @@ aa
aa
aa
aa
-ad
+pU
ad
ai
-wv
+pU
pU
pU
pU
@@ -55922,7 +56227,6 @@ aj
aj
aj
pU
-pU
fQ
fQ
fQ
@@ -56112,6 +56416,7 @@ ZY
ZY
ZY
ZY
+ZY
pU
pU
pU
@@ -56127,26 +56432,26 @@ pU
pU
pU
pU
+lt
+Ns
+lt
+up
+Pb
pU
+vr
+sQ
+NS
+Vd
+NS
+NS
+sQ
+NS
+CV
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-pU
-aj
-aj
-aj
aj
"}
-(186,1,1) = {"
+(185,1,1) = {"
aa
aa
aa
@@ -56161,7 +56466,7 @@ aa
ad
ad
ai
-ad
+wv
pU
pU
pU
@@ -56360,225 +56665,155 @@ fQ
fQ
fQ
fQ
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-ZY
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-"}
-(187,1,1) = {"
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-aa
-ad
-ad
-ai
-ad
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-aj
-pU
-pU
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
-fQ
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+ZY
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+lt
+lt
+BP
+Oo
+ej
+nO
+CV
+ki
+ki
+CV
+CV
+ki
+ki
+CV
+CV
+pU
+aj
+aj
+"}
+(186,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ad
+ad
+ai
+ad
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+aj
+pU
+pU
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
fQ
fQ
fQ
@@ -56618,6 +56853,77 @@ fQ
fQ
fQ
fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+ZY
+ZY
ZY
ZY
ZY
@@ -56642,9 +56948,14 @@ pU
pU
pU
pU
+ct
+BP
pU
pU
pU
+lt
+pU
+pU
pU
pU
pU
@@ -56652,15 +56963,9 @@ pU
pU
pU
pU
-aj
-aj
-aj
-aj
-aj
-aj
aj
"}
-(188,1,1) = {"
+(187,1,1) = {"
aa
aa
aa
@@ -56675,6 +56980,7 @@ aa
ad
ad
ai
+ad
pU
pU
pU
@@ -56691,7 +56997,6 @@ aj
aj
aj
aj
-aj
pU
pU
fQ
@@ -56884,7 +57189,6 @@ ZY
pU
pU
pU
-yc
pU
pU
pU
@@ -56902,22 +57206,23 @@ pU
pU
pU
pU
+lt
pU
pU
+lt
+Ns
+lt
+lt
+pU
pU
pU
pU
pU
pU
-aj
-aj
-aj
-aj
-aj
aj
aj
"}
-(189,1,1) = {"
+(188,1,1) = {"
aa
aa
aa
@@ -56930,8 +57235,8 @@ aa
aa
aa
ad
-HX
-pU
+ad
+ai
pU
pU
pU
@@ -57157,24 +57462,24 @@ pU
pU
pU
pU
+lt
+lt
+lt
pU
+lt
+lt
+lt
+lt
+lt
pU
pU
-pU
-pU
-pU
-pU
-pU
-pU
-aj
-aj
aj
aj
aj
aj
aj
"}
-(190,1,1) = {"
+(189,1,1) = {"
aa
aa
aa
@@ -57186,6 +57491,7 @@ aa
aa
aa
aa
+ad
HX
pU
pU
@@ -57196,19 +57502,17 @@ pU
pU
pU
pU
-pU
-pU
-pU
aj
-pU
+aj
+aj
+aj
+aj
+aj
+aj
aj
aj
pU
pU
-pU
-pU
-pU
-fQ
fQ
fQ
fQ
@@ -57395,10 +57699,266 @@ ZY
ZY
ZY
ZY
+ZY
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+Ns
+pU
+pU
+UI
+lt
+lt
+Ns
+lt
+pU
+aj
+aj
+aj
+aj
+aj
+aj
+"}
+(190,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+HX
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+pU
+aj
+pU
+aj
+aj
+pU
pU
pU
pU
pU
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+fQ
+ZY
+ZY
+ZY
+ZY
+ZY
+pU
+pU
pU
pU
pU
@@ -57422,6 +57982,8 @@ pU
pU
pU
pU
+lt
+lt
pU
aj
aj
@@ -58430,7 +58992,7 @@ pU
pU
pU
pU
-pU
+yc
pU
pU
pU
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 2250cc17d409b..17a558b4f5efc 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -55250,6 +55250,7 @@
"tvQ" = (
/obj/structure/chair/sofa/bench,
/obj/effect/landmark/start/prisoner,
+/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/prison)
"twf" = (
diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm
index 2c8a12c6c5793..6648b51f55dfc 100644
--- a/_maps/virtual_domains/island_brawl.dmm
+++ b/_maps/virtual_domains/island_brawl.dmm
@@ -3466,12 +3466,7 @@
/area/virtual_domain/fullbright)
"Rk" = (
/obj/structure/table/glass,
-/obj/machinery/fax{
- fax_name = "Beach Hotel Fax";
- name = "Beach Hotel's Fax Machine";
- pixel_y = 8;
- visible_to_network = 0
- },
+/obj/item/storage/box/donkpockets,
/turf/open/floor/iron/dark/diagonal,
/area/virtual_domain)
"Rs" = (
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 5db7227521a3f..eacdd868a9556 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -76,7 +76,7 @@
#define SPAN_SINGING "singing"
#define SPAN_TAPE_RECORDER "tape_recorder"
#define SPAN_SMALL_VOICE "small"
-
+#define SPAN_SOAPBOX "soapbox"
//bitflag #defines for return value of the radio() proc.
/// Makes the message use italics
#define ITALICS (1<<0)
diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm
index 0447e87f532fe..fadd00053156d 100644
--- a/code/__DEFINES/span.dm
+++ b/code/__DEFINES/span.dm
@@ -120,6 +120,7 @@
#define span_small(str) ("" + str + "")
#define span_smallnotice(str) ("" + str + "")
#define span_smallnoticeital(str) ("" + str + "")
+#define span_soapbox(str) ("" + str + "")
#define span_spiderbroodmother(str) ("" + str + "")
#define span_spiderscout(str) ("" + str + "")
#define span_spiderbreacher(str) ("" + str + "")
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 8d460c3aecb6f..5e9f2b35ef04d 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -298,9 +298,12 @@
#define SSEXPLOSIONS_THROWS 3
// Machines subsystem subtasks.
-#define SSMACHINES_APCS_EARLY 1
-#define SSMACHINES_MACHINES 2
-#define SSMACHINES_APCS_LATE 3
+#define SSMACHINES_MACHINES 1
+#define SSMACHINES_APCS_EARLY 2
+#define SSMACHINES_APCS_ENVIRONMENT 3
+#define SSMACHINES_APCS_LIGHTS 4
+#define SSMACHINES_APCS_EQUIPMENT 5
+#define SSMACHINES_APCS_LATE 6
// Wardrobe subsystem tasks
#define SSWARDROBE_STOCK 1
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index a2925ee2e5b68..6c2fc4be7a02f 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -72,7 +72,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// Trait added to the user of a hippocratic oath status effect
#define TRAIT_HIPPOCRATIC_OATH "hippocratic_oath"
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
-#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
/// Makes it so the mob can use guns regardless of tool user status
#define TRAIT_GUN_NATURAL "gunnatural"
/// Causes death-like unconsciousness
@@ -234,6 +233,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_EXAMINE_FITNESS "reveal_power_level"
/// These mobs have particularly hygienic tongues
#define TRAIT_WOUND_LICKER "wound_licker"
+/// Mobs with this trait are allowed to use silicon emotes
+#define TRAIT_SILICON_EMOTES_ALLOWED "silicon_emotes_allowed"
/// This trait designate that the mob was originally a monkey
#define TRAIT_BORN_MONKEY "born_as_a_monkey"
@@ -972,6 +973,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// changelings with this trait can no longer talk over the hivemind
#define TRAIT_CHANGELING_HIVEMIND_MUTE "ling_mute"
+/// This guy is a hulk! (Bulky and green, lacks tact)
#define TRAIT_HULK "hulk"
/// Isn't attacked harmfully by blob structures
#define TRAIT_BLOB_ALLY "blob_ally"
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index 759101dc2abd5..47887ede45ebf 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -225,8 +225,6 @@
#define SPEED_TRAIT "speed_trait"
/// Trait given to mobs that have been autopsied
#define AUTOPSY_TRAIT "autopsy_trait"
-/// Trait given by [/datum/status_effect/blessing_of_insanity]
-#define MAD_WIZARD_TRAIT "mad_wizard_trait"
///From the market_crash event
#define MARKET_CRASH_EVENT_TRAIT "crashed_market_event"
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index 76c69425bf54b..e44516d2f2873 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -312,7 +312,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items
list(//equipment
/obj/item/clothing/glasses/hud/security = 1,
/obj/item/clothing/glasses/sunglasses = 1,
- /obj/item/clothing/gloves/color/black = 1,
+ /obj/item/clothing/gloves/color/black/security = 1,
/obj/item/clothing/gloves/color/yellow = 1,
/obj/item/clothing/gloves/tackler/combat = 1,
/obj/item/clothing/head/helmet/toggleable/justice = 1,
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index d098e1c11fb82..df177e568609e 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -273,7 +273,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HUSK" = TRAIT_HUSK,
"TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER,
"TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION,
- "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN,
"TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN,
"TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY,
"TRAIT_ILLITERATE" = TRAIT_ILLITERATE,
@@ -439,6 +438,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
+ "TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index a0ec998701541..4cb03eedba8eb 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -101,7 +101,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_HOLY" = TRAIT_HOLY,
"TRAIT_HUSK" = TRAIT_HUSK,
"TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION,
- "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN,
"TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN,
"TRAIT_ILLITERATE" = TRAIT_ILLITERATE,
"TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED,
@@ -200,6 +199,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
+ "TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index c3b91173a45f5..476140acb1edd 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -79,6 +79,7 @@
using = new /atom/movable/screen/resist(null, src)
using.icon = ui_style
using.screen_loc = ui_above_movement
+ using.update_appearance()
hotkeybuttons += using
throw_icon = new /atom/movable/screen/throw_catch(null, src)
diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm
index 5fa44b7f0542b..371341aec0bf5 100644
--- a/code/_onclick/hud/new_player.dm
+++ b/code/_onclick/hud/new_player.dm
@@ -63,8 +63,7 @@
///Set the HUD in New, as lobby screens are made before Atoms are Initialized.
/atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...)
- if(our_hud)
- hud = our_hud
+ set_new_hud(our_hud)
return ..()
///Run sleeping actions after initialize
diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm
index bcdcd0e74fed1..0a3732e134fc4 100644
--- a/code/_onclick/hud/parallax/parallax.dm
+++ b/code/_onclick/hud/parallax/parallax.dm
@@ -275,7 +275,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer)
. = ..()
// Parallax layers are independant of hud, they care about client
// Not doing this will just create a bunch of hard deletes
- hud = null
+ set_new_hud(hud_owner = null)
if(template)
return
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 8cc29740870ca..315efe4877810 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -45,8 +45,9 @@
/atom/movable/screen/Initialize(mapload, datum/hud/hud_owner)
. = ..()
- if(hud_owner && istype(hud_owner))
- hud = hud_owner
+ if(isnull(hud_owner)) //some screens set their hud owners on /new, this prevents overriding them with null post atoms init
+ return
+ set_new_hud(hud_owner)
/atom/movable/screen/Destroy()
master_ref = null
@@ -72,10 +73,25 @@
/atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params)
return
+///setter used to set our new hud
+/atom/movable/screen/proc/set_new_hud(datum/hud/hud_owner)
+ if(hud)
+ UnregisterSignal(hud, COMSIG_QDELETING)
+ if(isnull(hud_owner))
+ hud = null
+ return
+ hud = hud_owner
+ RegisterSignal(hud, COMSIG_QDELETING, PROC_REF(on_hud_delete))
+
/// Returns the mob this is being displayed to, if any
/atom/movable/screen/proc/get_mob()
return hud?.mymob
+/atom/movable/screen/proc/on_hud_delete(datum/source)
+ SIGNAL_HANDLER
+
+ set_new_hud(hud_owner = null)
+
/atom/movable/screen/text
icon = null
icon_state = null
diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm
index 3e07eca8a2e87..25c2b3365fbe6 100644
--- a/code/controllers/subsystem/machines.dm
+++ b/code/controllers/subsystem/machines.dm
@@ -11,10 +11,17 @@ SUBSYSTEM_DEF(machines)
VAR_PRIVATE/list/all_machines = list()
var/list/processing = list()
+ var/list/processing_apcs = list()
+
var/list/currentrun = list()
- var/list/apc_early_processing = list()
- var/list/apc_late_processing = list()
- var/current_part = SSMACHINES_APCS_EARLY
+ var/current_part = SSMACHINES_MACHINES
+ var/list/apc_steps = list(
+ SSMACHINES_APCS_ENVIRONMENT,
+ SSMACHINES_APCS_LIGHTS,
+ SSMACHINES_APCS_EQUIPMENT,
+ SSMACHINES_APCS_EARLY,
+ SSMACHINES_APCS_LATE
+ )
///List of all powernets on the server.
var/list/datum/powernet/powernets = list()
@@ -82,25 +89,10 @@ SUBSYSTEM_DEF(machines)
if (!resumed)
for(var/datum/powernet/powernet as anything in powernets)
powernet.reset() //reset the power state.
- current_part = SSMACHINES_APCS_EARLY
- src.currentrun = apc_early_processing.Copy()
-
- //APC early processing. Draws static power usages from their grids.
- if(current_part == SSMACHINES_APCS_EARLY)
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
- while(currentrun.len)
- var/obj/machinery/power/apc/apc = currentrun[currentrun.len]
- currentrun.len--
- if(QDELETED(apc) || apc.early_process(wait * 0.1) == PROCESS_KILL)
- apc_early_processing -= apc
- apc.datum_flags &= ~DF_ISPROCESSING
- if(MC_TICK_CHECK)
- return
current_part = SSMACHINES_MACHINES
src.currentrun = processing.Copy()
- //General machine processing. Their power usage can be dynamic and based on surplus power, so they come after static power usage have been applied.
+ //Processing all machines
if(current_part == SSMACHINES_MACHINES)
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
@@ -112,22 +104,34 @@ SUBSYSTEM_DEF(machines)
thing.datum_flags &= ~DF_ISPROCESSING
if (MC_TICK_CHECK)
return
- current_part = SSMACHINES_APCS_LATE
- src.currentrun = apc_late_processing.Copy()
+ current_part = apc_steps[1]
+ src.currentrun = processing_apcs.Copy()
- //APC late processing. APCs will use the remaining power on the grid to charge their cells if needed.
- //This is applied at the end so charging APCs don't cause others to discharge by taking all the power from the grid before machines use power.
- if(current_part == SSMACHINES_APCS_LATE)
+ //Processing APCs
+ while(current_part in apc_steps)
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
while(currentrun.len)
var/obj/machinery/power/apc/apc = currentrun[currentrun.len]
currentrun.len--
- if(QDELETED(apc) || apc.late_process(wait * 0.1) == PROCESS_KILL)
- apc_late_processing -= apc
+ if(QDELETED(apc))
+ processing_apcs -= apc
apc.datum_flags &= ~DF_ISPROCESSING
+ switch(current_part)
+ if(SSMACHINES_APCS_EARLY)
+ apc.early_process(wait * 0.1)
+ if(SSMACHINES_APCS_LATE)
+ apc.charge_channel(null, wait * 0.1)
+ apc.late_process(wait * 0.1)
+ else
+ apc.charge_channel(current_part, wait * 0.1)
if(MC_TICK_CHECK)
return
+ var/next_index = apc_steps.Find(current_part) + 1
+ if (next_index > apc_steps.len)
+ return
+ current_part = apc_steps[next_index]
+ src.currentrun = processing_apcs.Copy()
/datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables)
var/obj/structure/cable/PC
diff --git a/code/datums/components/soapbox.dm b/code/datums/components/soapbox.dm
new file mode 100644
index 0000000000000..61132bf68faa9
--- /dev/null
+++ b/code/datums/components/soapbox.dm
@@ -0,0 +1,42 @@
+/datum/component/soapbox
+ /// List of our current soapboxxer(s) who are gaining loud speech
+ var/list/soapboxers = list()
+ /// Gives atoms moving over us the soapbox speech and takes it away when they leave
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_loc_entered),
+ COMSIG_ATOM_EXITED = PROC_REF(on_loc_exited)
+ )
+
+/datum/component/soapbox/Initialize(...)
+ if(!ismovable(parent))
+ return COMPONENT_INCOMPATIBLE
+ add_connect_loc_behalf_to_parent()
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved))
+
+///Applies loud speech to our movable when entering the turf our parent is on
+/datum/component/soapbox/proc/on_loc_entered(datum/source, atom/movable/soapbox_arrive)
+ SIGNAL_HANDLER
+ RegisterSignal(soapbox_arrive, COMSIG_MOB_SAY, PROC_REF(soapbox_speech))
+ soapboxers += soapbox_arrive
+
+///Takes away loud speech from our movable when it leaves the turf our parent is on
+/datum/component/soapbox/proc/on_loc_exited(datum/source, atom/movable/soapbox_leave)
+ SIGNAL_HANDLER
+ if(soapbox_leave in soapboxers)
+ UnregisterSignal(soapbox_leave, COMSIG_MOB_SAY)
+ soapboxers -= soapbox_leave
+
+///We don't want our soapboxxer to keep their loud say if the parent is moved out from under them
+/datum/component/soapbox/proc/parent_moved(datum/source)
+ SIGNAL_HANDLER
+ for(var/atom/movable/loud as anything in soapboxers)
+ UnregisterSignal(loud, COMSIG_MOB_SAY)
+ soapboxers = list()
+
+///Gives a mob a unique say span
+/datum/component/soapbox/proc/soapbox_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+ speech_args[SPEECH_SPANS] |= SPAN_SOAPBOX
+
+/datum/component/soapbox/proc/add_connect_loc_behalf_to_parent()
+ AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections)
diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm
index f39379d636783..fcf62dead1a59 100644
--- a/code/datums/components/style/style.dm
+++ b/code/datums/components/style/style.dm
@@ -219,7 +219,7 @@
rank = rank_changed
meter.maptext = "[format_rank_string(rank)][generate_multiplier()][generate_actions()]"
- meter.maptext_y = 100 - 9 * length(actions)
+ meter.maptext_y = 94 - 12 * length(actions)
update_meter(point_to_rank(), go_back)
/datum/component/style/proc/update_meter(new_rank, go_back)
@@ -270,19 +270,15 @@
return "SPACED!"
/datum/component/style/proc/format_rank_string(new_rank)
- var/rank_string = rank_to_string(new_rank)
- var/final_string = ""
- final_string += "[rank_string[1]]"
- final_string += "[copytext(rank_string, 2)]"
- return final_string
+ return MAPTEXT_PIXELLARI("[rank_to_string(new_rank)]")
/datum/component/style/proc/generate_multiplier()
- return "
MULTIPLIER: [point_multiplier]X"
+ return "
" + MAPTEXT_GRAND9K("MULTIPLIER: [point_multiplier]X")
/datum/component/style/proc/generate_actions()
var/action_string = ""
for(var/action in actions)
- action_string += "
+ [actions[action]]"
+ action_string += "
" + MAPTEXT_GRAND9K("+ [actions[action]]")
return action_string
/datum/component/style/proc/action_to_color(action)
diff --git a/code/datums/components/style/style_meter.dm b/code/datums/components/style/style_meter.dm
index 94263700dda21..cc02baec1d5e0 100644
--- a/code/datums/components/style/style_meter.dm
+++ b/code/datums/components/style/style_meter.dm
@@ -132,7 +132,7 @@
maptext_height = 120
maptext_width = 105
maptext_x = 5
- maptext_y = 100
+ maptext_y = 94
maptext = ""
layer = SCREENTIP_LAYER
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index b8621d382f6fb..8e902ced2fdbf 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -43,7 +43,7 @@
src.min_distance = min_distance
var/mob/P = parent
- to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and clicking on your target with an empty hand."))
+ to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and ") + span_boldnotice("RIGHT-CLICKING on your target with an empty hand."))
addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE)
@@ -74,6 +74,9 @@
if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK])
return
+ if(!modifiers[RIGHT_CLICK])
+ return
+
if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated())
return
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
index 5a3ff4b4cb070..dcb8d63a3c43e 100644
--- a/code/datums/components/twohanded.dm
+++ b/code/datums/components/twohanded.dm
@@ -217,10 +217,11 @@
if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
user.dropItemToGround(parent, force = TRUE)
return COMPONENT_EQUIPPED_FAILED // blocked wield from item
+ if (wield_callback?.Invoke(parent, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
+ return
wielded = TRUE
ADD_TRAIT(parent, TRAIT_WIELDED, REF(src))
RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(on_swapping_hands))
- wield_callback?.Invoke(parent, user)
// update item stats and name
var/obj/item/parent_item = parent
diff --git a/code/datums/elements/simple_flying.dm b/code/datums/elements/simple_flying.dm
index 49b8771687bd9..e6d8f42db838b 100644
--- a/code/datums/elements/simple_flying.dm
+++ b/code/datums/elements/simple_flying.dm
@@ -17,6 +17,7 @@
/datum/element/simple_flying/Detach(datum/target)
. = ..()
UnregisterSignal(target, COMSIG_MOB_STATCHANGE)
+ REMOVE_TRAIT(target, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type))
///signal called by the stat of the target changing
/datum/element/simple_flying/proc/on_stat_change(mob/living/target, new_stat)
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index 7006d6d6daa71..71631de2d9887 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -44,6 +44,8 @@
var/list/mob_type_blacklist_typecache
/// Types that can use this emote regardless of their state.
var/list/mob_type_ignore_stat_typecache
+ /// Trait that is required to use this emote.
+ var/trait_required
/// In which state can you use this emote? (Check stat.dm for a full list of them)
var/stat_allowed = CONSCIOUS
/// Sound to play when emote is called.
@@ -297,6 +299,8 @@
* Returns a bool about whether or not the user can run the emote.
*/
/datum/emote/proc/can_run_emote(mob/user, status_check = TRUE, intentional = FALSE)
+ if(trait_required && !HAS_TRAIT(user, trait_required))
+ return FALSE
if(!is_type_in_typecache(user, mob_type_allowed_typecache))
return FALSE
if(is_type_in_typecache(user, mob_type_blacklist_typecache))
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index cd8065a72a3a8..330c224070c3e 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -188,8 +188,7 @@
return FALSE
if(!(carp_user.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE
return FALSE
- var/datum/dna/dna = carp_user.has_dna()
- if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK
+ if(HAS_TRAIT(carp_user, TRAIT_HULK)) //NO HULK
return FALSE
if(!isturf(carp_user.loc)) //NO MOTHERFLIPPIN MECHS!
return FALSE
diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm
index dbe91091ab89c..4bc6c77a9fe81 100644
--- a/code/datums/mutations/hulk.dm
+++ b/code/datums/mutations/hulk.dm
@@ -17,7 +17,6 @@
mutation_traits = list(
TRAIT_CHUNKYFINGERS,
TRAIT_HULK,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_PUSHIMMUNE,
TRAIT_STUNIMMUNE,
)
@@ -38,6 +37,7 @@
owner.add_mood_event("hulk", /datum/mood_event/hulk)
RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand))
RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing))
+ owner.add_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
/datum/mutation/human/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers)
SIGNAL_HANDLER
@@ -99,6 +99,7 @@
owner.clear_mood_event("hulk")
UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK)
UnregisterSignal(owner, COMSIG_MOB_CLICKON)
+ owner.remove_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown)
/// How many steps it takes to throw the mob
#define HULK_TAILTHROW_STEPS 28
@@ -257,6 +258,7 @@
log_combat(the_hulk, yeeted_person, "has thrown by tail")
/datum/mutation/human/hulk/wizardly
+ name = "Hulk (Magical)"
species_allowed = null //yes skeleton/lizard hulk - note that species that dont have skintone changing (like skellies) get custom handling
health_req = 0
instability = 0
@@ -264,19 +266,18 @@
/// List of traits to add/remove when someone gets this mutation.
mutation_traits = list(
TRAIT_HULK,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_PUSHIMMUNE,
TRAIT_STUNIMMUNE,
) // no chunk
/datum/mutation/human/hulk/superhuman
+ name = "Hulk (Super)"
health_req = 0
instability = 0
/// List of traits to add/remove when someone gets this mutation.
mutation_traits = list(
TRAIT_CHUNKYFINGERS,
TRAIT_HULK,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_NOSOFTCRIT,
TRAIT_NOHARDCRIT,
TRAIT_PUSHIMMUNE,
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 04ab2ee8f1783..2a66475c6e2fc 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -84,7 +84,7 @@
icon_state = "blooddrunk"
/datum/status_effect/blooddrunk/on_apply()
- ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT)
+ owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
human_owner.physiology.brute_mod *= 0.1
@@ -104,7 +104,7 @@
human_owner.physiology.tox_mod *= 10
human_owner.physiology.oxy_mod *= 10
human_owner.physiology.stamina_mod *= 10
- REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT)
+ owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
owner.remove_stun_absorption(id)
//Used by changelings to rapidly heal
@@ -383,7 +383,7 @@
show_duration = TRUE
/datum/status_effect/regenerative_core/on_apply()
- ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT)
+ owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
owner.adjustBruteLoss(-25)
owner.adjustFireLoss(-25)
owner.fully_heal(HEAL_CC_STATUS)
@@ -394,7 +394,7 @@
return TRUE
/datum/status_effect/regenerative_core/on_remove()
- REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT)
+ owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
/datum/status_effect/lightningorb
id = "Lightning Orb"
@@ -570,7 +570,8 @@
owner.AddElement(/datum/element/forced_gravity, 0)
owner.AddElement(/datum/element/simple_flying)
owner.add_stun_absorption(source = id, priority = 4)
- owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT)
+ owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
+ ADD_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id)
owner.playsound_local(get_turf(owner), 'sound/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE)
return TRUE
@@ -587,7 +588,8 @@
owner.RemoveElement(/datum/element/forced_gravity, 0)
owner.RemoveElement(/datum/element/simple_flying)
owner.remove_stun_absorption(id)
- owner.remove_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT)
+ owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
+ REMOVE_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id)
/// Gives you a brief period of anti-gravity
/datum/status_effect/jump_jet
diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm
index ff8e22b17b8fa..031a6dd5039d7 100644
--- a/code/game/area/areas/mining.dm
+++ b/code/game/area/areas/mining.dm
@@ -18,6 +18,10 @@
name = "Mining Station Public Storage"
icon_state = "mining_storage"
+/area/mine/lobby/raptor
+ name = "Nanotrasen Raptor Farm"
+ icon_state = "mining_storage"
+
/area/mine/production
name = "Mining Station Production Wing"
icon_state = "mining_production"
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 1c69dbecb7ea0..af6221d89219d 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -2,7 +2,7 @@
#define HEATER_MODE_HEAT "heat"
#define HEATER_MODE_COOL "cool"
#define HEATER_MODE_AUTO "auto"
-#define BASE_HEATING_ENERGY (STANDARD_CELL_RATE * 4)
+#define BASE_HEATING_ENERGY (40 KILO JOULES)
/obj/machinery/space_heater
anchored = FALSE
@@ -32,7 +32,7 @@
///How much heat/cold we can deliver
var/heating_energy = BASE_HEATING_ENERGY
///How efficiently we can deliver that heat/cold (higher indicates less cell consumption)
- var/efficiency = 200
+ var/efficiency = 20 MEGA JOULES / STANDARD_CELL_CHARGE
///The amount of degrees above and below the target temperature for us to change mode to heater or cooler
var/temperature_tolerance = 1
///What's the middle point of our settable temperature (30 °C)
@@ -176,7 +176,7 @@
for(var/datum/stock_part/capacitor/capacitor in component_parts)
cap += capacitor.tier
- heating_energy = laser * BASE_HEATING_ENERGY
+ heating_energy = laser * initial(heating_energy)
settable_temperature_range = cap * initial(settable_temperature_range)
efficiency = (cap + 1) * initial(efficiency) * 0.5
@@ -295,7 +295,14 @@
on = !on
mode = HEATER_MODE_STANDBY
if(!isnull(user))
- balloon_alert(user, "turned [on ? "on" : "off"]")
+ if(QDELETED(cell))
+ balloon_alert(user, "no cell!")
+ else if(!cell.charge())
+ balloon_alert(user, "no charge!")
+ else if(!is_operational)
+ balloon_alert(user, "not operational!")
+ else
+ balloon_alert(user, "turned [on ? "on" : "off"]")
update_appearance()
if(on)
SSair.start_processing_machine(src)
@@ -310,11 +317,18 @@
//We inherit the cell from the heater prior
cell = null
interaction_flags_click = FORBID_TELEKINESIS_REACH
+ display_panel = FALSE
+ settable_temperature_range = 50
///The beaker within the heater
var/obj/item/reagent_containers/beaker = null
- ///How powerful the heating is, upgrades with parts. (ala chem_heater.dm's method, basically the same level of heating, but this is restricted)
- var/chem_heating_power = 1
- display_panel = FALSE
+ /// How quickly it delivers heat to the reagents. In watts per joule of the thermal energy difference of the reagent from the temperature difference of the current and target temperatures.
+ var/beaker_conduction_power = 0.1
+ /// The subsystem we're being processed by.
+ var/datum/controller/subsystem/processing/our_subsystem
+
+/obj/machinery/space_heater/improvised_chem_heater/Initialize(mapload)
+ our_subsystem = locate(subsystem_type) in Master.subsystems
+ . = ..()
/obj/machinery/space_heater/improvised_chem_heater/Destroy()
. = ..()
@@ -322,11 +336,10 @@
/obj/machinery/space_heater/improvised_chem_heater/heating_examine()
. = ..()
-
- var/power_mod = 0.1 * chem_heating_power
- if(set_mode == HEATER_MODE_AUTO)
- power_mod *= 0.5
- . += span_notice("Heating power for beaker: [display_power(heating_energy * power_mod, convert = TRUE)]")
+ // Conducted energy per joule of thermal energy difference in a tick.
+ var/conduction_energy = beaker_conduction_power * (set_mode == HEATER_MODE_AUTO ? 0.5 : 1) * our_subsystem.wait / (1 SECONDS)
+ // This accounts for the timestep inaccuracy.
+ . += span_notice("Reagent conduction power: [conduction_energy < 1 ? display_power(-log(1 - conduction_energy) SECONDS / our_subsystem.wait, convert = FALSE) : "∞W"]/J")
/obj/machinery/space_heater/improvised_chem_heater/toggle_power(user)
. = ..()
@@ -341,10 +354,10 @@
return PROCESS_KILL
if(beaker.reagents.total_volume)
- var/power_mod = 0.1 * chem_heating_power
+ var/conduction_modifier = beaker_conduction_power
switch(set_mode)
if(HEATER_MODE_AUTO)
- power_mod *= 0.5
+ conduction_modifier *= 0.5
if(HEATER_MODE_HEAT)
if(target_temperature < beaker.reagents.chem_temp)
return
@@ -352,7 +365,7 @@
if(target_temperature > beaker.reagents.chem_temp)
return
- var/required_energy = abs(target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * beaker.reagents.heat_capacity()
+ var/required_energy = abs(target_temperature - beaker.reagents.chem_temp) * conduction_modifier * seconds_per_tick * beaker.reagents.heat_capacity()
required_energy = min(required_energy, heating_energy, cell.charge * efficiency)
if(required_energy < 1)
return
@@ -468,16 +481,17 @@
for(var/datum/stock_part/capacitor/capacitor in component_parts)
capacitors_rating += capacitor.tier
- heating_energy = lasers_rating * BASE_HEATING_ENERGY
+ heating_energy = lasers_rating * initial(heating_energy)
- settable_temperature_range = capacitors_rating * 50 //-20 - 80 at base
- efficiency = (capacitors_rating + 1) * 10
+ settable_temperature_range = capacitors_rating * initial(settable_temperature_range) //-20 - 80 at base
+ efficiency = (capacitors_rating + 1) * initial(efficiency) * 0.5
target_temperature = clamp(target_temperature,
max(settable_temperature_median - settable_temperature_range, TCMB),
settable_temperature_median + settable_temperature_range)
- chem_heating_power = efficiency / 20
+ // No time integration is used, so we should clamp this to prevent being able to overshoot if there was a subtype with a high initial value.
+ beaker_conduction_power = min((capacitors_rating + 1) * 0.5 * initial(beaker_conduction_power), 1 SECONDS / our_subsystem.wait)
#undef HEATER_MODE_STANDBY
#undef HEATER_MODE_HEAT
diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm
index 4c53cc5e4189d..5887c77667506 100644
--- a/code/game/machinery/telecomms/broadcasting.dm
+++ b/code/game/machinery/telecomms/broadcasting.dm
@@ -13,6 +13,10 @@
/// If this list contains `0`, then it will be receivable on every single
/// z-level.
var/list/levels
+ /// Blacklisted spans we don't want being put into comms by anything, ever - a place to put any new spans we want to make without letting them annoy people on comms
+ var/list/blacklisted_spans = list(
+ SPAN_SOAPBOX,
+ )
/datum/signal/subspace/New(data)
src.data = data || list()
@@ -175,7 +179,7 @@
if(!hearer)
stack_trace("null found in the hearers list returned by the spatial grid. this is bad")
continue
-
+ spans -= blacklisted_spans
hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, message_range = INFINITY)
// This following recording is intended for research and feedback in the use of department radio channels
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 21804def7e361..b3aba350c3368 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(dye_registry, list(
DYE_QM = /obj/item/clothing/gloves/color/brown,
DYE_CAPTAIN = /obj/item/clothing/gloves/captain,
DYE_HOP = /obj/item/clothing/gloves/color/grey,
- DYE_HOS = /obj/item/clothing/gloves/color/black,
+ DYE_HOS = /obj/item/clothing/gloves/color/black/security,
DYE_CE = /obj/item/clothing/gloves/chief_engineer,
DYE_RD = /obj/item/clothing/gloves/color/grey,
DYE_CMO = /obj/item/clothing/gloves/latex/nitrile,
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 912e1d66b0929..7f28724e68b12 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -397,7 +397,6 @@
// left hands are odd slots
if (idx && (idx % 2) == (message_mods[RADIO_EXTENSION] == MODE_L_HAND))
return
-
talk_into(speaker, raw_message, , spans, language=message_language, message_mods=filtered_mods)
/// Checks if this radio can receive on the given frequency.
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index c8c76c583e103..bebafbdab83b7 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -320,7 +320,7 @@
// Hulk and body temperature
var/datum/species/targetspecies = humantarget.dna.species
- var/mutant = humantarget.dna.check_mutation(/datum/mutation/human/hulk)
+ var/mutant = HAS_TRAIT(humantarget, TRAIT_HULK)
render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]\n"
var/core_temperature_message = "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)"
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index 8f838c0c0412f..86b99e8c47e4e 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -56,10 +56,9 @@
/// Triggered on wield of two handed item
/// Specific hulk checks due to reflection chance for balance issues and switches hitsounds.
/obj/item/dualsaber/proc/on_wield(obj/item/source, mob/living/carbon/user)
- if(user?.has_dna())
- if(user.dna.check_mutation(/datum/mutation/human/hulk))
- to_chat(user, span_warning("You lack the grace to wield this!"))
- return COMPONENT_TWOHANDED_BLOCK_WIELD
+ if(user && HAS_TRAIT(user, TRAIT_HULK))
+ to_chat(user, span_warning("You lack the grace to wield this!"))
+ return COMPONENT_TWOHANDED_BLOCK_WIELD
update_weight_class(w_class_on)
hitsound = 'sound/weapons/blade1.ogg'
START_PROCESSING(SSobj, src)
@@ -123,12 +122,11 @@
. = ..()
/obj/item/dualsaber/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(/datum/mutation/human/hulk))
- to_chat(user, span_warning("You grip the blade too hard and accidentally drop it!"))
- if(HAS_TRAIT(src, TRAIT_WIELDED))
- user.dropItemToGround(src, force=TRUE)
- return
+ if(HAS_TRAIT(user, TRAIT_HULK))
+ to_chat(user, span_warning("You grip the blade too hard and accidentally drop it!"))
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ user.dropItemToGround(src, force=TRUE)
+ return
..()
if(!HAS_TRAIT(src, TRAIT_WIELDED))
return
diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm
index 537c7688d2dd4..c03470ff416b3 100644
--- a/code/game/objects/items/food/meatdish.dm
+++ b/code/game/objects/items/food/meatdish.dm
@@ -34,6 +34,7 @@
foodtypes = SEAFOOD
eatverbs = list("bite", "chew", "gnaw", "swallow", "chomp")
w_class = WEIGHT_CLASS_SMALL
+ starting_reagent_purity = 1.0
/obj/item/food/fishmeat/carp
name = "carp fillet"
@@ -88,6 +89,7 @@
name = "donkfillet"
desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked."
icon_state = "donkfillet"
+ starting_reagent_purity = 0.3
/obj/item/food/fishmeat/octopus
name = "octopus tentacle"
diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm
index 371ecee6ff803..23fa5f2ad40c9 100644
--- a/code/game/objects/items/hand_items.dm
+++ b/code/game/objects/items/hand_items.dm
@@ -143,7 +143,7 @@
affix_desc = "on [target.p_their()] sensitive antennae"
affix_desc_target = "on your highly sensitive antennae"
brutal_noogie = TRUE
- if(user.dna?.check_mutation(/datum/mutation/human/hulk))
+ if(HAS_TRAIT(user, TRAIT_HULK))
prefix_desc = "sickeningly brutal"
brutal_noogie = TRUE
@@ -178,7 +178,7 @@
var/damage = rand(1, 5)
if(HAS_TRAIT(target, TRAIT_ANTENNAE))
damage += rand(3,7)
- if(user.dna?.check_mutation(/datum/mutation/human/hulk))
+ if(HAS_TRAIT(user, TRAIT_HULK))
damage += rand(3,7)
if(damage >= 5)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index d3e41b21a986b..eacd0b4b630d0 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -267,7 +267,7 @@
if(KIT_MR_FREEZE)
new /obj/item/clothing/glasses/cold(src)
- new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/clothing/gloves/color/black/security/blu(src)
new /obj/item/clothing/mask/chameleon(src)
new /obj/item/clothing/suit/hooded/wintercoat(src)
new /obj/item/clothing/shoes/winterboots(src)
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 5384a11cf3bbe..fbe11fe933d1b 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -162,7 +162,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/carrot
name = "carrot sword"
- desc = "A full-sized carrot sword. Definitely \not\ good for the eyes, not anymore."
+ desc = "A full-sized carrot sword. Definitely not good for the eyes, not anymore."
icon_state = "carrot_sword"
inhand_icon_state = "carrot_sword"
worn_icon_state = "carrot_sword"
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 1783d4b236a63..e1581422d0570 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -264,15 +264,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0)
return
/obj/structure/chair/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params)
- if(over_object == user)
- if(!item_chair || has_buckled_mobs())
- return
- user.visible_message(span_notice("[user] grabs \the [src.name]."), span_notice("You grab \the [src.name]."))
- var/obj/item/C = new item_chair(loc)
- C.set_custom_materials(custom_materials)
- TransferComponents(C)
- user.put_in_hands(C)
- qdel(src)
+ if(!isliving(user) || over_object != user)
+ return
+ if(!item_chair || has_buckled_mobs())
+ return
+ user.visible_message(span_notice("[user] grabs \the [src.name]."), span_notice("You grab \the [src.name]."))
+ var/obj/item/C = new item_chair(loc)
+ C.set_custom_materials(custom_materials)
+ TransferComponents(C)
+ user.put_in_hands(C)
+ qdel(src)
/obj/structure/chair/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE)
return ..()
@@ -282,6 +283,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0)
desc = "It has some unsavory stains on it..."
icon_state = "bar"
item_chair = /obj/item/chair/stool/bar
+ can_buckle = TRUE
+
+/obj/structure/chair/stool/bar/post_buckle_mob(mob/living/M)
+ M.pixel_y += 4
+
+/obj/structure/chair/stool/bar/post_unbuckle_mob(mob/living/M)
+ M.pixel_y -= 4
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index baf239284ac2f..7b64b6569d6cc 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -62,6 +62,7 @@
)
if(paint_jobs)
paint_jobs = crate_paint_jobs
+ AddComponent(/datum/component/soapbox)
/obj/structure/closet/crate/Destroy()
QDEL_NULL(manifest)
diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm
index 3b6a550b18b0f..72bf91f1919f2 100644
--- a/code/modules/antagonists/changeling/powers/adrenaline.dm
+++ b/code/modules/antagonists/changeling/powers/adrenaline.dm
@@ -14,7 +14,7 @@
if(!.)
return FALSE
- if(HAS_TRAIT_FROM(user, TRAIT_IGNOREDAMAGESLOWDOWN, CHANGELING_TRAIT))
+ if(HAS_TRAIT_FROM(user, TRAIT_PARALYSIS_L_ARM, CHANGELING_TRAIT) || HAS_TRAIT_FROM(user, TRAIT_PARALYSIS_R_ARM, CHANGELING_TRAIT))
user.balloon_alert(user, "already boosted!")
return FALSE
@@ -40,7 +40,8 @@
var/our_leg_zones = (GLOB.all_body_zones - GLOB.leg_zones)
user.regenerate_limbs(excluded_zones = our_leg_zones) // why is this exclusive rather than inclusive
- user.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT)
+ user.add_traits(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT)
+ user.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
// Revert above mob changes.
addtimer(CALLBACK(src, PROC_REF(unsting_action), user), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
@@ -57,4 +58,5 @@
/datum/action/changeling/adrenaline/proc/unsting_action(mob/living/user)
to_chat(user, span_changeling("The muscles in our limbs shift back to their usual places."))
- user.remove_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT)
+ user.remove_traits(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT)
+ user.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm
index 5e96119135f71..fe0d03ec18f50 100644
--- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm
@@ -220,7 +220,6 @@
/// A static list of traits we give to the heretic when on rust.
var/static/list/conditional_immunities = list(
TRAIT_BOMBIMMUNE,
- TRAIT_IGNOREDAMAGESLOWDOWN,
TRAIT_IGNORESLOWDOWN,
TRAIT_NO_SLIP_ALL,
TRAIT_NOBREATH,
@@ -306,7 +305,7 @@
*
* Gives our heretic ([source]) buffs if they stand on rust.
*/
-/datum/heretic_knowledge/ultimate/rust_final/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs)
+/datum/heretic_knowledge/ultimate/rust_final/proc/on_move(mob/living/source, atom/old_loc, dir, forced, list/old_locs)
SIGNAL_HANDLER
// If we're on a rusty turf, and haven't given out our traits, buff our guy
@@ -314,12 +313,14 @@
if(HAS_TRAIT(our_turf, TRAIT_RUSTY))
if(!immunities_active)
source.add_traits(conditional_immunities, type)
+ source.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
immunities_active = TRUE
// If we're not on a rust turf, and we have given out our traits, nerf our guy
else
if(immunities_active)
source.remove_traits(conditional_immunities, type)
+ source.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
immunities_active = FALSE
/**
diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm
index 35a6ab9268784..c72e6bfdef113 100644
--- a/code/modules/antagonists/heretic/status_effects/buffs.dm
+++ b/code/modules/antagonists/heretic/status_effects/buffs.dm
@@ -53,11 +53,11 @@
alert_type = /atom/movable/screen/alert/status_effect/marshal
/datum/status_effect/marshal/on_apply()
- ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT)
+ owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
return TRUE
/datum/status_effect/marshal/on_remove()
- REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT)
+ owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown)
/datum/status_effect/marshal/tick(seconds_between_ticks)
if(!iscarbon(owner))
diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm
index a80ccec73bf37..57e6ec444196e 100644
--- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm
+++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm
@@ -1044,14 +1044,14 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
owner.speech_span = say_span
to_chat(usr, span_notice("Voice set to [selection]."))
if("verb")
- say_verb = params["verb"]
+ say_verb = strip_html(params["verb"], MAX_NAME_LEN)
if(changing_voice)
owner.verb_say = say_verb
owner.verb_ask = say_verb
owner.verb_exclaim = say_verb
owner.verb_yell = say_verb
if("name")
- say_name = params["name"]
+ say_name = strip_html(params["name"], MAX_NAME_LEN)
/datum/ai_module/utility/emag
name = "Targeted Safeties Override"
diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm
index ec07639cb449c..6fbe6c6097bec 100644
--- a/code/modules/antagonists/nightmare/nightmare_equipment.dm
+++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm
@@ -52,10 +52,9 @@
if(!has_crit)
return
playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100, TRUE)
- var/datum/dna/target_dna = target.has_dna()
if(target.stat == DEAD)
user.visible_message(span_warning("[user] gores [target] with [src]!"), span_warning("You gore [target] with [src], which doesn't accomplish much, but it does make you feel a little better."))
- else if(!target_dna?.check_mutation(/datum/mutation/human/hulk) && (iscarbon(target) || issilicon(target)))
+ else if(!HAS_TRAIT(target, TRAIT_HULK) && (iscarbon(target) || issilicon(target)))
user.visible_message(span_boldwarning("[user] gores [target] with [src], bringing them to a halt!"), span_userdanger("You gore [target] with [src], bringing them to a halt!"))
target.Paralyze(issilicon(target) ? 2 SECONDS : 1 SECONDS)
else
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index bb0e12809955e..82b1eb8f37954 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -9,7 +9,6 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
cut_type = /obj/item/clothing/gloves/fingerless
- clothing_traits = list(TRAIT_FAST_CUFFING)
/obj/item/clothing/gloves/color/black/Initialize(mapload)
. = ..()
@@ -20,6 +19,15 @@
slapcraft_recipes = slapcraft_recipe_list,\
)
+/obj/item/clothing/gloves/color/black/security
+ name = "security gloves"
+ desc = "These security gloves come with microchips that help the user quickly restrain suspects."
+ icon_state = "sec"
+ clothing_traits = list(TRAIT_FAST_CUFFING)
+
+/obj/item/clothing/gloves/color/black/security/blu
+ icon_state = "sec_blu"
+
/obj/item/clothing/gloves/fingerless
name = "fingerless gloves"
desc = "Plain black gloves without fingertips for the hard-working."
diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm
index 4adb374d92bd7..bbe7f5dba18b4 100644
--- a/code/modules/clothing/gloves/tacklers.dm
+++ b/code/modules/clothing/gloves/tacklers.dm
@@ -59,9 +59,8 @@
/obj/item/clothing/gloves/tackler/combat
name = "gorilla gloves"
desc = "Premium quality combative gloves, heavily reinforced to give the user an edge in close combat tackles, though they are more taxing to use than normal gripper gloves. Fireproof to boot!"
- icon_state = "black"
- inhand_icon_state = "greyscale_gloves"
- greyscale_colors = "#2f2e31"
+ icon_state = "gorilla"
+ inhand_icon_state = null
tackle_stam_cost = 30
base_knockdown = 1.25 SECONDS
@@ -77,6 +76,7 @@
/obj/item/clothing/gloves/tackler/combat/insulated
name = "guerrilla gloves"
desc = "Superior quality combative gloves, good for performing tackle takedowns as well as absorbing electrical shocks."
+ icon_state = "guerrilla"
siemens_coefficient = 0
armor_type = /datum/armor/combat_insulated
@@ -101,7 +101,7 @@
desc = "Ratty looking fingerless gloves wrapped with sticky tape. Beware anyone wearing these, for they clearly have no shame and nothing to lose."
icon_state = "fingerless"
inhand_icon_state = null
-
+ clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH)
tackle_stam_cost = 30
base_knockdown = 1.75 SECONDS
min_distance = 2
diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
index ef75de8db8672..446782d00cbf4 100644
--- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm
@@ -1469,6 +1469,20 @@
/datum/reagent/water = 5,
)
+//Fresh Jellyfish fillet soup!
+/datum/chemical_reaction/food/soup/jellyfish_stew_two
+ required_reagents = list(/datum/reagent/water = 50)
+ required_ingredients = list(
+ /obj/item/food/fishmeat/gunner_jellyfish = 1,
+ /obj/item/food/grown/soybeans = 1,
+ /obj/item/food/grown/redbeet = 1,
+ /obj/item/food/grown/potato = 1
+ )
+ results = list(
+ /datum/reagent/consumable/nutriment/soup/jellyfish = 50,
+ )
+
+
// Rootbread Soup
/datum/reagent/consumable/nutriment/soup/rootbread
name = "Rootbread Soup"
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
index 100e74fd91682..71716a1ee7c2a 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm
@@ -480,6 +480,10 @@
reaction = /datum/chemical_reaction/food/soup/jellyfish_stew
category = CAT_LIZARD
+/datum/crafting_recipe/food/reaction/soup/jellyfish_stew_two
+ reaction = /datum/chemical_reaction/food/soup/jellyfish_stew_two
+ category = CAT_LIZARD
+
/datum/crafting_recipe/food/reaction/soup/rootbread_soup
reaction = /datum/chemical_reaction/food/soup/rootbread_soup
category = CAT_LIZARD
diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm
index fb82737711404..974b19889ecba 100644
--- a/code/modules/hydroponics/grown/beans.dm
+++ b/code/modules/hydroponics/grown/beans.dm
@@ -44,12 +44,22 @@
/obj/item/food/grown/koibeans
seed = /obj/item/seeds/soya/koi
name = "koibean"
- desc = "Something about these seems fishy."
+ desc = "Something about these seems fishy, they seem really soft, almost squeezable!"
icon_state = "koibeans"
foodtypes = VEGETABLES
tastes = list("koi" = 1)
wine_power = 40
+//Now squeezable for imitation carpmeat
+/obj/item/food/grown/koibeans/attack_self(mob/living/user)
+ user.visible_message(span_notice("[user] crushes [src] into a slab of carplike meat."), span_notice("You crush [src] into something that resembles a slab of carplike meat."))
+ playsound(user, 'sound/effects/blobattack.ogg', 50, TRUE)
+ var/obj/item/food/fishmeat/carp/imitation/fishie = new(null)
+ fishie.reagents.set_all_reagents_purity(seed.get_reagent_purity())
+ qdel(src)
+ user.put_in_hands(fishie)
+ return TRUE
+
//Butterbeans, the beans wid da butta!
// Butterbeans! - Squeeze for a single butter slice!
/obj/item/seeds/soya/butter
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index 999117dc1be15..f3627c3c2a257 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -59,7 +59,7 @@
belt = /obj/item/modular_computer/pda/heads/hos
ears = /obj/item/radio/headset/heads/hos/alt
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/hats/hos/beret
shoes = /obj/item/clothing/shoes/jackboots/sec
l_pocket = /obj/item/restraints/handcuffs
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 4fb52ec77a026..9b2dc91137cd5 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -218,7 +218,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution)
)
belt = /obj/item/modular_computer/pda/security
ears = /obj/item/radio/headset/headset_sec/alt
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/helmet/sec
shoes = /obj/item/clothing/shoes/jackboots/sec
l_pocket = /obj/item/restraints/handcuffs
diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm
index 0768505b66553..032ad08af5a60 100644
--- a/code/modules/jobs/job_types/station_trait/human_ai.dm
+++ b/code/modules/jobs/job_types/station_trait/human_ai.dm
@@ -98,9 +98,7 @@
/obj/item/door_remote/omni = 1,
/obj/item/machine_remote = 1,
/obj/item/secure_camera_console_pod = 1,
- )
- implants = list(
- /obj/item/implant/teleport_blocker,
+ /obj/item/sensor_device = 1,
)
uniform = /obj/item/clothing/under/rank/station_trait/human_ai
@@ -108,9 +106,6 @@
ears = /obj/item/radio/headset/silicon/human_ai
glasses = /obj/item/clothing/glasses/hud/diagnostic
- suit = /obj/item/clothing/suit/costume/cardborg
- head = /obj/item/clothing/head/costume/cardborg
-
l_pocket = /obj/item/laser_pointer/infinite_range //to punish borgs, this works through the camera console.
r_pocket = /obj/item/assembly/flash/handheld
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 643611201c8c1..c1d2c032901f7 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -56,7 +56,7 @@
belt = /obj/item/modular_computer/pda/warden
ears = /obj/item/radio/headset/headset_sec/alt
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/hats/warden/red
shoes = /obj/item/clothing/shoes/jackboots/sec
l_pocket = /obj/item/restraints/handcuffs
diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm
index 16925dd5138e7..004db281c75c3 100644
--- a/code/modules/library/bookcase.dm
+++ b/code/modules/library/bookcase.dm
@@ -94,63 +94,81 @@
I.forceMove(Tsec)
update_appearance()
-/obj/structure/bookcase/attackby(obj/item/I, mob/user, params)
- switch(state)
- if(BOOKCASE_UNANCHORED)
- if(I.tool_behaviour == TOOL_WRENCH)
- if(I.use_tool(src, user, 20, volume=50))
- to_chat(user, span_notice("You wrench the frame into place."))
- set_anchored(TRUE)
- else if(I.tool_behaviour == TOOL_CROWBAR)
- if(I.use_tool(src, user, 20, volume=50))
- to_chat(user, span_notice("You pry the frame apart."))
- deconstruct(TRUE)
+/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, params)
+ if(state == BOOKCASE_UNANCHORED)
+ if(attacking_item.tool_behaviour == TOOL_WRENCH)
+ if(attacking_item.use_tool(src, user, 20, volume=50))
+ balloon_alert(user, "wrenched in place")
+ set_anchored(TRUE)
+ return
+
+ if(attacking_item.tool_behaviour == TOOL_CROWBAR)
+ if(attacking_item.use_tool(src, user, 20, volume=50))
+ balloon_alert(user, "pried apart")
+ deconstruct(TRUE)
+ return
+ return ..()
- if(BOOKCASE_ANCHORED)
- if(istype(I, /obj/item/stack/sheet/mineral/wood))
- var/obj/item/stack/sheet/mineral/wood/W = I
- if(W.get_amount() >= 2)
- W.use(2)
- to_chat(user, span_notice("You add a shelf."))
- state = BOOKCASE_FINISHED
- update_appearance()
- else if(I.tool_behaviour == TOOL_WRENCH)
- I.play_tool_sound(src, 100)
- to_chat(user, span_notice("You unwrench the frame."))
- set_anchored(FALSE)
+ if(state == BOOKCASE_ANCHORED)
+ if(istype(attacking_item, /obj/item/stack/sheet/mineral/wood))
+ var/obj/item/stack/sheet/mineral/wood/W = attacking_item
+ if(W.get_amount() < 2)
+ balloon_alert(user, "not enough wood")
+ return
+ W.use(2)
+ balloon_alert(user, "shelf added")
+ state = BOOKCASE_FINISHED
+ update_appearance()
+ return
+
+ if(attacking_item.tool_behaviour == TOOL_WRENCH)
+ attacking_item.play_tool_sound(src, 100)
+ balloon_alert(user, "unwrenched the frame")
+ set_anchored(FALSE)
+ return
+ return ..()
- if(BOOKCASE_FINISHED)
- if(isbook(I))
- if(!user.transferItemToLoc(I, src))
- return
- update_appearance()
- else if(atom_storage)
- for(var/obj/item/T in I.contents)
- if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
- atom_storage.attempt_remove(T, src)
- to_chat(user, span_notice("You empty \the [I] into \the [src]."))
- update_appearance()
- else if(IS_WRITING_UTENSIL(I))
- if(!user.can_perform_action(src) || !user.can_write(I))
- return
- var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN)
- if(!user.can_perform_action(src) || !user.can_write(I))
- return
- if(!newname)
- return
- else
- name = "bookcase ([sanitize(newname)])"
- else if(I.tool_behaviour == TOOL_CROWBAR)
- if(length(contents))
- to_chat(user, span_warning("You need to remove the books first!"))
- else
- I.play_tool_sound(src, 100)
- to_chat(user, span_notice("You pry the shelf out."))
- new /obj/item/stack/sheet/mineral/wood(drop_location(), 2)
- state = BOOKCASE_ANCHORED
- update_appearance()
- else
- return ..()
+ if(isbook(attacking_item))
+ if(!user.transferItemToLoc(attacking_item, src))
+ return ..()
+ update_appearance()
+ return
+
+ if(atom_storage)
+ var/found_anything = FALSE
+ for(var/obj/item/T in attacking_item.contents)
+ if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
+ atom_storage.attempt_remove(T, src)
+ found_anything = TRUE
+
+ if (found_anything)
+ balloon_alert(user, "emptied into [src]")
+ update_appearance()
+ return
+
+ if(IS_WRITING_UTENSIL(attacking_item))
+ if(!user.can_perform_action(src) || !user.can_write(attacking_item))
+ return ..()
+ var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN)
+ if(!user.can_perform_action(src) || !user.can_write(attacking_item))
+ return ..()
+ if(!newname)
+ return
+ name = "bookcase ([sanitize(newname)])"
+ return
+
+ if(attacking_item.tool_behaviour == TOOL_CROWBAR)
+ if(length(contents))
+ balloon_alert(user, "remove the books first")
+ return
+ attacking_item.play_tool_sound(src, 100)
+ balloon_alert(user, "pried the shelf out")
+ new /obj/item/stack/sheet/mineral/wood(drop_location(), 2)
+ state = BOOKCASE_ANCHORED
+ update_appearance()
+ return
+
+ return ..()
/obj/structure/bookcase/attack_hand(mob/living/user, list/modifiers)
. = ..()
diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm
index 3b805bd92f9c0..0fdc90c2f3213 100644
--- a/code/modules/mafia/outfits.dm
+++ b/code/modules/mafia/outfits.dm
@@ -89,7 +89,7 @@
name = "Mafia Security Officer"
uniform = /obj/item/clothing/under/rank/security/officer
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/helmet/sec
suit = /obj/item/clothing/suit/armor/vest/alt
shoes = /obj/item/clothing/shoes/jackboots
@@ -116,7 +116,7 @@
uniform = /obj/item/clothing/under/rank/security/head_of_security
shoes = /obj/item/clothing/shoes/jackboots
suit = /obj/item/clothing/suit/armor/hos/trenchcoat
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/hats/hos/beret
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
@@ -126,7 +126,7 @@
uniform = /obj/item/clothing/under/rank/security/warden
shoes = /obj/item/clothing/shoes/jackboots
suit = /obj/item/clothing/suit/armor/vest/warden/alt
- gloves = /obj/item/clothing/gloves/color/black
+ gloves = /obj/item/clothing/gloves/color/black/security
head = /obj/item/clothing/head/hats/warden/red
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index c1a81b9d33847..070189a1ff399 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -506,6 +506,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
. = ..()
//restart our floating animation after orbit is done.
pixel_y = base_pixel_y
+ // if we were autoobserving, reset perspective
+ if (!isnull(client) && !isnull(client.eye))
+ reset_perspective(null)
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm
index 86fe0b5cf5704..aad840aa18548 100644
--- a/code/modules/mob/living/basic/bots/_bots.dm
+++ b/code/modules/mob/living/basic/bots/_bots.dm
@@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(command_strings, list(
RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(handle_loop_movement))
RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(after_attacked))
RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access))
- ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT)
+ add_traits(list(TRAIT_NO_GLIDE, TRAIT_SILICON_EMOTES_ALLOWED), INNATE_TRAIT)
GLOB.bots_list += src
// Give bots a fancy new ID card that can hold any access.
diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm
index 735f63977d362..c0c6dd7b023fc 100644
--- a/code/modules/mob/living/basic/pets/orbie/orbie.dm
+++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm
@@ -50,6 +50,7 @@
var/static/list/food_types = list(/obj/item/food/virtual_chocolate)
AddComponent(/datum/component/obeys_commands, pet_commands)
AddElement(/datum/element/basic_eating, food_types = food_types)
+ ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
RegisterSignal(src, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled))
RegisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP, PROC_REF(on_level_up))
RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click))
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 1bacc08a8b6ff..17f5be02a91cf 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -16,6 +16,7 @@
forceMove(OB)
if(!container?.mecha && (!container || container.immobilize)) //Unless inside a mecha, brains are rather helpless.
add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED)
+ ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
/mob/living/brain/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
var/obj/item/organ/internal/brain/brain_loc = loc
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 612801695fd2c..9816012218225 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -516,7 +516,7 @@
#undef CPR_PANIC_SPEED
/mob/living/carbon/human/cuff_resist(obj/item/I)
- if(dna?.check_mutation(/datum/mutation/human/hulk))
+ if(HAS_TRAIT(src, TRAIT_HULK))
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
if(..(I, cuff_break = FAST_CUFFBREAK))
dropItemToGround(I)
@@ -980,10 +980,6 @@
/mob/living/carbon/human/updatehealth()
. = ..()
- if(HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN))
- remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown)
- remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying)
- return
var/health_deficiency = max((maxHealth - health), staminaloss)
if(health_deficiency >= 40)
add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, multiplicative_slowdown = health_deficiency / 75)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 9ccc26eec6cc2..ae79d87627243 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -715,15 +715,6 @@
/datum/emote/living/custom/replace_pronoun(mob/user, message)
return message
-/datum/emote/living/beep
- key = "beep"
- key_third_person = "beeps"
- message = "beeps."
- message_param = "beeps at %t."
- sound = 'sound/machines/twobeep.ogg'
- mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon, /mob/living/basic/orbie)
- emote_type = EMOTE_AUDIBLE
-
/datum/emote/living/inhale
key = "inhale"
key_third_person = "inhales"
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index fb7857d458541..2215864782325 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -1,5 +1,5 @@
/datum/emote/silicon
- mob_type_allowed_typecache = list(/mob/living/silicon, /mob/living/simple_animal/bot, /mob/living/basic/bot)
+ trait_required = TRAIT_SILICON_EMOTES_ALLOWED
emote_type = EMOTE_AUDIBLE
/datum/emote/silicon/boop
@@ -7,6 +7,14 @@
key_third_person = "boops"
message = "boops."
+/datum/emote/silicon/beep
+ key = "beep"
+ key_third_person = "beeps"
+ message = "beeps."
+ message_param = "beeps at %t."
+ emote_type = EMOTE_AUDIBLE
+ sound = 'sound/machines/twobeep.ogg'
+
/datum/emote/silicon/buzz
key = "buzz"
key_third_person = "buzzes"
@@ -15,7 +23,6 @@
emote_type = EMOTE_AUDIBLE
sound = 'sound/machines/buzz-sigh.ogg'
-
/datum/emote/silicon/buzz2
key = "buzz2"
message = "buzzes twice."
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0c26e7c57e278..4813d97d12d38 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -11,7 +11,7 @@
post_tipped_callback = CALLBACK(src, PROC_REF(after_tip_over)), \
post_untipped_callback = CALLBACK(src, PROC_REF(after_righted)), \
roleplay_friendly = TRUE, \
- roleplay_emotes = list(/datum/emote/silicon/buzz, /datum/emote/silicon/buzz2, /datum/emote/living/beep), \
+ roleplay_emotes = list(/datum/emote/silicon/buzz, /datum/emote/silicon/buzz2, /datum/emote/silicon/beep), \
roleplay_callback = CALLBACK(src, PROC_REF(untip_roleplay)))
set_wires(new /datum/wires/robot(src))
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 9ca655740cd08..6916c01f4d394 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -80,6 +80,7 @@
)
add_traits(traits_to_apply, ROUNDSTART_TRAIT)
+ ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
RegisterSignal(src, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_silicon_shocked))
/mob/living/silicon/Destroy()
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 49b44122ac0e7..50b30b09aa88c 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -202,6 +202,7 @@
pa_system = new(src, automated_announcements = automated_announcements)
pa_system.Grant(src)
RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access))
+ ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT)
/mob/living/simple_animal/bot/Destroy()
GLOB.bots_list -= src
diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm
index 0e2bffd0aa6a7..18c1ac6926763 100644
--- a/code/modules/mod/modules/modules_supply.dm
+++ b/code/modules/mod/modules/modules_supply.dm
@@ -499,6 +499,7 @@
mod.wearer.add_traits(user_traits, MOD_TRAIT)
mod.wearer.RemoveElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6)
mod.wearer.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE)
+ mod.wearer.add_movespeed_mod_immunities(MOD_TRAIT, /datum/movespeed_modifier/damage_slowdown)
mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere)
RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange))
@@ -560,6 +561,7 @@
light_power = 1
light_color = COLOR_LIGHT_ORANGE
embed_type = null
+ can_hit_turfs = TRUE
/obj/projectile/bullet/mining_bomb/Initialize(mapload)
. = ..()
diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
index 7a0adba3cce6d..78a9148b013fe 100644
--- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm
+++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm
@@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list)
/datum/emote/living/jump,
/datum/emote/living/shiver,
/datum/emote/spin,
- /datum/emote/living/beep,
+ /datum/emote/silicon/beep,
)
data["possible_emotes"] = list("none")
for(var/datum/emote/target_emote as anything in possible_emotes)
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 329f77ab7186d..ca765ac0514a4 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -7,6 +7,12 @@
///Cap for how fast cells charge, as a percentage per second (.01 means cellcharge is capped to 1% per second)
#define CHARGELEVEL 0.01
+///Charge percentage at which the lights channel stops working
+#define APC_CHANNEL_LIGHT_TRESHOLD 15
+///Charge percentage at which the equipment channel stops working
+#define APC_CHANNEL_EQUIP_TRESHOLD 30
+///Charge percentage at which the APC icon indicates discharging
+#define APC_CHANNEL_ALARM_TRESHOLD 75
/obj/machinery/power/apc
name = "area power controller"
@@ -49,6 +55,8 @@
var/operating = TRUE
///State of the apc charging (not charging, charging, fully charged)
var/charging = APC_NOT_CHARGING
+ ///Previous state of charging, to detect the change
+ var/last_charging
///Can the APC charge?
var/chargemode = TRUE
///Is the apc interface locked?
@@ -67,6 +75,8 @@
var/lastused_environ = 0
///Total amount of power used by the three channels
var/lastused_total = 0
+ ///Total amount of power put into the battery
+ var/lastused_charge = 0
///State of the apc external power (no power, low power, has power)
var/main_status = APC_NO_POWER
powernet = FALSE // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :(
@@ -146,8 +156,7 @@
//APCs get added to their own processing tasks for the machines subsystem.
if (!(datum_flags & DF_ISPROCESSING))
datum_flags |= DF_ISPROCESSING
- SSmachines.apc_early_processing += src
- SSmachines.apc_late_processing += src
+ SSmachines.processing_apcs += src
//Pixel offset its appearance based on its direction
dir = ndir
@@ -516,11 +525,13 @@
disconnect_remote_access()
/**
- * APC early processing. This gets processed before any other machine does.
+ * APC early processing. This gets processed after any other machine on the powernet does.
* This adds up the total static power usage for the apc's area, then draw that power usage from the grid or APC cell.
- * This is done early so machines that use dynamic power get a more truthful surplus when accessing available energy.
*/
/obj/machinery/power/apc/proc/early_process()
+ if(isnull(area))
+ return
+
var/total_static_energy_usage = 0
total_static_energy_usage += APC_CHANNEL_IS_ON(lighting) * area.energy_usage[AREA_USAGE_STATIC_LIGHT]
total_static_energy_usage += APC_CHANNEL_IS_ON(equipment) * area.energy_usage[AREA_USAGE_STATIC_EQUIP]
@@ -551,15 +562,12 @@
lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.energy_usage[AREA_USAGE_ENVIRON] + area.energy_usage[AREA_USAGE_STATIC_ENVIRON] : 0
area.clear_usage()
- lastused_total = lastused_light + lastused_equip + lastused_environ
-
+ lastused_total = lastused_light + lastused_equip + lastused_environ + lastused_charge
//store states to update icon if any change
var/last_lt = lighting
var/last_eq = equipment
var/last_en = environ
- var/last_ch = charging
-
var/excess = surplus()
if(!avail())
@@ -579,7 +587,7 @@
if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights))
low_power_nightshift_lights = TRUE
INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE)
- else if(cell.percent() < 15) // <15%, turn off lighting & equipment
+ else if(cell.percent() < APC_CHANNEL_LIGHT_TRESHOLD) // turn off lighting & equipment
equipment = autoset(equipment, AUTOSET_OFF)
lighting = autoset(lighting, AUTOSET_OFF)
environ = autoset(environ, AUTOSET_ON)
@@ -587,7 +595,7 @@
if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights))
low_power_nightshift_lights = TRUE
INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE)
- else if(cell.percent() < 30) // <30%, turn off equipment
+ else if(cell.percent() < APC_CHANNEL_EQUIP_TRESHOLD) // turn off equipment
equipment = autoset(equipment, AUTOSET_OFF)
lighting = autoset(lighting, AUTOSET_ON)
environ = autoset(environ, AUTOSET_ON)
@@ -603,21 +611,9 @@
low_power_nightshift_lights = FALSE
if(!SSnightshift.nightshift_active)
INVOKE_ASYNC(src, PROC_REF(set_nightshift), FALSE)
- if(cell.percent() > 75)
+ if(cell.percent() > APC_CHANNEL_ALARM_TRESHOLD)
alarm_manager.clear_alarm(ALARM_POWER)
- charging = APC_NOT_CHARGING
- // now trickle-charge the cell
- if(chargemode && operating && excess && cell.used_charge())
- // Max charge is capped to % per second constant.
- lastused_total += charge_cell(min(cell.chargerate, cell.maxcharge * CHARGELEVEL) * seconds_per_tick, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE)
- charging = APC_CHARGING
-
- // show cell as fully charged if so
- if(cell.charge >= cell.maxcharge)
- cell.charge = cell.maxcharge
- charging = APC_FULLY_CHARGED
-
else // no cell, switch everything off
charging = APC_NOT_CHARGING
equipment = autoset(equipment, AUTOSET_FORCE_OFF)
@@ -626,13 +622,47 @@
alarm_manager.send_alarm(ALARM_POWER)
// update icon & area power if anything changed
-
if(last_lt != lighting || last_eq != equipment || last_en != environ || force_update)
force_update = FALSE
queue_icon_update()
update()
- else if(last_ch != charging)
+ if(charging != last_charging)
queue_icon_update()
+ // show cell as fully charged if so
+ if(cell.charge >= cell.maxcharge)
+ cell.charge = cell.maxcharge
+ charging = APC_FULLY_CHARGED
+
+// charge until the battery is full or to the treshold of the provided channel
+/obj/machinery/power/apc/proc/charge_channel(channel = null, seconds_per_tick)
+ if(channel == SSMACHINES_APCS_ENVIRONMENT)
+ lastused_charge = 0
+ last_charging = charging
+ charging = APC_NOT_CHARGING
+
+ if(!cell || shorted || !operating || !chargemode || !surplus() || !cell.used_charge())
+ return
+
+ // no overcharge past the next treshold
+ var/need_charge_for_channel
+ switch(channel)
+ if(SSMACHINES_APCS_ENVIRONMENT)
+ need_charge_for_channel = (cell.maxcharge * 0.05) - cell.charge
+ if(SSMACHINES_APCS_LIGHTS)
+ need_charge_for_channel = (cell.maxcharge * (APC_CHANNEL_LIGHT_TRESHOLD + 5) * 0.01) - cell.charge
+ if(SSMACHINES_APCS_EQUIPMENT)
+ need_charge_for_channel = (cell.maxcharge * (APC_CHANNEL_EQUIP_TRESHOLD + 5) * 0.01) - cell.charge
+ else
+ need_charge_for_channel = cell.used_charge()
+
+ var/remaining_charge_rate = min(cell.chargerate, cell.maxcharge * CHARGELEVEL) - lastused_charge
+ var/need_charge = min(need_charge_for_channel, remaining_charge_rate) * seconds_per_tick
+ //check if we can charge the battery
+ if(need_charge < 0)
+ return
+
+ lastused_charge += charge_cell(need_charge, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE)
+ charging = APC_CHARGING
/obj/machinery/power/apc/proc/reset(wire)
switch(wire)
@@ -752,3 +782,6 @@
return null
#undef CHARGELEVEL
+#undef APC_CHANNEL_LIGHT_TRESHOLD
+#undef APC_CHANNEL_EQUIP_TRESHOLD
+#undef APC_CHANNEL_ALARM_TRESHOLD
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index ab023d38b55ef..b6a960e05ad98 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -84,6 +84,9 @@
else
to_chat(user, span_notice("There are no modifications currently installed."))
+/obj/item/gun/energy/recharge/kinetic_accelerator/try_fire_gun(atom/target, mob/living/user, params)
+ return fire_gun(target, user, user.Adjacent(target) && !isturf(target), params)
+
/obj/item/gun/energy/recharge/kinetic_accelerator/attack_hand_secondary(mob/user, list/modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
@@ -192,6 +195,7 @@
var/pressure_decrease = 0.25
var/obj/item/gun/energy/recharge/kinetic_accelerator/kinetic_gun
+
/obj/projectile/kinetic/Destroy()
kinetic_gun = null
return ..()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 961d32c96ee8b..d06a36056d1c0 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -169,6 +169,9 @@
else
. = ..(amount=1)
+/obj/item/gun/energy/plasmacutter/try_fire_gun(atom/target, mob/living/user, params)
+ return fire_gun(target, user, user.Adjacent(target) && !isturf(target), params)
+
#undef PLASMA_CUTTER_CHARGE_WELD
/obj/item/gun/energy/plasmacutter/adv
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
index 66ea4d2c86593..b393dc3415fe5 100644
--- a/code/modules/projectiles/projectile/energy/stun.dm
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -19,7 +19,7 @@
var/mob/living/carbon/C = target
C.add_mood_event("tased", /datum/mood_event/tased)
SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK)
- if(C.dna && C.dna.check_mutation(/datum/mutation/human/hulk))
+ if(HAS_TRAIT(C, TRAIT_HULK))
C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if(!C.check_stun_immunity(CANKNOCKDOWN))
addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS)
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index a4fa10cb88c63..3b0272240b0df 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -204,7 +204,11 @@
if(weapon.w_class + total_weight > maximum_weight)
to_chat(user, span_warning("[weapon] is too big to fit into [src]."))
continue
- weapon.forceMove(src)
+
+ //try to remove the right way
+ if(!user.transferItemToLoc(weapon, src))
+ continue
+
total_weight += weapon.w_class
items_transfered += 1
to_chat(user, span_notice("[weapon] was loaded into [src]."))
@@ -212,8 +216,8 @@
return items_transfered
/obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
- if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH))
- return NONE
+ if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1))
+ return ITEM_INTERACT_SKIP_TO_ATTACK
//add the beaker
if (is_reagent_container(tool) && tool.is_open_container())
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
index 324b2c538b840..5632688cb476b 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm
@@ -423,8 +423,7 @@
return NONE
if(!isliving(target))
return NONE
- var/datum/dna/dna = source.has_dna()
- if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK
+ if(HAS_TRAIT(source, TRAIT_HULK)) //NO HULK
return NONE
if(!source.can_unarmed_attack())
return COMPONENT_SKIP_ATTACK
diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
index a50912416ef87..f36c6cfe838b8 100644
--- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
+++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm
@@ -120,6 +120,7 @@
. = ..()
UnregisterSignal(implant_owner, signalCache)
UnregisterSignal(implant_owner, COMSIG_LIVING_ENTER_STAMCRIT)
+ remove_stun_buffs(implant_owner)
/obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver)
. = ..()
@@ -151,10 +152,8 @@
sparks.set_up(5, 1, src)
sparks.start()
- owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_BATON_RESISTANCE, TRAIT_STUNIMMUNE), REF(src))
- addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_IGNOREDAMAGESLOWDOWN, REF(src)), stun_resistance_time)
- addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_BATON_RESISTANCE, REF(src)), stun_resistance_time)
- addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_STUNIMMUNE, REF(src)), stun_resistance_time)
+ give_stun_buffs(owner)
+ addtimer(CALLBACK(src, PROC_REF(remove_stun_buffs), owner), stun_resistance_time)
COOLDOWN_START(src, implant_cooldown, 60 SECONDS)
addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS)
@@ -163,6 +162,14 @@
if(owner)
to_chat(owner, span_purple("Your rebooter implant is ready."))
+/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner)
+ give_to.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src))
+ give_to.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown)
+
+/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner)
+ remove_from.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src))
+ remove_from.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown)
+
/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity)
. = ..()
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm
index 7904c4bea91cc..fa034acf22bd7 100644
--- a/code/modules/surgery/organs/internal/tongue/_tongue.dm
+++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm
@@ -546,6 +546,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
attack_verb_simple = list("beep", "boop")
modifies_speech = TRUE
taste_sensitivity = 25 // not as good as an organic tongue
+ organ_traits = list(TRAIT_SILICON_EMOTES_ALLOWED)
voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000"
/obj/item/organ/internal/tongue/robot/could_speak_language(datum/language/language_path)
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 8a869071c7c48..911887cc8b900 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -139,6 +139,7 @@
#include "dummy_spawn.dm"
#include "dynamic_ruleset_sanity.dm"
#include "egg_glands.dm"
+#include "embedding.dm"
#include "emoting.dm"
#include "ensure_subtree_operational_datum.dm"
#include "explosion_action.dm"
diff --git a/code/modules/unit_tests/embedding.dm b/code/modules/unit_tests/embedding.dm
new file mode 100644
index 0000000000000..05e8cc8b8aa27
--- /dev/null
+++ b/code/modules/unit_tests/embedding.dm
@@ -0,0 +1,14 @@
+/datum/unit_test/embedding
+
+/datum/unit_test/embedding/Run()
+ var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent)
+ var/mob/living/carbon/human/firer = allocate(/mob/living/carbon/human/consistent)
+ var/obj/projectile/bullet/c38/bullet = new(get_turf(firer))
+ bullet.set_embed(bullet.get_embed().generate_with_values(embed_chance = 100))
+ TEST_ASSERT_EQUAL(bullet.get_embed().embed_chance, 100, "embed_chance failed to modify")
+ bullet.preparePixelProjectile(victim, firer)
+ bullet.fire(get_angle(firer, victim), victim)
+ var/list/components = victim.GetComponents(/datum/component/embedded)
+ TEST_ASSERT_EQUAL(components.len, 1, "Projectile with 100% embed chance didn't embed, or embedded multiple times")
+ var/datum/component/embedded/comp = components[1]
+ TEST_ASSERT_EQUAL(comp.weapon.get_embed().embed_chance, 100, "embed_chance modification did not transfer to shrapnel")
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index ebecb03e1302c..32ef86a302b26 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -26,6 +26,7 @@
/obj/item/storage/belt/security/webbing = 5,
/obj/item/coin/antagtoken = 1,
/obj/item/clothing/head/helmet/blueshirt = 1,
+ /obj/item/clothing/gloves/color/black/security/blu = 1,
/obj/item/clothing/suit/armor/vest/blueshirt = 1,
/obj/item/grenade/stingbang = 1,
/obj/item/watertank/pepperspray = 2,
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 3f82a219e56c9..ef2eff9d991ec 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -50,10 +50,11 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE)
/obj/item/clothing/under/rank/security/officer/grey = 3,
/obj/item/clothing/under/pants/slacks = 3,
/obj/item/clothing/under/rank/security/officer/blueshirt = 3,
+ /obj/item/clothing/gloves/color/black/security/blu = 3,
/obj/item/clothing/suit/armor/vest/secjacket = 3,
/obj/item/clothing/suit/hooded/wintercoat/security = 3,
/obj/item/clothing/suit/armor/vest = 3,
- /obj/item/clothing/gloves/color/black = 3,
+ /obj/item/clothing/gloves/color/black/security = 3,
/obj/item/clothing/shoes/jackboots/sec = 3,
/obj/item/storage/backpack/security = 3,
/obj/item/storage/backpack/satchel/sec = 3,
diff --git a/html/changelogs/AutoChangeLog-pr-83262.yml b/html/changelogs/AutoChangeLog-pr-83262.yml
deleted file mode 100644
index 0635b7956c837..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-83262.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Xackii"
-delete-after: True
-changes:
- - rscadd: "new wizard spells category - perks."
- - rscadd: "adds 9 wizard perks."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84646.yml b/html/changelogs/AutoChangeLog-pr-84646.yml
deleted file mode 100644
index d0054cb8f14b3..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84646.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Examining high-value paintings now can give a positive moodlet."
- - qol: "Observers can now zoom paintings in and out in the UI."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84731.yml b/html/changelogs/AutoChangeLog-pr-84731.yml
deleted file mode 100644
index 2d3b87db1f818..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84731.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MTandi"
-delete-after: True
-changes:
- - qol: "Research nodes can be queued, one per player. RDs can place their node at the beginning of the queue."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84779.yml b/html/changelogs/AutoChangeLog-pr-84779.yml
deleted file mode 100644
index ca8c222b88b4d..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84779.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "tweaked the Linked Closets station trait."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84790.yml b/html/changelogs/AutoChangeLog-pr-84790.yml
deleted file mode 100644
index fd4e76d0d67d8..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84790.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "ACTUALLY fixed hoverboards being able to be used in space."
- - balance: "However, you can soar space with the holy skateboard. at a slower speed."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84827.yml b/html/changelogs/AutoChangeLog-pr-84827.yml
deleted file mode 100644
index 2fd1418dda2d1..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84827.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "paganiy"
-delete-after: True
-changes:
- - rscadd: "If you can't shoot a gun, then... JUST TOSS IT AT THEM (for 0.5 seconds of knockdown and 10-20 an additional brute damage)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84840.yml b/html/changelogs/AutoChangeLog-pr-84840.yml
deleted file mode 100644
index a0db9885bb229..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84840.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "00-Steven"
-delete-after: True
-changes:
- - rscadd: "Love is now stored in the heart."
- - balance: "Characters with the Friendly quirk now have physically bigger hearts."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84843.yml b/html/changelogs/AutoChangeLog-pr-84843.yml
deleted file mode 100644
index 6235c182c1a1b..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84843.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscadd: "Megaphones now affect text-to-speech."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84860.yml b/html/changelogs/AutoChangeLog-pr-84860.yml
deleted file mode 100644
index 9081bdbc3226b..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84860.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Sadboysuss"
-delete-after: True
-changes:
- - sound: "all materials now have a sound for picking up and dropping"
- - code_imp: "items now have pitch vary sound support for dropping and picking up items"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84861.yml b/html/changelogs/AutoChangeLog-pr-84861.yml
deleted file mode 100644
index e9203c51f338d..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84861.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hardly3D"
-delete-after: True
-changes:
- - bugfix: "Added a preview assistant outfit, allowing assistant jumpskirts to be previewed again on character preferences."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84865.yml b/html/changelogs/AutoChangeLog-pr-84865.yml
deleted file mode 100644
index 4686b3104da41..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84865.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - qol: "removed a redundant, annoying reach check that prevents casting a fishing rod before the projectile is generated."
- - qol: "You can now unhook the currently hooked item of a fishing rod with right-click."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84881.yml b/html/changelogs/AutoChangeLog-pr-84881.yml
deleted file mode 100644
index 1ec13a1734f8a..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84881.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Sadboysuss"
-delete-after: True
-changes:
- - bugfix: "Wawastation xenobio is no longer filled with BZ"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84891.yml b/html/changelogs/AutoChangeLog-pr-84891.yml
deleted file mode 100644
index d3a4abccc1837..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84891.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - bugfix: "Fixes overwatch glasses not adding HUDs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84895.yml b/html/changelogs/AutoChangeLog-pr-84895.yml
deleted file mode 100644
index 079ace6685d4e..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84895.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "reduced the prices of some blackmarket items across the board."
- - balance: "the thermite bottle (from the contraband spawner and the blackmarket), now spawns with 50u of thermite vs 30, enough to melt one reinforced wall."
- - rscadd: "Replaced the science googles from the blackmarket with a security + health scanner HUD."
- - rscadd: "Replaced the single shotgun dart from the blackmarket with a box of XL shotgun darts."
- - rscadd: "The donk pocket box from the blackmarket now comes in different flavors."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84905.yml b/html/changelogs/AutoChangeLog-pr-84905.yml
deleted file mode 100644
index aa77c54a6ec47..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84905.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "itseasytosee"
-delete-after: True
-changes:
- - image: "Changed some default options in the character creator."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84917.yml b/html/changelogs/AutoChangeLog-pr-84917.yml
deleted file mode 100644
index 0bfb0cadab199..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84917.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Melbert"
-delete-after: True
-changes:
- - qol: "Lattices now make the same footstep sound as catwalks"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84918.yml b/html/changelogs/AutoChangeLog-pr-84918.yml
deleted file mode 100644
index c3882e601572b..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84918.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrDas"
-delete-after: True
-changes:
- - bugfix: "Clown operative reinforcements' uplink no longer break the syndicates' economy by creating TC from nothingness."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84921.yml b/html/changelogs/AutoChangeLog-pr-84921.yml
deleted file mode 100644
index 873f3660780c7..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84921.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ben10Omintrix"
-delete-after: True
-changes:
- - bugfix: "mothroaches will no longer be crawling out of bags every minute"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84924.yml b/html/changelogs/AutoChangeLog-pr-84924.yml
deleted file mode 100644
index 55e9c85e8cbf2..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84924.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheBoondock"
-delete-after: True
-changes:
- - sound: "added pickup, dropping and opening sound for pill bottle"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84925.yml b/html/changelogs/AutoChangeLog-pr-84925.yml
deleted file mode 100644
index 5e47956edec24..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84925.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "GPeckman"
-delete-after: True
-changes:
- - bugfix: "You can't attach guns/drills/etc. to the Justice traitor mech anymore."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84927.yml b/html/changelogs/AutoChangeLog-pr-84927.yml
deleted file mode 100644
index 697c145aaab01..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84927.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - qol: "Pathfinder MODule can now be triggered while wearing the MODsuit to implant yourself without having to pull it out of the suit."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84930.yml b/html/changelogs/AutoChangeLog-pr-84930.yml
deleted file mode 100644
index f20fe9a2998df..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84930.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - admin: "Outfit manager UI no longer harddels after closing and thus is usable more than once"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84933.yml b/html/changelogs/AutoChangeLog-pr-84933.yml
deleted file mode 100644
index ea174ad4a6375..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84933.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r3dj4ck0424"
-delete-after: True
-changes:
- - bugfix: "Destroying the jungle grass tiles in Tramstation's science wing should no longer open a chasm."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84936.yml b/html/changelogs/AutoChangeLog-pr-84936.yml
deleted file mode 100644
index 72ff6982d3c67..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84936.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "lizardqueenlexi"
-delete-after: True
-changes:
- - bugfix: "You can no longer cause a bluescreen by attempting to recolor non-recolorable loadout items."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84940.yml b/html/changelogs/AutoChangeLog-pr-84940.yml
deleted file mode 100644
index 30ed28bce2a25..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84940.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - admin: "Ghosts can no longer create deathmatch lobbies or join existing ones when admins disable minigames"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84941.yml b/html/changelogs/AutoChangeLog-pr-84941.yml
deleted file mode 100644
index 3120b917ad7e3..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84941.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - bugfix: "Accelerator cannon projectiles no longer grow to absurd sizes after a bit of travel."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84942.yml b/html/changelogs/AutoChangeLog-pr-84942.yml
new file mode 100644
index 0000000000000..0feec6261f532
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84942.yml
@@ -0,0 +1,4 @@
+author: "imedial"
+delete-after: True
+changes:
+ - rscadd: "standing on a closed crate now gives loud mode"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84943.yml b/html/changelogs/AutoChangeLog-pr-84943.yml
deleted file mode 100644
index 7c7df08159daa..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84943.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "larentoun"
-delete-after: True
-changes:
- - bugfix: "Correct emote plays when a human scream. Should have sound now."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84945.yml b/html/changelogs/AutoChangeLog-pr-84945.yml
deleted file mode 100644
index b878f33ebec15..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84945.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FlufflesTheDog"
-delete-after: True
-changes:
- - bugfix: "Attachment points on toolset implants have been improved, to prevent against recycler related decouplings."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84946.yml b/html/changelogs/AutoChangeLog-pr-84946.yml
deleted file mode 100644
index b20f28982b2a9..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84946.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Melbert"
-delete-after: True
-changes:
- - qol: "If you're in oxycrit (>50 oxy damage) or otherwise made unconscious through other means, blood loss will only kill you if you're *actually* missing a lethal amount of blood."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84947.yml b/html/changelogs/AutoChangeLog-pr-84947.yml
deleted file mode 100644
index 6c2d183cfb5e9..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84947.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - spellcheck: "Firelocks no longer output their full name in their balloon alert."
- - spellcheck: "Failure message when a xenomorph tries to force open a welded firelock is now a balloon alert."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84949.yml b/html/changelogs/AutoChangeLog-pr-84949.yml
deleted file mode 100644
index 3bca324862bee..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84949.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Grinding fish no longer gives you uselessly high amount of blood and gibs (unless they're very big)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84952.yml b/html/changelogs/AutoChangeLog-pr-84952.yml
deleted file mode 100644
index 23e21d669ee35..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84952.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FearfulFurnishing"
-delete-after: True
-changes:
- - bugfix: "fixing speech modifiers being applied to a tongue's native languages."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84956.yml b/html/changelogs/AutoChangeLog-pr-84956.yml
deleted file mode 100644
index b5cb51610cafa..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84956.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SmArtKar"
-delete-after: True
-changes:
- - bugfix: "You can no longer fit an infinite amount of drivers into a clown car - making spy-acquired clown cars usable!"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84957.yml b/html/changelogs/AutoChangeLog-pr-84957.yml
deleted file mode 100644
index 00bab247c1aba..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84957.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "lizardqueenlexi"
-delete-after: True
-changes:
- - bugfix: "The Icebox ordnance lab is now once again a habitable temperature."
- - bugfix: "Icebox cytology now has cameras in it."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84958.yml b/html/changelogs/AutoChangeLog-pr-84958.yml
deleted file mode 100644
index e29af268d4d42..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84958.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "lizardqueenlexi"
-delete-after: True
-changes:
- - bugfix: "Atmosphere can no longer flow through closed necropolis gates."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84959.yml b/html/changelogs/AutoChangeLog-pr-84959.yml
deleted file mode 100644
index 97ce8febaaa9e..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84959.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Profakos"
-delete-after: True
-changes:
- - bugfix: "Fixes dead raptors getting excited when petted or groomed"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84960.yml b/html/changelogs/AutoChangeLog-pr-84960.yml
deleted file mode 100644
index e2c2ce470aee7..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84960.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscadd: "Pipe pistols now magdump their entire magazine when fired."
- - rscadd: "Pipeguns and their subtypes have a knockback effect."
- - bugfix: "Pipe pistols cannot be bayoneted, as intended."
- - bugfix: "Junk rounds now actually do their extra damage effects against certain mob types. Borgs across the Spinward tremble at the knowledge that these junk weapons can obliterate them with ease."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84962.yml b/html/changelogs/AutoChangeLog-pr-84962.yml
new file mode 100644
index 0000000000000..0bdc3cca7923e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84962.yml
@@ -0,0 +1,7 @@
+author: "Pickle-Coding"
+delete-after: True
+changes:
+ - bugfix: "Fixes space heater cell relative consumption inadvertently being changed from the introduction of megacells."
+ - qol: "The improvised chemical heater gives a more accurate description of its heating power on examine."
+ - qol: "Improved feedback when attempting to turn on a space heater that is lacking a cell, has no charge or is broken."
+ - code_imp: "Space heater relative cell consumption is consistent regardless of the cell charge scale."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84978.yml b/html/changelogs/AutoChangeLog-pr-84978.yml
new file mode 100644
index 0000000000000..e49418a569618
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84978.yml
@@ -0,0 +1,4 @@
+author: "grungussuss"
+delete-after: True
+changes:
+ - rscadd: "You can now buckle to bar stools"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84983.yml b/html/changelogs/AutoChangeLog-pr-84983.yml
new file mode 100644
index 0000000000000..aff73f61b86bf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84983.yml
@@ -0,0 +1,5 @@
+author: "MTandi"
+delete-after: True
+changes:
+ - bugfix: "Fixed emitters, shield gens and other wired machinery having lower power consumption priority than APCs"
+ - qol: "Made APCs charge more evenly to ensure that environment and lights are working everywhere before giving the power for equipment"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84986.yml b/html/changelogs/AutoChangeLog-pr-84986.yml
new file mode 100644
index 0000000000000..91e9981c3bc8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84986.yml
@@ -0,0 +1,4 @@
+author: "Sadboysuss"
+delete-after: True
+changes:
+ - bugfix: "added a missing cable to Wawastation perma"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84987.yml b/html/changelogs/AutoChangeLog-pr-84987.yml
new file mode 100644
index 0000000000000..941b6d80d9ba5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84987.yml
@@ -0,0 +1,4 @@
+author: "SmArtKar"
+delete-after: True
+changes:
+ - qol: "Stopping orbiting now automatically breaks you out of autoobserve"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84989.yml b/html/changelogs/AutoChangeLog-pr-84989.yml
new file mode 100644
index 0000000000000..89e1e0e4a744e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84989.yml
@@ -0,0 +1,4 @@
+author: "grungususs"
+delete-after: True
+changes:
+ - spellcheck: "fixed a typo for carrot sword description"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84991.yml b/html/changelogs/AutoChangeLog-pr-84991.yml
new file mode 100644
index 0000000000000..cc34488a039f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84991.yml
@@ -0,0 +1,4 @@
+author: "afonamos2"
+delete-after: True
+changes:
+ - bugfix: "malf ai voice changer no longer accepts dangerous inputs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84995.yml b/html/changelogs/AutoChangeLog-pr-84995.yml
new file mode 100644
index 0000000000000..83a9ec235465b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84995.yml
@@ -0,0 +1,4 @@
+author: "Rhials"
+delete-after: True
+changes:
+ - bugfix: "Xenos have a \"resist\" ui element now. Cool!"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84996.yml b/html/changelogs/AutoChangeLog-pr-84996.yml
new file mode 100644
index 0000000000000..654d0b1da31c7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84996.yml
@@ -0,0 +1,4 @@
+author: "xXPawnStarrXx"
+delete-after: True
+changes:
+ - qol: "made fish better quality when butchered, smushy koibeans and useable gunner jellyfish."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-85000.yml b/html/changelogs/AutoChangeLog-pr-85000.yml
new file mode 100644
index 0000000000000..9cda6ec758a07
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-85000.yml
@@ -0,0 +1,4 @@
+author: "Yobrocharlie"
+delete-after: True
+changes:
+ - bugfix: "Removed bitrunning beach brawl fax machine"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-85005.yml b/html/changelogs/AutoChangeLog-pr-85005.yml
new file mode 100644
index 0000000000000..e554b62ccdbb0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-85005.yml
@@ -0,0 +1,4 @@
+author: "SmArtKar"
+delete-after: True
+changes:
+ - bugfix: "Fixes hulks being able to activate dualsabers despite not being able to actually do anything with them"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-85006.yml b/html/changelogs/AutoChangeLog-pr-85006.yml
new file mode 100644
index 0000000000000..83c9c3ec18857
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-85006.yml
@@ -0,0 +1,4 @@
+author: "SmArtKar"
+delete-after: True
+changes:
+ - qol: "You can properly aim mining bombs at turfs now"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-85009.yml b/html/changelogs/AutoChangeLog-pr-85009.yml
new file mode 100644
index 0000000000000..ad8ce9011b4f5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-85009.yml
@@ -0,0 +1,4 @@
+author: "SyncIt21"
+delete-after: True
+changes:
+ - bugfix: "borgs can't put their integrated tools into the reagent grinder"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
index f1020236ab78b..bfaf0581737c7 100644
--- a/html/changelogs/archive/2024-07.yml
+++ b/html/changelogs/archive/2024-07.yml
@@ -798,3 +798,127 @@
2024-07-15:
Thedragmeme:
- bugfix: Fixes the Plague hat having what the Plague mask should have
+2024-07-16:
+ 00-Steven:
+ - rscadd: Love is now stored in the heart.
+ - balance: Characters with the Friendly quirk now have physically bigger hearts.
+ Ben10Omintrix:
+ - bugfix: mothroaches will no longer be crawling out of bags every minute
+ FearfulFurnishing:
+ - bugfix: fixing speech modifiers being applied to a tongue's native languages.
+ FlufflesTheDog:
+ - bugfix: Attachment points on toolset implants have been improved, to prevent against
+ recycler related decouplings.
+ GPeckman:
+ - bugfix: You can't attach guns/drills/etc. to the Justice traitor mech anymore.
+ Ghommie:
+ - balance: Grinding fish no longer gives you uselessly high amount of blood and
+ gibs (unless they're very big)
+ - balance: tweaked the Linked Closets station trait.
+ - rscadd: Megaphones now affect text-to-speech.
+ - rscadd: Examining high-value paintings now can give a positive moodlet.
+ - qol: Observers can now zoom paintings in and out in the UI.
+ - bugfix: ACTUALLY fixed hoverboards being able to be used in space.
+ - balance: However, you can soar space with the holy skateboard. at a slower speed.
+ - qol: removed a redundant, annoying reach check that prevents casting a fishing
+ rod before the projectile is generated.
+ - qol: You can now unhook the currently hooked item of a fishing rod with right-click.
+ - balance: reduced the prices of some blackmarket items across the board.
+ - balance: the thermite bottle (from the contraband spawner and the blackmarket),
+ now spawns with 50u of thermite vs 30, enough to melt one reinforced wall.
+ - rscadd: Replaced the science googles from the blackmarket with a security + health
+ scanner HUD.
+ - rscadd: Replaced the single shotgun dart from the blackmarket with a box of XL
+ shotgun darts.
+ - rscadd: The donk pocket box from the blackmarket now comes in different flavors.
+ Hardly3D:
+ - bugfix: Added a preview assistant outfit, allowing assistant jumpskirts to be
+ previewed again on character preferences.
+ MTandi:
+ - qol: Research nodes can be queued, one per player. RDs can place their node at
+ the beginning of the queue.
+ Melbert:
+ - qol: Lattices now make the same footstep sound as catwalks
+ - qol: If you're in oxycrit (>50 oxy damage) or otherwise made unconscious through
+ other means, blood loss will only kill you if you're *actually* missing a lethal
+ amount of blood.
+ MrDas:
+ - bugfix: Clown operative reinforcements' uplink no longer break the syndicates'
+ economy by creating TC from nothingness.
+ Profakos:
+ - bugfix: Fixes dead raptors getting excited when petted or groomed
+ Sadboysuss:
+ - sound: all materials now have a sound for picking up and dropping
+ - code_imp: items now have pitch vary sound support for dropping and picking up
+ items
+ - bugfix: Wawastation xenobio is no longer filled with BZ
+ SmArtKar:
+ - admin: Ghosts can no longer create deathmatch lobbies or join existing ones when
+ admins disable minigames
+ - admin: Outfit manager UI no longer harddels after closing and thus is usable more
+ than once
+ - qol: Pathfinder MODule can now be triggered while wearing the MODsuit to implant
+ yourself without having to pull it out of the suit.
+ - spellcheck: Firelocks no longer output their full name in their balloon alert.
+ - spellcheck: Failure message when a xenomorph tries to force open a welded firelock
+ is now a balloon alert.
+ - bugfix: You can no longer fit an infinite amount of drivers into a clown car -
+ making spy-acquired clown cars usable!
+ - bugfix: Accelerator cannon projectiles no longer grow to absurd sizes after a
+ bit of travel.
+ - bugfix: Fixes overwatch glasses not adding HUDs
+ TheBoondock:
+ - sound: added pickup, dropping and opening sound for pill bottle
+ Xackii:
+ - rscadd: new wizard spells category - perks.
+ - rscadd: adds 9 wizard perks.
+ itseasytosee:
+ - image: Changed some default options in the character creator.
+ larentoun:
+ - bugfix: Correct emote plays when a human scream. Should have sound now.
+ lizardqueenlexi:
+ - bugfix: The Icebox ordnance lab is now once again a habitable temperature.
+ - bugfix: Icebox cytology now has cameras in it.
+ - bugfix: Atmosphere can no longer flow through closed necropolis gates.
+ - bugfix: You can no longer cause a bluescreen by attempting to recolor non-recolorable
+ loadout items.
+ necromanceranne:
+ - rscadd: Pipe pistols now magdump their entire magazine when fired.
+ - rscadd: Pipeguns and their subtypes have a knockback effect.
+ - bugfix: Pipe pistols cannot be bayoneted, as intended.
+ - bugfix: Junk rounds now actually do their extra damage effects against certain
+ mob types. Borgs across the Spinward tremble at the knowledge that these junk
+ weapons can obliterate them with ease.
+ paganiy:
+ - rscadd: If you can't shoot a gun, then... JUST TOSS IT AT THEM (for 0.5 seconds
+ of knockdown and 10-20 an additional brute damage)
+ r3dj4ck0424:
+ - bugfix: Destroying the jungle grass tiles in Tramstation's science wing should
+ no longer open a chasm.
+2024-07-17:
+ 00-Steven:
+ - rscadd: Having a robotic voicebox installed now lets you use silicon emotes.
+ - balance: MMI'd brains/posibrains can now use silicon emotes.
+ - balance: Simple and basic bots can actually beep.
+ - bugfix: MMI'd brains/posibrains are no longer both allowed AND blocked from beeping,
+ now just being allowed to beep.
+ JohnFulpWillard:
+ - balance: Human AIs no longer have a teleport blocking implant or borg costume,
+ but now has a portable crew monitor.
+ Melbert:
+ - bugfix: Using hulk (and a myriad of similar effects) now properly updates your
+ movespeed to ignore the damage movespeed penalty
+ - bugfix: Some things which temporarily make you fly don't make you fly forever
+ - bugfix: MODsuit ball module now properly makes you immune to damage movespeed
+ penalty when in ball form
+ - bugfix: Adding Hulk via VV dropdown doesn't default to adding the strongest hulk
+ available (that which is used by the medieval pirates)
+ SmArtKar:
+ - bugfix: Ghosts can no longer move chairs
+ - bugfix: You can attack bookshelves in a variety of states once more
+ - bugfix: Style meter text is no longer blurry and doesnt overlap with UI anymore.
+ - qol: You can fire PKAs/plasma cutters point blank at turfs.
+ Thedragmeme:
+ - qol: re-maps the raptor barn to not stick out like a sore thumb
+ - bugfix: Miners and the public both can access the raptor barn without having to
+ make a bridge themselves
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index ded01542e31b6..b62b6a0a8ee58 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 465340870dd48..4739498c16426 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 36c85642ad23c..1ee06ed48550d 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -133,6 +133,7 @@ h1.alert, h2.alert {color: #000000;}
.robot {font-family: "Courier New", cursive, sans-serif;}
.command_headset {font-weight: bold; font-size: 3;}
+.soapbox {font-weight: bold; font-size: 3;}
.small {font-size: 1;}
.big {font-size: 3;}
.reallybig {font-size: 4;}
diff --git a/tgstation.dme b/tgstation.dme
index e0fb60d58cf9b..f340a6efd2c93 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1207,6 +1207,7 @@
#include "code\datums\components\slime_friends.dm"
#include "code\datums\components\slippery.dm"
#include "code\datums\components\smooth_tunes.dm"
+#include "code\datums\components\soapbox.dm"
#include "code\datums\components\soul_stealer.dm"
#include "code\datums\components\soulstoned.dm"
#include "code\datums\components\sound_player.dm"
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index 22a725e71da73..8f3fddc9469ff 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -747,6 +747,11 @@ em {
font-size: 160%;
}
+.soapbox {
+ font-weight: bold;
+ font-size: 135%;
+}
+
.small {
font-size: 60%;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 7e8908545ed2f..e15e8aa3a5ac2 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -774,6 +774,11 @@ h2.alert {
font-size: 160%;
}
+.soapbox {
+ font-weight: bold;
+ font-size: 135%;
+}
+
.small {
font-size: 60%;
}