diff --git a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm
index f236a25a6a0..ad90df10167 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm
@@ -4,7 +4,7 @@
/area/template_noop)
"b" = (
/turf/closed/mineral/strong,
-/area/template_noop)
+/area/lavaland/surface/outdoors)
(1,1,1) = {"
a
diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm
index 21b1cddf818..95ecc1879fd 100644
--- a/_maps/map_files/Birdshot/birdshot.dmm
+++ b/_maps/map_files/Birdshot/birdshot.dmm
@@ -788,6 +788,12 @@
},
/turf/open/floor/iron/smooth,
/area/station/engineering/supermatter/room)
+"aqM" = (
+/obj/effect/turf_decal/bot_white,
+/obj/structure/rack,
+/obj/item/electronics/apc,
+/turf/open/floor/iron/smooth_large,
+/area/station/cargo/warehouse)
"aqU" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
@@ -1967,6 +1973,10 @@
},
/turf/open/floor/plating,
/area/station/engineering/supermatter)
+"aPK" = (
+/obj/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"aPM" = (
/obj/structure/chair/sofa/bench/right,
/obj/machinery/firealarm/directional/north,
@@ -3525,6 +3535,15 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/carpet/orange,
/area/station/service/abandoned_gambling_den)
+"buP" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/duct,
+/obj/effect/spawner/random/trash,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"buS" = (
/obj/structure/window/reinforced/plasma/spawner/directional/east,
/obj/effect/turf_decal/stripes/white/line{
@@ -3728,6 +3747,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/engineering/atmospherics_engine)
+"bzi" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/duct,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"bzn" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/yellow/opposingcorners,
@@ -3910,6 +3936,11 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/engineering/atmospherics_engine)
+"bBA" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/holopad,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"bCf" = (
/obj/machinery/computer/shuttle/labor{
dir = 8
@@ -5414,14 +5445,6 @@
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron/smooth_large,
/area/station/science/auxlab/firing_range)
-"cgD" = (
-/obj/machinery/door/airlock{
- name = "Mineshaft"
- },
-/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
"cgM" = (
/turf/open/misc/asteroid,
/area/station/maintenance/starboard/greater)
@@ -5497,14 +5520,6 @@
},
/turf/open/floor/iron,
/area/station/maintenance/port/fore)
-"ciL" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/structure/extinguisher_cabinet/directional/north,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"ciR" = (
/obj/structure/table,
/obj/effect/spawner/random/techstorage/command_all,
@@ -8047,6 +8062,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
+"dhg" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"dhh" = (
/obj/structure/cable,
/obj/machinery/status_display/ai/directional/north,
@@ -8378,6 +8398,11 @@
/obj/effect/landmark/start/depsec/medical,
/turf/open/floor/iron/smooth,
/area/station/security/checkpoint/customs/auxiliary)
+"dmo" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/sign/poster/official/random/directional/west,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"dmw" = (
/obj/machinery/atmospherics/components/tank/plasma,
/obj/structure/window/reinforced/plasma/spawner/directional/east,
@@ -8386,10 +8411,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/disposal/incinerator)
-"dmz" = (
-/obj/effect/spawner/random/structure/closet_maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"dmT" = (
/obj/machinery/camera/directional/north{
c_tag = "Xenobiology - Cell 2";
@@ -9311,6 +9332,9 @@
/obj/machinery/camera/autoname/directional/south,
/turf/open/floor/iron/smooth,
/area/station/security/checkpoint/escape)
+"dDV" = (
+/turf/closed/wall,
+/area/station/commons/fitness/recreation/entertainment)
"dEt" = (
/obj/machinery/atmospherics/pipe/smart/simple/green/visible{
dir = 6
@@ -9704,6 +9728,13 @@
/obj/effect/spawner/random/engineering/tracking_beacon,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"dMV" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"dMX" = (
/obj/machinery/holopad/secure,
/turf/open/floor/iron/dark,
@@ -10489,6 +10520,11 @@
},
/turf/open/floor/iron/small,
/area/station/security/prison/shower)
+"dZU" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"dZZ" = (
/obj/structure/cable/layer3,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -10952,6 +10988,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/science/ordnance/testlab)
+"ejy" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/trash,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"ejH" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -11008,6 +11049,17 @@
/obj/structure/closet/firecloset,
/turf/open/floor/iron,
/area/station/maintenance/starboard/aft)
+"ekP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/table,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
+"ekX" = (
+/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,
+/area/station/commons/fitness/recreation/entertainment)
"ekZ" = (
/obj/structure/disposalpipe/segment,
/obj/effect/landmark/navigate_destination,
@@ -11643,6 +11695,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/catwalk_floor/iron,
/area/station/science/lobby)
+"euV" = (
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"euX" = (
/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{
dir = 8
@@ -12161,6 +12219,16 @@
/obj/structure/cable,
/turf/open/floor/plating/rust,
/area/station/maintenance/fore/lesser)
+"eDT" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/glass{
+ name = "Holodeck"
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"eDX" = (
/obj/structure/table/glass,
/obj/item/folder/red{
@@ -13709,6 +13777,16 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"fiR" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Holodeck Door"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "holodeck"
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"fjh" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
@@ -13891,6 +13969,10 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating,
/area/station/security/prison/work)
+"fmE" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"fmH" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -14496,6 +14578,10 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/ce)
+"fvW" = (
+/obj/machinery/vending/clothing,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"fwc" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -14573,6 +14659,11 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
/area/station/hallway/secondary/entry)
+"fxk" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"fxt" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -14611,6 +14702,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/maintenance/hallway/abandoned_recreation)
+"fyf" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
+"fyk" = (
+/obj/structure/window/reinforced/shuttle,
+/obj/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"fyo" = (
/obj/structure/table,
/obj/machinery/light/small/directional/east,
@@ -15566,6 +15666,10 @@
},
/turf/open/floor/engine/o2,
/area/station/engineering/atmos)
+"fMP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"fMQ" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -15607,6 +15711,12 @@
},
/turf/open/floor/engine/o2,
/area/station/engineering/atmos)
+"fNs" = (
+/obj/machinery/light/small/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/firecloset,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"fNu" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -16427,6 +16537,14 @@
},
/turf/open/floor/plating,
/area/station/medical/treatment_center)
+"gex" = (
+/obj/machinery/firealarm/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/broken_flooring/corner/directional/north,
+/obj/structure/sign/poster/official/random/directional/west,
+/obj/effect/spawner/random/vending/snackvend,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"geE" = (
/obj/structure/window/reinforced/spawner/directional/east,
/obj/structure/window/reinforced/spawner/directional/south,
@@ -18221,6 +18339,13 @@
"gLb" = (
/turf/closed/wall,
/area/station/medical/virology)
+"gLo" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/chair/sofa/bench/right{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"gLs" = (
/obj/effect/turf_decal/siding/thinplating{
dir = 8
@@ -18954,6 +19079,10 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/security/processing)
+"gWG" = (
+/obj/effect/spawner/random/vending/colavend,
+/turf/open/floor/plating/rust,
+/area/station/maintenance/fore/greater)
"gWN" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -19413,21 +19542,6 @@
},
/turf/open/floor/wood/large,
/area/station/command/corporate_suite)
-"hek" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/structure/closet/secure_closet/personal,
-/obj/item/storage/backpack,
-/obj/item/storage/backpack/satchel,
-/obj/item/clothing/suit/hooded/wintercoat,
-/obj/item/clothing/shoes/winterboots,
-/obj/effect/landmark/start/hangover/closet,
-/obj/effect/mapping_helpers/broken_floor,
-/obj/structure/sign/poster/official/random/directional/north,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/commons)
"hem" = (
/turf/closed/wall,
/area/station/hallway/primary/fore)
@@ -20241,16 +20355,6 @@
/obj/effect/turf_decal/stripes/white/line,
/turf/open/floor/plating,
/area/station/cargo/miningoffice)
-"hsK" = (
-/obj/machinery/recycler{
- dir = 8
- },
-/obj/machinery/conveyor{
- dir = 4;
- id = "garbage"
- },
-/turf/open/floor/plating,
-/area/station/service/janitor)
"hsO" = (
/obj/structure/cable,
/obj/effect/spawner/structure/window,
@@ -20314,6 +20418,12 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
+"hue" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/commons)
"huh" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -20689,16 +20799,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
-"hzN" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"hzV" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -20886,6 +20986,14 @@
/obj/machinery/light/floor,
/turf/open/floor/iron/dark/small,
/area/station/security/brig)
+"hCa" = (
+/obj/machinery/airalarm/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"hCn" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -20916,6 +21024,15 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/station/solars/aft)
+"hCV" = (
+/obj/machinery/camera/directional/south{
+ c_tag = "Holodeck - Aft";
+ name = "holodeck camera"
+ },
+/turf/open/floor/engine{
+ name = "Holodeck Projector Floor"
+ },
+/area/station/holodeck/rec_center)
"hCX" = (
/obj/structure/chair/sofa/bench/left{
dir = 4
@@ -21023,12 +21140,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/smooth,
/area/station/hallway/secondary/command)
-"hFm" = (
-/obj/effect/turf_decal/bot_white,
-/obj/structure/rack,
-/obj/item/electronics/apc,
-/turf/open/floor/iron/smooth_large,
-/area/station/cargo/warehouse)
"hFx" = (
/turf/open/floor/iron/chapel{
dir = 1
@@ -21072,6 +21183,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/stairs,
/area/station/medical/medbay/central)
+"hGT" = (
+/obj/machinery/light/cold/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/entertainment/arcade{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"hHf" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin{
@@ -21174,11 +21293,6 @@
"hJp" = (
/turf/closed/wall/r_wall/rust,
/area/station/ai_monitored/turret_protected/ai)
-"hJr" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"hJC" = (
/obj/structure/closet/crate/hydroponics,
/obj/item/paper/guides/jobs/hydroponics,
@@ -21833,6 +21947,15 @@
/obj/effect/mapping_helpers/airlock/access/all/medical/cmo,
/turf/open/floor/wood/parquet,
/area/station/command/heads_quarters/cmo)
+"hWF" = (
+/obj/machinery/camera/directional/north{
+ c_tag = "Holodeck - Fore";
+ name = "holodeck camera"
+ },
+/turf/open/floor/engine{
+ name = "Holodeck Projector Floor"
+ },
+/area/station/holodeck/rec_center)
"hWJ" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -22684,11 +22807,6 @@
/obj/effect/spawner/random/engineering/atmospherics_portable,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
-"imd" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/closet/firecloset,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"imj" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "permaouter";
@@ -23306,11 +23424,6 @@
/obj/structure/window/spawner/directional/west,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
-"ivO" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"ivX" = (
/obj/structure/cable,
/obj/effect/mapping_helpers/broken_floor,
@@ -23364,6 +23477,10 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"ixa" = (
+/obj/effect/spawner/random/structure/closet_maintenance,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"ixl" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -23729,10 +23846,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
-"iFi" = (
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
"iFs" = (
/obj/structure/window/spawner/directional/east,
/turf/open/misc/sandy_dirt,
@@ -23770,6 +23883,13 @@
dir = 1
},
/area/station/engineering/atmos)
+"iGi" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sink/directional/south,
+/obj/item/reagent_containers/cup/bucket,
+/obj/item/mop,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"iGl" = (
/turf/open/floor/plating,
/area/station/maintenance/hallway/abandoned_command)
@@ -23814,11 +23934,6 @@
/obj/effect/mapping_helpers/airlock/access/all/command/general,
/turf/open/floor/plating,
/area/station/maintenance/fore/lesser)
-"iHs" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/spawner/random/engineering/atmospherics_portable,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"iHy" = (
/obj/structure/window/reinforced/plasma/spawner/directional/east,
/obj/effect/turf_decal/stripes/line{
@@ -24353,19 +24468,6 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/smooth,
/area/station/engineering/supermatter/room)
-"iQF" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/spawner/random/structure/closet_maintenance,
-/obj/effect/spawner/random/maintenance,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
-"iQK" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
"iQU" = (
/obj/structure/closet{
name = "janitorial supplies"
@@ -24381,11 +24483,6 @@
/obj/machinery/light/small/directional/east,
/turf/open/floor/noslip/tram_plate,
/area/station/maintenance/port/aft)
-"iRv" = (
-/obj/structure/cable,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"iRz" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -24428,15 +24525,6 @@
"iSr" = (
/turf/open/floor/iron,
/area/station/security/execution/transfer)
-"iSB" = (
-/obj/structure/cable,
-/obj/machinery/door/airlock{
- name = "Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"iSK" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -24445,13 +24533,6 @@
/obj/structure/sign/warning/pods/directional/west,
/turf/open/floor/iron/checker,
/area/station/security/breakroom)
-"iSO" = (
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"iSW" = (
/obj/structure/rack,
/obj/item/clothing/gloves/boxing/yellow,
@@ -24963,6 +25044,23 @@
"jaQ" = (
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/security/processing)
+"jaX" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/closet/secure_closet/personal,
+/obj/item/storage/backpack,
+/obj/item/storage/backpack/satchel,
+/obj/item/clothing/suit/hooded/wintercoat,
+/obj/item/clothing/shoes/winterboots,
+/obj/effect/landmark/start/hangover/closet,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/sign/poster/official/random/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/north,
+/obj/machinery/camera/directional/west,
+/turf/open/floor/iron,
+/area/station/commons)
"jbb" = (
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
@@ -24990,9 +25088,6 @@
},
/turf/open/floor/plating,
/area/station/command/heads_quarters/rd)
-"jbm" = (
-/turf/closed/mineral/random/stationside,
-/area/station/maintenance/fore/greater)
"jbr" = (
/obj/structure/table/glass,
/obj/item/folder/blue{
@@ -25109,16 +25204,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating/rust,
/area/station/maintenance/fore/greater)
-"jey" = (
-/obj/structure/cable,
-/obj/machinery/portable_atmospherics/pump,
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
-"jez" = (
-/obj/structure/cable,
-/obj/machinery/portable_atmospherics/canister/air,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"jeC" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -25146,12 +25231,6 @@
/obj/structure/sign/departments/medbay/alt/directional/west,
/turf/open/floor/plating,
/area/station/medical/medbay/lobby)
-"jeX" = (
-/obj/structure/cable,
-/obj/machinery/portable_atmospherics/canister/air,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
"jfs" = (
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 4
@@ -25794,10 +25873,6 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/iron/smooth_large,
/area/station/science/auxlab/firing_range)
-"jsn" = (
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"jsv" = (
/obj/structure/cable,
/obj/machinery/holopad,
@@ -26171,12 +26246,6 @@
},
/turf/open/floor/iron/kitchen/small,
/area/station/hallway/secondary/service)
-"jzl" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"jzo" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -26223,11 +26292,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/construction)
-"jAs" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/sand/plating,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"jAw" = (
/obj/structure/cable,
/obj/machinery/light/small/directional/east,
@@ -27482,6 +27546,14 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/textured_large,
/area/station/cargo/office)
+"jXc" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/duct,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"jXe" = (
/obj/machinery/holopad/secure,
/turf/open/floor/iron/smooth,
@@ -27531,15 +27603,6 @@
/obj/effect/turf_decal/siding/wideplating/dark/corner,
/turf/open/floor/iron,
/area/station/security)
-"jXE" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/light/cold/directional/north,
-/obj/structure/sign/poster/official/random/directional/north,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"jXQ" = (
/obj/structure/flora/bush/large/style_random{
pixel_x = -18;
@@ -29219,11 +29282,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/station/maintenance/solars/port/aft)
-"kDq" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/station/commons)
"kDV" = (
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
@@ -29369,11 +29427,6 @@
dir = 1
},
/area/station/maintenance/department/engine/atmos)
-"kGz" = (
-/obj/effect/mapping_helpers/broken_floor,
-/obj/structure/reagent_dispensers/plumbed,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"kGB" = (
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/construction)
@@ -29665,11 +29718,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/showroomfloor,
/area/station/commons/toilet/restrooms)
-"kKN" = (
-/obj/structure/barricade/wooden,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"kKT" = (
/obj/machinery/computer/camera_advanced/xenobio{
dir = 4
@@ -30352,12 +30400,6 @@
/obj/structure/window/spawner/directional/south,
/turf/open/floor/grass,
/area/station/cargo/storage)
-"kZf" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/trash,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"kZh" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/siding/thinplating_new/light{
@@ -30366,14 +30408,6 @@
/obj/item/modular_computer/laptop,
/turf/open/floor/iron/grimy,
/area/station/science/cubicle)
-"kZo" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/duct,
-/obj/effect/spawner/random/trash,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"kZx" = (
/obj/machinery/button/door/directional/north{
id = "main_surgery";
@@ -30552,6 +30586,11 @@
/obj/machinery/camera/directional/east,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"lcI" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"lcN" = (
/obj/structure/flora/bush/flowers_yw/style_random,
/obj/structure/flora/bush/flowers_br/style_random,
@@ -31050,6 +31089,10 @@
/obj/machinery/incident_display/tram/directional/north,
/turf/open/floor/iron,
/area/station/maintenance/department/medical/central)
+"liM" = (
+/obj/machinery/rnd/bepis,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"liP" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/dark/small,
@@ -31070,6 +31113,13 @@
},
/turf/open/floor/noslip/tram_platform,
/area/station/maintenance/department/medical/central)
+"ljf" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"ljk" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -31332,6 +31382,13 @@
},
/turf/open/floor/iron/dark,
/area/station/cargo/office)
+"lnt" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"lnu" = (
/obj/machinery/holopad,
/turf/open/floor/iron/dark,
@@ -31353,10 +31410,6 @@
/obj/structure/ore_box,
/turf/open/floor/plating,
/area/station/maintenance/starboard/greater)
-"lnT" = (
-/obj/machinery/rnd/bepis,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"lnZ" = (
/obj/effect/turf_decal/tile/dark_red,
/obj/effect/decal/cleanable/dirt,
@@ -31468,9 +31521,6 @@
"lql" = (
/turf/open/floor/wood/parquet,
/area/station/service/library)
-"lqs" = (
-/turf/closed/wall/rust,
-/area/station/maintenance/fore/greater)
"lqt" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -31885,6 +31935,11 @@
},
/turf/open/floor/iron/white/small,
/area/station/medical/psychology)
+"lyi" = (
+/turf/open/floor/engine{
+ name = "Holodeck Projector Floor"
+ },
+/area/station/holodeck/rec_center)
"lyj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -32173,6 +32228,11 @@
/obj/structure/falsewall,
/turf/open/floor/plating,
/area/station/maintenance/aft)
+"lCP" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/digital_clock/directional/north,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"lCS" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -32920,12 +32980,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/security/prison/rec)
-"lPG" = (
-/obj/machinery/vending/clothing,
-/obj/machinery/camera/directional/north,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron,
-/area/station/commons)
"lPI" = (
/obj/effect/turf_decal/siding/wood{
dir = 8
@@ -33219,6 +33273,13 @@
/obj/structure/window/spawner/directional/west,
/turf/open/floor/plating,
/area/station/cargo/sorting)
+"lVw" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating/rust,
+/area/station/maintenance/fore/greater)
"lVy" = (
/obj/effect/turf_decal/tile/green/anticorner/contrasted{
dir = 8
@@ -34006,6 +34067,12 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/small,
/area/station/commons/fitness/locker_room)
+"miY" = (
+/obj/effect/spawner/random/structure/closet_maintenance,
+/obj/effect/spawner/random/maintenance,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"mjf" = (
/obj/structure/table/reinforced/rglass,
/obj/machinery/door/window/left/directional/west{
@@ -34543,6 +34610,12 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/medical/central)
+"muD" = (
+/obj/effect/landmark/start/hangover,
+/turf/open/floor/engine{
+ name = "Holodeck Projector Floor"
+ },
+/area/station/holodeck/rec_center)
"muI" = (
/obj/machinery/door/airlock{
name = "Maintenance"
@@ -35037,6 +35110,14 @@
/obj/structure/sign/departments/cargo/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"mDt" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"mDC" = (
/obj/structure/closet/crate{
name = "Game Supplies"
@@ -35149,6 +35230,11 @@
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/floor/eighties,
/area/station/service/abandoned_gambling_den/gaming)
+"mFo" = (
+/obj/structure/girder,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"mFq" = (
/obj/effect/turf_decal/tile/dark_red/fourcorners,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -35543,11 +35629,6 @@
},
/turf/open/floor/iron,
/area/station/security/processing)
-"mLx" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/maintenance/two,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"mLA" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/west,
@@ -36019,6 +36100,9 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"mVg" = (
+/turf/closed/wall/mineral/titanium,
+/area/station/commons/fitness/recreation/entertainment)
"mVm" = (
/obj/effect/turf_decal/tile/green/anticorner/contrasted{
dir = 1
@@ -36046,6 +36130,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark/small,
/area/station/ai_monitored/security/armory)
+"mVy" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/chair/stool,
+/obj/structure/sign/poster/contraband/random/directional/north,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"mVC" = (
/obj/machinery/door/airlock/external{
name = "Departure Lounge Airlock"
@@ -36254,6 +36344,16 @@
/obj/structure/alien/weeds,
/turf/open/floor/wood,
/area/station/maintenance/starboard/greater)
+"mZQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/item/radio/intercom/directional/north,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"mZX" = (
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
@@ -36375,6 +36475,16 @@
/obj/structure/alien/weeds,
/turf/open/floor/wood,
/area/station/maintenance/starboard/greater)
+"ncf" = (
+/obj/machinery/recycler{
+ dir = 8
+ },
+/obj/machinery/conveyor{
+ dir = 4;
+ id = "garbage"
+ },
+/turf/open/floor/plating,
+/area/station/service/janitor)
"ncl" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -36449,10 +36559,6 @@
},
/turf/open/floor/wood/tile,
/area/station/commons/vacant_room/commissary)
-"net" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/commons)
"neZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -36675,6 +36781,9 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"niB" = (
+/turf/closed/wall/r_wall,
+/area/station/commons/fitness/recreation/entertainment)
"niI" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/siding/white{
@@ -37421,6 +37530,14 @@
dir = 1
},
/area/station/hallway/secondary/dock)
+"nwo" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"nwN" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -38305,6 +38422,11 @@
/obj/effect/spawner/random/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
+"nLL" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"nLN" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -38694,6 +38816,12 @@
},
/turf/open/floor/iron/small,
/area/station/medical/morgue)
+"nTR" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"nUi" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -39115,6 +39243,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"odY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/trash/graffiti,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"oem" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 8
@@ -39793,6 +39926,13 @@
/obj/machinery/duct,
/turf/open/floor/iron/showroomfloor,
/area/station/commons/toilet/restrooms)
+"oqp" = (
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/spawner/random/structure/closet_maintenance,
+/obj/effect/spawner/random/maintenance,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"oqE" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -40470,10 +40610,6 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/iron,
/area/station/commons/dorms)
-"oEm" = (
-/obj/structure/barricade/wooden,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"oEr" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -40692,6 +40828,14 @@
/obj/item/circuitboard/machine/biogenerator,
/turf/open/floor/iron,
/area/station/maintenance/starboard/aft)
+"oJd" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/duct,
+/obj/machinery/power/apc/auto_name/directional/west,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"oJi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -40905,6 +41049,11 @@
/obj/effect/spawner/structure/window/reinforced/plasma,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
+"oNs" = (
+/obj/structure/girder,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"oNv" = (
/obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{
dir = 1
@@ -42136,6 +42285,10 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
+"pjC" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"pjL" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -42788,11 +42941,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/iron/diagonal,
/area/station/command/heads_quarters/hop)
-"puC" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"puD" = (
/obj/structure/bookcase/random/nonfiction,
/obj/machinery/newscaster/directional/west,
@@ -43847,11 +43995,6 @@
},
/turf/open/floor/iron/small,
/area/station/ai_monitored/command/storage/eva)
-"pLk" = (
-/mob/living/basic/mining/basilisk,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"pLl" = (
/obj/effect/spawner/random/vending/snackvend,
/obj/effect/turf_decal/tile/red/opposingcorners{
@@ -44899,6 +45042,12 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/side,
/area/station/hallway/secondary/construction)
+"qci" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/girder,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"qcl" = (
/obj/item/radio/intercom/directional/south,
/turf/open/floor/wood,
@@ -45967,6 +46116,15 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/iron,
/area/station/hallway/secondary/construction)
+"qsm" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/light/cold/directional/north,
+/obj/structure/sign/poster/official/random/directional/north,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"qsu" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -46971,6 +47129,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/processing)
+"qIu" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/structure/broken_flooring/singular/directional/west,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"qIv" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -47370,6 +47535,10 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"qQE" = (
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"qQK" = (
/turf/open/floor/iron/white/corner{
dir = 1
@@ -49986,14 +50155,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/virology)
-"rGL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/picket_sign{
- desc = "Can't you read? it clearly says what it says!";
- name = "DO NOT ENTER"
- },
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"rGN" = (
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
@@ -50109,10 +50270,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/engine,
/area/station/engineering/gravity_generator)
-"rIO" = (
-/obj/effect/spawner/random/trash,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"rIS" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/cafeteria,
@@ -50395,6 +50552,10 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/catwalk_floor/iron_smooth,
/area/station/command/gateway)
+"rNF" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid,
+/area/space/nearstation)
"rNJ" = (
/obj/effect/spawner/random/entertainment/arcade,
/turf/open/floor/iron/cafeteria,
@@ -50607,6 +50768,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/maintenance/starboard/greater)
+"rRx" = (
+/obj/machinery/camera/directional/west,
+/obj/machinery/status_display/ai/directional/west,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"rRy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -51766,10 +51933,10 @@
/obj/machinery/camera/autoname/directional/west,
/turf/open/floor/iron,
/area/station/medical/chemistry)
-"skH" = (
-/obj/structure/rack,
-/obj/item/flashlight/lantern,
-/turf/open/misc/asteroid,
+"skt" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating/rust,
/area/station/maintenance/fore/greater)
"skP" = (
/obj/effect/spawner/structure/window,
@@ -54129,6 +54296,13 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage,
/turf/open/floor/catwalk_floor/iron,
/area/station/engineering/storage/tech)
+"sYv" = (
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/structure/window/spawner/directional/south,
+/turf/open/floor/plating,
+/area/station/commons/fitness/recreation/entertainment)
"sYx" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
/obj/effect/turf_decal/stripes,
@@ -54326,10 +54500,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"tbM" = (
-/obj/effect/spawner/random/structure/closet_maintenance,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"tbS" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -55371,13 +55541,6 @@
},
/turf/open/space/basic,
/area/space/nearstation)
-"twh" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/item/stack/sheet/mineral/sandstone,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"twi" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -55457,10 +55620,6 @@
},
/turf/open/floor/iron/small,
/area/station/hallway/primary/central/fore)
-"twN" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"twR" = (
/obj/structure/table/glass,
/obj/machinery/cell_charger,
@@ -55851,13 +56010,6 @@
/obj/machinery/shower/directional/west,
/turf/open/floor/iron/dark,
/area/station/medical/pharmacy)
-"tDm" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/access/all/supply/general,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"tDn" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/prison)
@@ -56037,6 +56189,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"tGa" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"tGp" = (
/obj/machinery/light/small/directional/south,
/turf/open/floor/engine,
@@ -56253,6 +56410,10 @@
/obj/effect/turf_decal/tile/green/diagonal_centre,
/turf/open/floor/iron/diagonal,
/area/station/hallway/primary/central/aft)
+"tKF" = (
+/mob/living/basic/mining/basilisk,
+/turf/open/misc/asteroid,
+/area/space/nearstation)
"tKG" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/mapping_helpers/broken_floor,
@@ -57976,11 +58137,6 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron,
/area/station/hallway/primary/central/fore)
-"unK" = (
-/obj/structure/rack,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"unM" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/door/airlock/public/glass{
@@ -58743,6 +58899,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/stairs,
/area/station/engineering/storage/tech)
+"uBJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/item/trash/cheesie{
+ pixel_x = 7;
+ pixel_y = 3
+ },
+/obj/structure/table,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"uBQ" = (
/obj/structure/table/bronze,
/obj/machinery/microwave{
@@ -59221,6 +59386,11 @@
/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
+"uJn" = (
+/obj/machinery/light/cold/directional/south,
+/obj/structure/reagent_dispensers/water_cooler,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"uJD" = (
/obj/structure/chair/sofa/bench/right{
dir = 1
@@ -59459,6 +59629,10 @@
},
/turf/open/floor/iron/white/corner,
/area/station/hallway/primary/aft)
+"uNZ" = (
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"uOh" = (
/obj/structure/chair{
dir = 1;
@@ -60641,13 +60815,6 @@
/obj/structure/closet/emcloset,
/turf/open/floor/iron/small,
/area/station/maintenance/starboard/central)
-"viR" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/sink/directional/south,
-/obj/item/reagent_containers/cup/bucket,
-/obj/item/mop,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"viT" = (
/obj/machinery/light/cold/directional/east,
/turf/open/floor/iron,
@@ -61150,6 +61317,11 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"voV" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/maintenance/two,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"vpb" = (
/obj/machinery/door/airlock/hatch{
name = "Tool Supply Corridor"
@@ -61239,6 +61411,11 @@
"vqp" = (
/turf/open/floor/carpet/lone,
/area/station/service/theater)
+"vqt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/structure/crate,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"vqH" = (
/obj/structure/railing{
dir = 8
@@ -61260,18 +61437,6 @@
},
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/tcommsat/server)
-"vra" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/item/clothing/under/rank/cargo/miner/lavaland{
- pixel_y = 3
- },
-/obj/item/clothing/suit/hooded/wintercoat/miner{
- pixel_y = 5
- },
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"vrf" = (
/obj/structure/hedge,
/obj/machinery/light/small/directional/north,
@@ -61902,6 +62067,10 @@
"vAD" = (
/turf/open/floor/wood/tile,
/area/station/maintenance/port/lesser)
+"vAE" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/station/maintenance/port/fore)
"vAK" = (
/obj/machinery/door/airlock{
name = "Maintenance"
@@ -62638,11 +62807,6 @@
/obj/machinery/portable_atmospherics/canister/air,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
-"vMS" = (
-/obj/item/pickaxe,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"vMT" = (
/obj/machinery/hydroponics/soil,
/obj/item/food/grown/mushroom/libertycap,
@@ -62721,6 +62885,14 @@
/obj/effect/turf_decal/stripes/red/line,
/turf/open/floor/iron/small,
/area/station/hallway/secondary/spacebridge)
+"vOj" = (
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/decal/cleanable/glass/plastitanium,
+/turf/open/floor/plating,
+/area/station/maintenance/fore/greater)
"vOr" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -62782,6 +62954,17 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"vPM" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Holodeck Door"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "holodeck"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"vPP" = (
/turf/closed/wall,
/area/station/command/corporate_suite)
@@ -63033,10 +63216,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white/small,
/area/station/service/hydroponics)
-"vTO" = (
-/mob/living/simple_animal/hostile/asteroid/gutlunch,
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"vTV" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/hos)
@@ -63250,6 +63429,10 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron/white/corner,
/area/station/science/lobby)
+"vWk" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"vWr" = (
/obj/machinery/door/airlock/security/glass{
id_tag = "permaouter";
@@ -63293,6 +63476,13 @@
"vWM" = (
/turf/open/floor/iron/smooth,
/area/station/maintenance/solars/starboard/fore)
+"vWN" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/chair/sofa/bench/left{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"vWQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/mapping_helpers/broken_floor,
@@ -63917,10 +64107,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/hallway/secondary/exit/departure_lounge)
-"whS" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"whX" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/door/airlock{
@@ -64046,6 +64232,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white/small,
/area/station/service/janitor)
+"wjU" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/glass{
+ name = "Holodeck Access"
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"wjY" = (
/obj/structure/window/spawner/directional/east,
/obj/structure/table/wood,
@@ -65258,6 +65453,12 @@
/obj/machinery/light_switch/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
+"wDs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/commons)
"wDu" = (
/obj/effect/turf_decal/stripes/white/line,
/turf/open/floor/noslip/tram_platform,
@@ -66292,11 +66493,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron/textured_half,
/area/station/security/prison/work)
-"wTn" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/plating,
-/area/station/maintenance/port/fore)
"wTs" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sign/poster/official/random/directional/north,
@@ -67328,6 +67524,12 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"xgT" = (
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"xhe" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -68640,6 +68842,14 @@
},
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/lobby)
+"xyv" = (
+/obj/machinery/door/airlock{
+ name = "Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
+/obj/structure/cable,
+/turf/open/floor/plating/rust,
+/area/station/maintenance/fore/greater)
"xyx" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
@@ -69163,11 +69373,6 @@
/obj/item/reagent_containers/cup/glass/drinkingglass,
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
-"xGS" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/structure/reagent_dispensers/watertank,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"xGT" = (
/obj/effect/turf_decal/tile/dark_red/opposingcorners,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -69715,6 +69920,9 @@
/obj/effect/landmark/start/research_director,
/turf/open/floor/iron/dark/small,
/area/station/command/heads_quarters/rd)
+"xOy" = (
+/turf/open/misc/asteroid,
+/area/space/nearstation)
"xOB" = (
/obj/effect/turf_decal/siding/wood{
dir = 4
@@ -70588,6 +70796,15 @@
"xYK" = (
/turf/open/floor/iron/grimy,
/area/station/science/cubicle)
+"xYN" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/computer/holodeck{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/commons/fitness/recreation/entertainment)
"xYO" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/bridge)
@@ -70849,24 +71066,6 @@
/obj/effect/turf_decal/stripes/white/line,
/turf/open/floor/noslip/tram_plate,
/area/station/maintenance/department/medical/central)
-"ycz" = (
-/obj/effect/turf_decal/sand/plating,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/item/stack/sheet/mineral/coal{
- pixel_x = 6;
- pixel_y = 13
- },
-/obj/item/stack/sheet/mineral/coal{
- pixel_x = 1;
- pixel_y = 8
- },
-/obj/item/stack/sheet/mineral/coal{
- pixel_x = -2;
- pixel_y = -1
- },
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"ycC" = (
/turf/closed/wall/r_wall,
/area/station/command/bridge)
@@ -70909,9 +71108,6 @@
/obj/item/radio/intercom/directional/north,
/turf/open/floor/wood/tile,
/area/station/command/bridge)
-"ydt" = (
-/turf/open/misc/asteroid,
-/area/station/maintenance/fore/greater)
"ydu" = (
/obj/structure/cable,
/obj/structure/disposalpipe/sorting/mail{
@@ -71137,9 +71333,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
-"yfX" = (
-/turf/open/floor/plating/rust,
-/area/station/maintenance/fore/greater)
"yfY" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -71437,11 +71630,6 @@
/obj/machinery/newscaster/directional/west,
/turf/open/floor/iron/white/small,
/area/station/science/cubicle)
-"yju" = (
-/obj/effect/spawner/random/structure/closet_maintenance,
-/obj/effect/spawner/random/maintenance,
-/turf/open/floor/plating,
-/area/station/maintenance/fore/greater)
"yjD" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -83003,7 +83191,7 @@ uzJ
mQh
nJU
ppk
-lnT
+liM
ovQ
oRr
poM
@@ -83504,14 +83692,14 @@ gOK
slY
hfc
slY
-viR
+iGi
jBb
kPW
kwY
-whS
-dmz
+vAE
+ixa
slY
-hzN
+mZQ
lRc
moz
kee
@@ -83761,14 +83949,14 @@ gPN
gZk
iNE
ueX
-mLx
+voV
kwY
slY
slY
kwY
slY
slY
-jXE
+qsm
lTv
oem
oem
@@ -84021,10 +84209,10 @@ jCo
hff
jCo
slY
-wTn
-whS
+vqt
+vAE
kPW
-tDm
+ljf
jkS
lTN
mRD
@@ -84282,7 +84470,7 @@ slY
slY
slY
slY
-ciL
+nwo
lUz
ohj
ohj
@@ -84532,7 +84720,7 @@ sNz
hyO
roi
slY
-hFm
+aqM
hAN
jMb
kzI
@@ -104588,7 +104776,7 @@ xmO
sHe
nFW
mEy
-hsK
+ncf
nFA
kBH
onR
@@ -105091,14 +105279,14 @@ nyi
rvp
rvp
uIT
-xqC
+uIT
wSZ
tdI
hHE
nNi
hPs
xmO
-sJR
+ejy
sIA
jPq
kaF
@@ -105344,18 +105532,18 @@ dDB
dDB
aJq
aJq
-jbm
-jbm
-jbm
-jbm
-jbm
+dDV
+dDV
+dDV
+dDV
+dDV
+niB
+niB
+niB
+niB
xmO
xmO
-xmO
-xmO
-xmO
-xmO
-jsn
+oTL
sIS
nFW
sRL
@@ -105601,19 +105789,19 @@ dDB
dDB
aJq
aJq
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-tbM
-iFi
-iQF
+dDV
+euV
+hGT
+hCa
+dmo
+rRx
+xgT
+gex
+dDV
+gWG
jej
-jAs
+jej
+oqp
nFW
pmn
wZl
@@ -105858,18 +106046,18 @@ dDB
aJq
aJq
aJq
-jbm
-vTO
-jbm
-jbm
-twN
-jbm
-jbm
-lqs
-xGS
-yfX
-twN
-tDB
+dDV
+mVy
+nLL
+dhg
+vWk
+bBA
+fxk
+uJn
+dDV
+nFW
+xyv
+nFW
nFW
nFW
tBL
@@ -106111,24 +106299,24 @@ dDB
dDB
dDB
dDB
-dDB
aJq
aJq
aJq
-jbm
-oEm
-jbm
-jbm
-oEm
-jbm
-twN
-nFW
-rGL
-puC
-kZf
-jey
-nFW
-hek
+aJq
+dDV
+lCP
+vWN
+gLo
+vWk
+fMP
+mDt
+vWk
+fmE
+fNs
+fxk
+fvW
+dDV
+jaX
wXt
ndZ
vRx
@@ -106360,36 +106548,36 @@ aJq
aJq
aJq
aJq
+hwJ
+blb
+blb
+blb
+blb
+blb
+blb
+blb
+blb
+hwJ
aJq
aJq
-dDB
-dDB
-dDB
-dDB
-dDB
-dDB
-dDB
-aJq
-aJq
-aJq
-jbm
-twN
-ydt
-twN
-twN
-twN
-twN
-cgD
-twN
-jsn
-oTL
-jez
-nFW
-lPG
-wXt
-net
-kDq
-kDq
+dDV
+dZU
+uBJ
+ekP
+fyf
+tGa
+xYN
+dMV
+eDT
+dMV
+dMV
+ekX
+wjU
+wYC
+wDs
+wYC
+hue
+hue
ldB
bnh
lPd
@@ -106617,31 +106805,31 @@ aJq
aJq
aJq
aJq
-hwJ
-blb
-blb
-blb
-blb
-blb
-blb
-blb
-blb
-hwJ
aJq
-jbm
-jbm
-ydt
-jbm
-jbm
-ydt
-jbm
-skH
-lqs
-imd
-rIO
-pLK
-jeX
-nFW
+dDB
+dDB
+dDB
+dDB
+dDB
+dDB
+dDB
+dDB
+mVg
+aPK
+oNs
+aPK
+fiR
+fmE
+fmE
+vPM
+fmE
+fmE
+fmE
+fmE
+odY
+uNZ
+qIu
+dDV
qhq
tDq
rnn
@@ -106882,21 +107070,21 @@ dDB
dDB
dDB
dDB
-aJq
-aJq
-aJq
-jbm
-twN
-ydt
-jbm
-jbm
-kKN
-jbm
-jbm
-jbm
-jbm
-sJR
-jzl
+mVg
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+mVg
+nFW
+xyv
nFW
nFW
nFW
@@ -107138,27 +107326,27 @@ dDB
dDB
dDB
dDB
-dDB
-aJq
-aJq
-aJq
-jbm
-oEm
-jbm
-jbm
-jbm
-ydt
-jbm
-jbm
-jbm
-jbm
-iHs
-iQK
+nTR
+sYv
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+mVg
+skt
+lVw
tDB
odK
tDB
tDB
-unK
+pjC
nFW
cCP
oow
@@ -107395,22 +107583,22 @@ dDB
dDB
dDB
dDB
-dDB
-aJq
-aJq
-jbm
-jbm
-twN
-jbm
-jbm
-jbm
-twN
-twh
-ycz
-jbm
-jbm
-jbm
-iRv
+nTR
+sYv
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+oNs
+skt
+pLK
bjX
nFW
nFW
@@ -107652,22 +107840,22 @@ dDB
dDB
dDB
dDB
-dDB
-aJq
-aJq
-jbm
-twN
-twN
-jbm
-jbm
-jbm
-puC
-ydt
-vra
-jbm
-nFW
-nFW
-iSB
+nTR
+sYv
+mVg
+lyi
+lyi
+muD
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+oNs
+lcI
+lnt
nFW
nFW
mjk
@@ -107909,22 +108097,22 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-aJq
-jbm
-pLk
-twN
-jbm
-jbm
-jbm
-ydt
-puC
-hJr
-jbm
-nFW
-ivO
-pLK
+mVg
+mVg
+mVg
+hWF
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+hCV
+oNs
+qci
+lnt
nFW
sJR
sJR
@@ -108166,22 +108354,22 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-aJq
-aJq
-jbm
-jbm
-jbm
-jbm
-jbm
-vMS
-puC
-jbm
-jbm
-nFW
-yju
-iRv
+nTR
+sYv
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+mVg
+miY
+vOj
jfP
nfc
jQF
@@ -108423,22 +108611,22 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-dDB
-aJq
-aJq
-aJq
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-nFW
-kGz
-kZo
+nTR
+sYv
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+muD
+lyi
+lyi
+mVg
+qQE
+buP
nFW
lLv
sJR
@@ -108680,22 +108868,22 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-dDB
-aJq
-aJq
-aJq
-aJq
-aJq
-jbm
-jbm
-jbm
-jbm
-jbm
-jbm
-sJR
-njm
+nTR
+sYv
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+oNs
+mFo
+jXc
nFW
nFW
nFW
@@ -108938,22 +109126,22 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-dDB
-aJq
-aJq
-aJq
-aJq
-aJq
-jbm
-jbm
-jbm
-jbm
-nFW
-nFW
-iSO
-bHA
+mVg
+mVg
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+lyi
+mVg
+qQE
+bzi
+oJd
dxz
sJR
xwy
@@ -109196,18 +109384,18 @@ dDB
dDB
dDB
dDB
-dDB
-dDB
-dDB
-aJq
-aJq
-aJq
-aJq
-aJq
-jbm
-jbm
-jbm
-jbm
+mVg
+aPK
+aPK
+aPK
+fyk
+aPK
+oNs
+oNs
+aPK
+aPK
+aPK
+mVg
nFW
iSW
njm
@@ -109462,9 +109650,9 @@ hwJ
aJq
aJq
vcE
-vcE
-vcE
-vcE
+jIb
+pyt
+nvS
nFW
iUy
vtL
@@ -110488,8 +110676,8 @@ aJq
aJq
aJq
aJq
-aJq
-weg
+xOy
+jJy
nvS
kbY
imE
@@ -110744,8 +110932,8 @@ aJq
aJq
aJq
aJq
-aJq
-aJq
+xOy
+xOy
weg
jKf
nvS
@@ -110999,9 +111187,9 @@ dDB
dDB
aJq
aJq
-aJq
-aJq
-aJq
+xOy
+xOy
+xOy
aJq
weg
weg
@@ -111256,8 +111444,8 @@ dDB
dDB
aJq
aJq
-aJq
-aJq
+xOy
+rNF
aJq
aJq
weg
@@ -111513,7 +111701,7 @@ dDB
dDB
aJq
aJq
-aJq
+tKF
aJq
aJq
aJq
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 4ef52187a09..6fffe99a126 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -451,19 +451,6 @@
"abM" = (
/turf/open/misc/asteroid,
/area/station/asteroid)
-"abN" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=1";
- location = "QM #6"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #6";
- suffix = "#6"
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"abO" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -3861,12 +3848,6 @@
/obj/effect/turf_decal/trimline/neutral/warning,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"axF" = (
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"axG" = (
/obj/effect/turf_decal/bot,
/obj/effect/spawner/random/structure/crate_empty,
@@ -6735,6 +6716,11 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"biE" = (
+/obj/effect/landmark/event_spawn,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"biS" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 6
@@ -10091,15 +10077,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/cafeteria,
/area/station/command/heads_quarters/rd)
-"csn" = (
-/obj/machinery/elevator_control_panel{
- layer = 3.1;
- linked_elevator_id = "tram_xeno_lift";
- pixel_y = 2;
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/turf/closed/wall,
-/area/station/science/xenobiology)
"csA" = (
/turf/closed/wall,
/area/station/solars/starboard/fore)
@@ -11140,6 +11117,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
+"cLS" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/elevator_control_panel/directional/north{
+ linked_elevator_id = "tram_upper_center_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/obj/effect/turf_decal/trimline/dark_red/warning{
+ dir = 1
+ },
+/obj/structure/industrial_lift/public,
+/turf/open/floor/plating/elevatorshaft,
+/area/station/maintenance/tram/mid)
"cMa" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/machinery/camera/directional/south{
@@ -11771,6 +11762,13 @@
/obj/machinery/digital_clock/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
+"cVx" = (
+/obj/effect/turf_decal/siding/thinplating{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"cVz" = (
/obj/effect/landmark/start/hangover,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
@@ -13895,6 +13893,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/station/service/library)
+"dKz" = (
+/obj/machinery/door/poddoor/massdriver_chapel,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/station/service/chapel/monastery)
"dKI" = (
/obj/effect/turf_decal/trimline/purple/filled/corner,
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
@@ -14143,6 +14146,15 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
+"dPi" = (
+/obj/machinery/elevator_control_panel{
+ layer = 3.1;
+ linked_elevator_id = "tram_xeno_lift";
+ pixel_y = 2;
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/turf/closed/wall/r_wall,
+/area/station/science/xenobiology)
"dPo" = (
/obj/machinery/camera/directional/north{
c_tag = "Medical - Morgue";
@@ -15682,19 +15694,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/station/service/theater)
-"euR" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=2";
- location = "QM #3"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #3";
- suffix = "#3"
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"euS" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -18003,10 +18002,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white,
/area/station/science/ordnance)
-"foU" = (
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"foY" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -19676,14 +19671,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/processing)
-"fWK" = (
-/obj/machinery/computer/atmos_control/oxygen_tank{
- atmos_chambers = list("o2ordance"="Oxygen Supply")
- },
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/science/ordnance/storage)
"fWM" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/item/kirbyplants/random,
@@ -20242,20 +20229,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/tram/right)
-"giW" = (
-/obj/effect/turf_decal/trimline/dark_red/warning{
- dir = 9
- },
-/obj/structure/industrial_lift/public,
-/obj/structure/railing{
- dir = 9
- },
-/obj/machinery/elevator_control_panel/directional/west{
- linked_elevator_id = "tram_sci_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/turf/open/floor/plating/elevatorshaft,
-/area/station/science/lower)
"giZ" = (
/obj/structure/bed,
/obj/effect/spawner/random/contraband/prison,
@@ -20747,6 +20720,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"gqb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/neutral/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/station/cargo/warehouse)
"gqc" = (
/obj/machinery/conveyor{
dir = 4;
@@ -22345,11 +22325,6 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
-"gUL" = (
-/obj/effect/landmark/event_spawn,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"gUO" = (
/obj/effect/turf_decal/trimline/neutral/filled/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -23934,13 +23909,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
-"hDU" = (
-/obj/effect/turf_decal/siding/thinplating/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"hDZ" = (
/obj/effect/turf_decal/sand/plating,
/obj/effect/turf_decal/box,
@@ -26669,6 +26637,19 @@
/obj/machinery/light/floor,
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
+"iHo" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=1";
+ location = "QM #6"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #6";
+ suffix = "#6"
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"iHr" = (
/obj/structure/sink{
dir = 4;
@@ -27294,6 +27275,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"iTa" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"iTm" = (
/obj/structure/table/glass,
/obj/item/storage/pill_bottle/mannitol,
@@ -28584,14 +28569,6 @@
},
/turf/open/floor/iron,
/area/station/security/checkpoint/supply)
-"jnL" = (
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/brown/filled/line,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"jnR" = (
/obj/structure/bed{
dir = 8
@@ -29081,27 +29058,6 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/showroomfloor,
/area/station/security/lockers)
-"jwP" = (
-/obj/effect/landmark/lift_id{
- specific_lift_id = "tram_cargo_lift"
- },
-/obj/structure/railing{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/dark_red/warning{
- dir = 8
- },
-/obj/structure/industrial_lift/public,
-/obj/machinery/elevator_control_panel/directional/west{
- linked_elevator_id = "tram_cargo_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck");
- req_access = list("mining")
- },
-/obj/effect/abstract/elevator_music_zone{
- linked_elevator_id = "tram_cargo_lift"
- },
-/turf/open/floor/plating/elevatorshaft,
-/area/station/cargo/miningdock)
"jwT" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -29811,6 +29767,16 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/sorting)
+"jJt" = (
+/obj/effect/turf_decal/trimline/dark_red/warning,
+/obj/structure/industrial_lift/public,
+/obj/machinery/elevator_control_panel/directional/south{
+ linked_elevator_id = "tram_dorm_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/obj/structure/railing,
+/turf/open/floor/plating/elevatorshaft,
+/area/station/maintenance/tram/left)
"jJv" = (
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai)
@@ -30342,13 +30308,6 @@
},
/turf/open/floor/iron,
/area/station/construction/mining/aux_base)
-"jTQ" = (
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/brown/filled/line,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"jUa" = (
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 4
@@ -30901,6 +30860,15 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/command/heads_quarters/hop)
+"kcd" = (
+/obj/effect/turf_decal/trimline/neutral/filled/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table,
+/obj/machinery/light/dim/directional/north,
+/turf/open/floor/iron,
+/area/station/cargo/warehouse)
"kck" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 1
@@ -34428,10 +34396,6 @@
},
/turf/open/floor/plating,
/area/station/cargo/sorting)
-"lnh" = (
-/obj/machinery/door/poddoor/massdriver_chapel,
-/turf/open/floor/plating,
-/area/station/service/chapel/monastery)
"lnk" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -34943,20 +34907,6 @@
/obj/effect/turf_decal/tile/red/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/office)
-"lvz" = (
-/obj/effect/turf_decal/caution/stand_clear/red{
- dir = 1
- },
-/obj/structure/industrial_lift/public,
-/obj/structure/railing{
- dir = 8
- },
-/obj/machinery/elevator_control_panel/directional/west{
- linked_elevator_id = "tram_perma_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/turf/open/floor/plating/elevatorshaft,
-/area/station/security/execution/transfer)
"lvH" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 1
@@ -36302,24 +36252,6 @@
},
/turf/open/floor/iron,
/area/station/security/prison/safe)
-"lTM" = (
-/obj/effect/turf_decal/trimline/brown/filled/corner{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/brown/filled/corner{
- dir = 1
- },
-/obj/effect/turf_decal/siding/thinplating{
- dir = 1
- },
-/obj/effect/turf_decal/loading_area{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"lTP" = (
/obj/structure/stairs/south,
/turf/open/floor/iron/stairs/medium{
@@ -36637,6 +36569,13 @@
/obj/structure/cable,
/turf/open/floor/wood/large,
/area/station/service/library)
+"lXx" = (
+/obj/effect/turf_decal/siding/thinplating/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"lXC" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 1
@@ -36824,6 +36763,27 @@
/obj/item/clothing/glasses/meson,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
+"mbp" = (
+/obj/effect/landmark/lift_id{
+ specific_lift_id = "tram_cargo_lift"
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/dark_red/warning{
+ dir = 8
+ },
+/obj/structure/industrial_lift/public,
+/obj/machinery/elevator_control_panel/directional/west{
+ linked_elevator_id = "tram_cargo_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck");
+ req_access = list("mining")
+ },
+/obj/effect/abstract/elevator_music_zone{
+ linked_elevator_id = "tram_cargo_lift"
+ },
+/turf/open/floor/plating/elevatorshaft,
+/area/station/cargo/miningdock)
"mbt" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
@@ -37442,13 +37402,6 @@
/obj/machinery/meter,
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"mmX" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/trimline/neutral/filled/line{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"mng" = (
/obj/structure/window/reinforced/plasma/spawner/directional/west,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
@@ -37645,15 +37598,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/storage)
-"mrg" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=1";
- location = "QM #4"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"mrr" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/trimline/neutral/filled/line,
@@ -38022,6 +37966,10 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"mzv" = (
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"mzD" = (
/obj/effect/turf_decal/siding/thinplating{
dir = 1
@@ -39024,20 +38972,6 @@
/obj/item/storage/secure/safe/directional/north,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hop)
-"mUc" = (
-/obj/structure/railing{
- dir = 1
- },
-/obj/machinery/elevator_control_panel/directional/north{
- linked_elevator_id = "tram_upper_center_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/obj/effect/turf_decal/trimline/dark_red/warning{
- dir = 1
- },
-/obj/structure/industrial_lift/public,
-/turf/open/floor/plating/elevatorshaft,
-/area/station/maintenance/tram/mid)
"mUd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{
dir = 1
@@ -39609,15 +39543,6 @@
},
/turf/open/floor/iron,
/area/station/maintenance/tram/right)
-"nfZ" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=1";
- location = "QM #5"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"ngg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
/obj/effect/spawner/structure/window/reinforced,
@@ -40543,6 +40468,19 @@
},
/turf/open/space/openspace,
/area/station/solars/port)
+"nvn" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=2";
+ location = "QM #1"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #1";
+ suffix = "#1"
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"nvo" = (
/obj/machinery/button/door/directional/west{
id = "private_b";
@@ -41838,6 +41776,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"nSY" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/brown/filled/line,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"nTa" = (
/obj/effect/landmark/start/station_engineer,
/obj/structure/cable/layer1,
@@ -41916,19 +41862,6 @@
/obj/effect/turf_decal/trimline/purple/filled/line,
/turf/open/floor/iron/white,
/area/station/science/lobby)
-"nUF" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=2";
- location = "QM #1"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #1";
- suffix = "#1"
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"nUM" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
@@ -42079,13 +42012,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"nXk" = (
-/obj/effect/turf_decal/siding/thinplating{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"nXn" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -43939,15 +43865,6 @@
/obj/structure/grille,
/turf/open/space/openspace,
/area/space/nearstation)
-"oKn" = (
-/obj/machinery/elevator_control_panel{
- layer = 3.1;
- linked_elevator_id = "tram_xeno_lift";
- pixel_y = 2;
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/turf/closed/wall/r_wall,
-/area/station/science/xenobiology)
"oKZ" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -45259,19 +45176,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/station/commons/vacant_room)
-"plH" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/navbeacon{
- codes_txt = "delivery;dir=2";
- location = "QM #2"
- },
-/obj/effect/turf_decal/tile/brown/fourcorners,
-/mob/living/simple_animal/bot/mulebot{
- home_destination = "QM #2";
- suffix = "#2"
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"plQ" = (
/obj/effect/turf_decal/trimline/red/filled/corner,
/obj/structure/disposalpipe/segment{
@@ -47099,15 +47003,6 @@
/obj/structure/railing,
/turf/open/floor/plating/elevatorshaft,
/area/station/maintenance/tram/left)
-"pOL" = (
-/obj/effect/turf_decal/trimline/neutral/filled/line{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/table,
-/obj/machinery/light/dim/directional/north,
-/turf/open/floor/iron,
-/area/station/cargo/warehouse)
"pOQ" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 4
@@ -48277,6 +48172,19 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/exit/departure_lounge)
+"qmC" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=2";
+ location = "QM #2"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #2";
+ suffix = "#2"
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"qmH" = (
/obj/structure/closet/secure_closet/quartermaster,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -49225,6 +49133,19 @@
"qEH" = (
/turf/closed/wall,
/area/station/solars/port)
+"qEJ" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=2";
+ location = "QM #3"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/mob/living/simple_animal/bot/mulebot{
+ home_destination = "QM #3";
+ suffix = "#3"
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"qFf" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
@@ -50307,6 +50228,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"qZl" = (
+/obj/machinery/computer/atmos_control/oxygen_tank{
+ atmos_chambers = list("o2ordance"="Oxygen Supply")
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/airalarm/directional/north,
+/turf/open/floor/iron/dark,
+/area/station/science/ordnance/storage)
"qZq" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
@@ -50575,6 +50504,13 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/carpet,
/area/station/medical/psychology)
+"rcF" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/brown/filled/line,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"rcG" = (
/obj/machinery/camera/emp_proof/directional/east{
c_tag = "Secure - Telecomms Server Room East"
@@ -50696,6 +50632,17 @@
/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai_upload)
+"reN" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "MULE Storage"
+ },
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/brown/filled/line,
+/obj/effect/mapping_helpers/airlock/access/all/supply/general,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"reU" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera/directional/south{
@@ -51643,15 +51590,6 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating/airless,
/area/station/asteroid)
-"rwo" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"rws" = (
/obj/structure/table/glass,
/obj/item/storage/box/monkeycubes{
@@ -54004,6 +53942,24 @@
/obj/structure/sign/calendar/directional/north,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hop)
+"srh" = (
+/obj/effect/turf_decal/trimline/brown/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/brown/filled/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/thinplating{
+ dir = 1
+ },
+/obj/effect/turf_decal/loading_area{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"srx" = (
/obj/structure/railing{
dir = 4
@@ -57051,10 +57007,6 @@
/obj/structure/cable,
/turf/open/floor/iron/freezer,
/area/station/security/prison/shower)
-"tte" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"tth" = (
/obj/effect/landmark/event_spawn,
/obj/structure/cable,
@@ -59229,6 +59181,23 @@
"ufO" = (
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
+"ufX" = (
+/obj/effect/turf_decal/siding/thinplating{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/dark_red/warning{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/industrial_lift/public,
+/obj/machinery/elevator_control_panel/directional/east{
+ linked_elevator_id = "tram_lower_center_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/turf/open/floor/plating/elevatorshaft,
+/area/station/maintenance/tram/mid)
"ugf" = (
/obj/structure/bed{
dir = 8
@@ -60101,23 +60070,6 @@
/obj/effect/spawner/random/maintenance/five,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
-"uud" = (
-/obj/effect/turf_decal/siding/thinplating{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/dark_red/warning{
- dir = 4
- },
-/obj/structure/railing{
- dir = 4
- },
-/obj/structure/industrial_lift/public,
-/obj/machinery/elevator_control_panel/directional/east{
- linked_elevator_id = "tram_lower_center_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/turf/open/floor/plating/elevatorshaft,
-/area/station/maintenance/tram/mid)
"uue" = (
/obj/machinery/power/turbine/turbine_outlet{
dir = 4
@@ -61622,6 +61574,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/tram/center)
+"uQV" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=1";
+ location = "QM #4"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"uRi" = (
/obj/machinery/suit_storage_unit/standard_unit,
/obj/structure/window/reinforced/spawner/directional/south,
@@ -61641,16 +61602,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/checkpoint/arrivals)
-"uSl" = (
-/obj/effect/turf_decal/trimline/dark_red/warning,
-/obj/structure/industrial_lift/public,
-/obj/machinery/elevator_control_panel/directional/south{
- linked_elevator_id = "tram_dorm_lift";
- preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
- },
-/obj/structure/railing,
-/turf/open/floor/plating/elevatorshaft,
-/area/station/maintenance/tram/left)
"uSL" = (
/obj/effect/turf_decal/delivery/white,
/obj/structure/fluff/tram_rail/floor,
@@ -62815,6 +62766,15 @@
},
/turf/open/floor/iron/white,
/area/station/science/lobby)
+"vnA" = (
+/obj/machinery/elevator_control_panel{
+ layer = 3.1;
+ linked_elevator_id = "tram_xeno_lift";
+ pixel_y = 2;
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/turf/closed/wall,
+/area/station/science/xenobiology)
"vnD" = (
/obj/structure/reagent_dispensers/fueltank/large,
/obj/effect/turf_decal/bot{
@@ -64029,6 +63989,15 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms)
+"vHR" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"vIa" = (
/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -66953,6 +66922,20 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"wNu" = (
+/obj/effect/turf_decal/trimline/dark_red/warning{
+ dir = 9
+ },
+/obj/structure/industrial_lift/public,
+/obj/structure/railing{
+ dir = 9
+ },
+/obj/machinery/elevator_control_panel/directional/west{
+ linked_elevator_id = "tram_sci_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/turf/open/floor/plating/elevatorshaft,
+/area/station/science/lower)
"wNK" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible,
/turf/open/floor/iron,
@@ -67419,6 +67402,15 @@
/obj/effect/spawner/random/decoration/ornament,
/turf/open/floor/carpet,
/area/station/commons/vacant_room/office)
+"wZK" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/navbeacon{
+ codes_txt = "delivery;dir=1";
+ location = "QM #5"
+ },
+/obj/effect/turf_decal/tile/brown/fourcorners,
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"wZL" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 6
@@ -68241,6 +68233,12 @@
},
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"xrz" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/station/cargo/storage)
"xrE" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/siding/thinplating{
@@ -68862,17 +68860,6 @@
"xDQ" = (
/turf/closed/wall,
/area/station/security/processing)
-"xDW" = (
-/obj/machinery/door/airlock/mining/glass{
- name = "MULE Storage"
- },
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 1
- },
-/obj/effect/turf_decal/trimline/brown/filled/line,
-/obj/effect/mapping_helpers/airlock/access/all/supply/general,
-/turf/open/floor/iron,
-/area/station/cargo/storage)
"xDY" = (
/obj/structure/railing{
dir = 8
@@ -69011,6 +68998,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/station/command/meeting_room)
+"xIE" = (
+/obj/effect/turf_decal/caution/stand_clear/red{
+ dir = 1
+ },
+/obj/structure/industrial_lift/public,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/elevator_control_panel/directional/west{
+ linked_elevator_id = "tram_perma_lift";
+ preset_destination_names = list("2"="Lower Deck","3"="Upper Deck")
+ },
+/turf/open/floor/plating/elevatorshaft,
+/area/station/security/execution/transfer)
"xIL" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -86187,7 +86188,7 @@ jWs
lDo
ucA
wox
-lvz
+xIE
gTv
jWs
aaa
@@ -92394,7 +92395,7 @@ ncF
ncF
dFS
tuU
-uSl
+jJt
elr
elr
elr
@@ -99829,7 +99830,7 @@ uTz
hJM
nAa
ekB
-mUc
+cLS
jSV
uuD
qjU
@@ -104473,7 +104474,7 @@ qjU
aaa
qjU
fok
-uud
+ufX
sNq
ceb
pcx
@@ -113437,7 +113438,7 @@ aaa
aaa
uGW
jdU
-jwP
+mbp
rff
uGW
aaa
@@ -113735,7 +113736,7 @@ abM
abM
abM
iix
-giW
+wNu
boW
iix
abM
@@ -116329,7 +116330,7 @@ hDT
keT
iEF
fof
-csn
+vnA
sXX
akC
hFP
@@ -120936,7 +120937,7 @@ kkK
jXE
lwF
dfz
-fWK
+qZl
qCP
urA
ygC
@@ -154624,7 +154625,7 @@ aRy
aRE
aRI
aRL
-lnh
+dKz
pMW
pMW
pMW
@@ -179481,9 +179482,9 @@ aaa
aaa
aaa
cTU
-euR
-jnL
-abN
+qEJ
+nSY
+iHo
cTU
cTU
ohS
@@ -179738,9 +179739,9 @@ aaa
aaa
aaa
cTU
-plH
-jTQ
-nfZ
+qmC
+rcF
+wZK
cTU
exr
pZA
@@ -179995,9 +179996,9 @@ aac
aaa
aaa
cTU
-nUF
-jTQ
-mrg
+nvn
+rcF
+uQV
cTU
lan
pZA
@@ -180253,7 +180254,7 @@ aaa
cTU
cTU
ohS
-xDW
+reN
ohS
cTU
nnb
@@ -180510,10 +180511,10 @@ aaa
cTU
blx
tAJ
-lTM
-axF
-axF
-rwo
+srh
+xrz
+xrz
+vHR
dij
uax
uax
@@ -180772,8 +180773,8 @@ uax
uax
uax
uax
-gUL
-foU
+biE
+mzv
dzw
msn
qza
@@ -181028,9 +181029,9 @@ uax
uax
uax
uax
-tte
-nXk
-hDU
+iTa
+cVx
+lXx
dzw
sxR
skb
@@ -181611,7 +181612,7 @@ eJQ
bNx
aSt
aSt
-oKn
+dPi
aaa
aaa
aaa
@@ -183339,7 +183340,7 @@ cTU
cTU
cTU
udQ
-mmX
+gqb
pxD
ayd
ayt
@@ -183853,7 +183854,7 @@ aaa
aaa
aaa
udQ
-pOL
+kcd
kXr
aye
rgg
diff --git a/code/__DEFINES/tts.dm b/code/__DEFINES/tts.dm
index cca1b5db000..fd88016408c 100644
--- a/code/__DEFINES/tts.dm
+++ b/code/__DEFINES/tts.dm
@@ -4,3 +4,7 @@
#define TTS_SOUND_ENABLED "Enabled"
///TTS preference is set to only play blips of a sound, rather than speech.
#define TTS_SOUND_BLIPS "Blips Only"
+///TTS filter to activate start/stop radio clicks on speech.
+#define TTS_FILTER_RADIO "radio"
+///TTS filter to activate a silicon effect on speech.
+#define TTS_FILTER_SILICON "silicon"
diff --git a/code/controllers/configuration/entries/jobs.dm b/code/controllers/configuration/entries/jobs.dm
index 99a3ab7a701..06563e01a8e 100644
--- a/code/controllers/configuration/entries/jobs.dm
+++ b/code/controllers/configuration/entries/jobs.dm
@@ -9,7 +9,7 @@
return returnable_list
/// Sets all of the job datum configurable values to what they've been set to in the config file, jobconfig.toml.
-/datum/controller/subsystem/job/proc/load_jobs_from_config()
+/datum/controller/subsystem/job/proc/load_jobs_from_config(silent = FALSE)
if(!length(job_config_datum_singletons))
stack_trace("SSjob tried to load jobs from config, but the config singletons were not initialized! Likely tried to load jobs before SSjob was initialized.")
return
@@ -25,7 +25,8 @@
var/job_key = occupation.config_tag
if(!job_config[job_key]) // Job isn't listed, skip it.
// List both job_title and job_key in case they de-sync over time.
- message_admins(span_notice("[occupation.title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults."))
+ if(!silent)
+ message_admins(span_notice("[occupation.title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults."))
continue
for(var/config_datum_key in job_config_datum_singletons)
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 96f391b91eb..976b4bab249 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -305,8 +305,10 @@ SUBSYSTEM_DEF(job)
player.mind.special_role = null
SetupOccupations()
unassigned = list()
- if(overflow_role)
- set_overflow_role(overflow_role)
+ if(CONFIG_GET(flag/load_jobs_from_txt))
+ // Any errors with the configs has already been said, we don't need to repeat them here.
+ load_jobs_from_config(silent = TRUE)
+ set_overflow_role(overflow_role)
return
diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm
index b2b3d1926dd..d52fe83856a 100644
--- a/code/controllers/subsystem/radiation.dm
+++ b/code/controllers/subsystem/radiation.dm
@@ -135,7 +135,7 @@ SUBSYSTEM_DEF(radiation)
for (var/obj/item/bodypart/limb as anything in human.bodyparts)
var/protected = FALSE
- for (var/obj/item/clothing as anything in human.clothingonpart(limb))
+ for (var/obj/item/clothing as anything in human.get_clothing_on_part(limb))
if (HAS_TRAIT(clothing, TRAIT_RADIATION_PROTECTED_CLOTHING))
protected = TRUE
break
diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm
index 26f65b81256..eaa33a56db9 100644
--- a/code/controllers/subsystem/tts.dm
+++ b/code/controllers/subsystem/tts.dm
@@ -263,7 +263,7 @@ SUBSYSTEM_DEF(tts)
#undef TTS_ARBRITRARY_DELAY
-/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, silicon = "")
+/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, special_filters = "")
if(!tts_enabled)
return
@@ -279,7 +279,7 @@ SUBSYSTEM_DEF(tts)
var/shell_scrubbed_input = tts_speech_filter(message)
shell_scrubbed_input = copytext(shell_scrubbed_input, 1, 300)
- var/identifier = "[sha1(speaker + filter + num2text(pitch) + num2text(silicon) + shell_scrubbed_input)].[world.time]"
+ var/identifier = "[sha1(speaker + filter + num2text(pitch) + special_filters + shell_scrubbed_input)].[world.time]"
if(!(speaker in available_speakers))
return
@@ -290,9 +290,9 @@ SUBSYSTEM_DEF(tts)
var/datum/http_request/request_blips = new()
var/file_name = "tmp/tts/[identifier].ogg"
var/file_name_blips = "tmp/tts/[identifier]_blips.ogg"
- request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&silicon=[silicon]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name)
- request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&silicon=[silicon]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips)
- var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch, silicon)
+ request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name)
+ request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips)
+ var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch)
var/list/player_queued_tts_messages = queued_tts_messages[target]
if(!player_queued_tts_messages)
player_queued_tts_messages = list()
@@ -344,8 +344,6 @@ SUBSYSTEM_DEF(tts)
var/use_blips = FALSE
/// What's the pitch adjustment?
var/pitch = 0
- /// Are we using the silicon vocal effect on this?
- var/silicon = ""
/datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, message, target, local, datum/language/language, message_range, volume_offset, list/listeners, pitch)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
index 6683fb02f93..91ba7ec4894 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
@@ -51,6 +51,8 @@
required_distance = 3
/// range we will try chasing the target before giving up
var/chase_range = 9
+ ///do we care about avoiding friendly fire?
+ var/avoid_friendly_fire = FALSE
/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
. = ..()
@@ -75,6 +77,10 @@
if(!can_see(basic_mob, final_target, required_distance))
return
+ if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targetting_datum))
+ adjust_position(basic_mob, target)
+ return ..()
+
controller.set_blackboard_key(hiding_location_key, hiding_target)
basic_mob.RangedAttack(final_target)
return ..() //only start the cooldown when the shot is shot
@@ -83,3 +89,52 @@
. = ..()
if(!succeeded)
controller.clear_blackboard_key(target_key)
+
+/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targetting_datum/targetting_datum)
+ var/list/turfs_list = calculate_trajectory(source, target)
+ for(var/turf/possible_turf as anything in turfs_list)
+
+ for(var/mob/living/potential_friend in possible_turf)
+ if(!targetting_datum.can_attack(source, potential_friend))
+ return TRUE
+
+ return FALSE
+
+/datum/ai_behavior/basic_ranged_attack/proc/adjust_position(mob/living/living_pawn, atom/target)
+ var/turf/our_turf = get_turf(living_pawn)
+ var/list/possible_turfs = list()
+
+ for(var/direction in GLOB.alldirs)
+ var/turf/target_turf = get_step(our_turf, direction)
+ if(isnull(target_turf))
+ continue
+ if(target_turf.is_blocked_turf() || get_dist(target_turf, target) > get_dist(living_pawn, target))
+ continue
+ possible_turfs += target_turf
+
+ if(!length(possible_turfs))
+ return
+ var/turf/picked_turf = get_closest_atom(/turf, possible_turfs, target)
+ step(living_pawn, get_dir(living_pawn, picked_turf))
+
+/datum/ai_behavior/basic_ranged_attack/proc/calculate_trajectory(mob/living/source , atom/target)
+ var/list/turf_list = get_line(source, target)
+ var/list_length = length(turf_list) - 1
+ for(var/i in 1 to list_length)
+ var/turf/current_turf = turf_list[i]
+ var/turf/next_turf = turf_list[i+1]
+ var/direction_to_turf = get_dir(current_turf, next_turf)
+ if(!ISDIAGONALDIR(direction_to_turf))
+ continue
+
+ for(var/cardinal_direction in GLOB.cardinals)
+ if(cardinal_direction & direction_to_turf)
+ turf_list += get_step(current_turf, cardinal_direction)
+
+ turf_list -= get_turf(source)
+ turf_list -= get_turf(target)
+
+ return turf_list
+
+/datum/ai_behavior/basic_ranged_attack/avoid_friendly_fire
+ avoid_friendly_fire = TRUE
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
index 8340d1da4d3..e040a566bcf 100644
--- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
+++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm
@@ -31,15 +31,19 @@
var/random_number_in_range = rand(1, total_choices_length)
+ // Sound that plays when the mob does something audible
+ var/sound_to_play = length(sound) > 0 ? pick(sound) : null
+
if(random_number_in_range <= audible_emotes_length)
- controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear))
+ controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play)
else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length))
controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see))
else
- controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), length(sound) > 0 ? pick(sound) : null)
+ controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play)
/datum/ai_planning_subtree/random_speech/insect
speech_chance = 5
+ sound = list('sound/creatures/chitter.ogg')
emote_hear = list("chitters.")
/datum/ai_planning_subtree/random_speech/mothroach
@@ -49,6 +53,7 @@
/datum/ai_planning_subtree/random_speech/mouse
speech_chance = 1
speak = list("Squeak!", "SQUEAK!", "Squeak?")
+ sound = list('sound/creatures/mousesqueek.ogg')
emote_hear = list("squeaks.")
emote_see = list("runs in a circle.", "shakes.")
@@ -93,12 +98,14 @@
/datum/ai_planning_subtree/random_speech/chicken
speech_chance = 15 // really talkative ladies
speak = list("Cluck!", "BWAAAAARK BWAK BWAK BWAK!", "Bwaak bwak.")
+ sound = list('sound/creatures/clucks.ogg', 'sound/creatures/bagawk.ogg')
emote_hear = list("clucks.", "croons.")
emote_see = list("pecks at the ground.","flaps her wings viciously.")
/datum/ai_planning_subtree/random_speech/chick
speech_chance = 4
speak = list("Cherp.", "Cherp?", "Chirrup.", "Cheep!")
+ sound = list('sound/creatures/chick_peep.ogg')
emote_hear = list("cheeps.")
emote_see = list("pecks at the ground.","flaps her tiny wings.")
@@ -160,33 +167,37 @@
/datum/ai_planning_subtree/random_speech/pony
speech_chance = 3
+ sound = list('sound/creatures/pony/whinny01.ogg', 'sound/creatures/pony/whinny02.ogg', 'sound/creatures/pony/whinny03.ogg')
emote_hear = list("whinnies!")
emote_see = list("horses around.")
/datum/ai_planning_subtree/random_speech/pony/tamed
speech_chance = 3
+ sound = list('sound/creatures/pony/snort.ogg')
+ emote_hear = list("snorts.")
emote_see = list("snorts.")
/datum/ai_planning_subtree/random_speech/killer_tomato
speech_chance = 3
- speak = list("gnashes.", "growls lowly.", "snarls.")
- emote_hear = list("gnashes.")
+ emote_hear = list("gnashes.", "growls lowly.", "snarls.")
emote_see = list("salivates.")
/datum/ai_planning_subtree/random_speech/ant
speech_chance = 1
+ speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht")
+ sound = list('sound/creatures/chitter.ogg')
emote_hear = list("buzzes.", "clacks.")
emote_see = list("shakes their head.", "twitches their antennae.")
- speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht")
/datum/ai_planning_subtree/random_speech/fox
speech_chance = 1
+ speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff")
emote_hear = list("howls.", "barks.", "screams.")
emote_see = list("shakes their head.", "shivers.")
- speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff")
/datum/ai_planning_subtree/random_speech/crab
speech_chance = 1
+ sound = list('sound/creatures/claw_click.ogg')
emote_hear = list("clicks.")
emote_see = list("clacks.")
diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm
index e7bfe7a7c60..fd6d848f2d6 100644
--- a/code/datums/ai/generic/generic_behaviors.dm
+++ b/code/datums/ai/generic/generic_behaviors.dm
@@ -287,11 +287,13 @@
/datum/ai_behavior/perform_emote
-/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote)
+/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote, speech_sound)
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn))
return
living_pawn.manual_emote(emote)
+ if(speech_sound) // Only audible emotes will pass in a sound
+ playsound(living_pawn, speech_sound, 80, vary = TRUE)
finish_action(controller, TRUE)
/datum/ai_behavior/perform_speech
diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm
index 1dace1dd1b2..702a42e7ab0 100644
--- a/code/datums/atmosphere/_atmosphere.dm
+++ b/code/datums/atmosphere/_atmosphere.dm
@@ -52,6 +52,9 @@
ASSERT_GAS_IN_LIST(gastype, gaslist)
gaslist[gastype][MOLES] += amount
+ // Ensure that minimum_pressure is actually a hard lower limit
+ target_pressure = clamp(target_pressure, minimum_pressure + (gaslist[gastype][MOLES] * 0.1), maximum_pressure)
+
// That last one put us over the limit, remove some of it
while(gasmix.return_pressure() > target_pressure)
gaslist[gastype][MOLES] -= gaslist[gastype][MOLES] * 0.1
diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm
index 9758cd0c1b6..1d9cf9e87d6 100644
--- a/code/datums/components/acid.dm
+++ b/code/datums/components/acid.dm
@@ -78,8 +78,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
QDEL_NULL(sizzle)
if(particle_effect)
QDEL_NULL(particle_effect)
- if(process_effect)
- process_effect = null
+ process_effect = null
return ..()
/datum/component/acid/RegisterWithParent()
diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm
index 48df6e164fb..8cb240526a4 100644
--- a/code/datums/mapgen/CaveGenerator.dm
+++ b/code/datums/mapgen/CaveGenerator.dm
@@ -116,8 +116,8 @@
var/start_time = REALTIMEOFDAY
- for(var/turf/turf as anything in turfs)
- if(!(turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped
+ for(var/turf/target_turf as anything in turfs)
+ if(!(target_turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped
continue
// If we've spawned something yet
@@ -127,22 +127,24 @@
//FLORA SPAWNING HERE
if(flora_allowed && prob(flora_spawn_chance))
var/flora_type = pick(flora_spawn_list)
- new flora_type(turf)
+ new flora_type(target_turf)
spawned_something = TRUE
//FEATURE SPAWNING HERE
- if(feature_allowed && prob(feature_spawn_chance))
+ //we may have generated something from the flora list on the target turf, so let's not place
+ //a feature here if that's the case (because it would look stupid)
+ if(feature_allowed && !spawned_something && prob(feature_spawn_chance))
var/can_spawn = TRUE
var/atom/picked_feature = pick(feature_spawn_list)
- for(var/obj/structure/existing_feature in range(7, turf))
+ for(var/obj/structure/existing_feature in range(7, target_turf))
if(istype(existing_feature, picked_feature))
can_spawn = FALSE
break
if(can_spawn)
- new picked_feature(turf)
+ new picked_feature(target_turf)
spawned_something = TRUE
//MOB SPAWNING HERE
@@ -161,12 +163,12 @@
// prevents tendrils spawning in each other's collapse range
if(ispath(picked_mob, /obj/structure/spawner/lavaland))
- for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, turf))
+ for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, target_turf))
can_spawn = FALSE
break
// if the random is not a tendril (hopefully meaning it is a mob), avoid spawning if there's another one within 12 tiles
else
- var/list/things_in_range = range(12, turf)
+ var/list/things_in_range = range(12, target_turf)
for(var/mob/living/mob_blocker in things_in_range)
if(ismining(mob_blocker))
can_spawn = FALSE
@@ -176,7 +178,7 @@
can_spawn = can_spawn && !(locate(/obj/effect/spawner/random/lavaland_mob) in things_in_range)
//if there's a megafauna within standard view don't spawn anything at all (This isn't really consistent, I don't know why we do this. you do you tho)
if(can_spawn)
- for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, turf))
+ for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, target_turf))
can_spawn = FALSE
break
@@ -185,7 +187,7 @@
weighted_megafauna_spawn_list.Remove(picked_mob)
megafauna_spawn_list = expand_weights(weighted_megafauna_spawn_list)
megas_allowed = megas_allowed && length(megafauna_spawn_list)
- new picked_mob(turf)
+ new picked_mob(target_turf)
spawned_something = TRUE
CHECK_TICK
diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm
index 67fce2f49a4..b790c53d76c 100644
--- a/code/datums/records/record.dm
+++ b/code/datums/records/record.dm
@@ -24,6 +24,8 @@
var/species
/// The character's ID trim
var/trim
+ /// The character's voice, if they have one.
+ var/voice
/datum/record/New(
age = 18,
@@ -37,6 +39,7 @@
rank = "Unassigned",
species = "Human",
trim = "Unassigned",
+ voice = "?????",
)
src.age = age
src.blood_type = blood_type
diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm
index 774d8cc5265..e650899be29 100644
--- a/code/datums/wounds/scars/_scars.dm
+++ b/code/datums/wounds/scars/_scars.dm
@@ -181,7 +181,7 @@
if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE)))
return FALSE
else if(limb.scars_covered_by_clothes)
- var/num_covers = LAZYLEN(human_victim.clothingonpart(limb))
+ var/num_covers = LAZYLEN(human_victim.get_clothing_on_part(limb))
if(num_covers + get_dist(viewer, victim) >= visibility)
return FALSE
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 4fc3477b0a4..88f86f60962 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -469,8 +469,8 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits)
for(var/job in job_prefs)
var/priority = job_prefs[job]
job_data += "[job]: [SSjob.job_priority_level_to_string(priority)]"
- to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role because you could not qualify for any of the roundstart jobs you were trying to qualify for, along with 'return to lobby if job is unavailable' enabled."))
- log_admin("[player.ckey] failed to qualify for any job and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]")
+ to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role this round because your job preferences presented a high chance of all of your selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled. Increase the number of roles set to medium or low priority to reduce the chances of this happening."))
+ log_admin("[player.ckey] failed to qualify for any roundstart antagonist role because their job preferences presented a high chance of all of their selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]")
else
roundstart_pop_ready++
candidates.Add(player)
diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
index 57067db47f6..96c33871a40 100644
--- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
@@ -133,7 +133,7 @@
. = ..()
if(prob(5))
owner.emote("squeaks")
- playsound(owner, 'sound/effects/mousesqueek.ogg', 100)
+ playsound(owner, 'sound/creatures/mousesqueek.ogg', 100)
#undef RAT_ORGAN_COLOR
#undef RAT_SCLERA_COLOR
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index c9c4815e3da..0852aeff883 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -509,46 +509,12 @@
icon_state = "duffel-medical"
inhand_icon_state = "duffel-med"
-/obj/item/storage/backpack/duffelbag/med/surgery
- name = "surgical duffel bag"
- desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
-
-/obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents()
- new /obj/item/scalpel(src)
- new /obj/item/hemostat(src)
- new /obj/item/retractor(src)
- new /obj/item/circular_saw(src)
- new /obj/item/surgicaldrill(src)
- new /obj/item/cautery(src)
- new /obj/item/bonesetter(src)
- new /obj/item/surgical_drapes(src)
- new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) //SKYRAT EDIT ADDITION
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/razor(src)
- new /obj/item/blood_filter(src)
-
/obj/item/storage/backpack/duffelbag/coroner
name = "coroner duffel bag"
desc = "A large duffel bag for holding large amounts of organs at once."
icon_state = "duffel-coroner"
inhand_icon_state = "duffel-coroner"
-/obj/item/storage/backpack/duffelbag/coroner/surgery
- name = "surgical coroner bag"
- desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding morbid surgical tools."
-
-/obj/item/storage/backpack/duffelbag/coroner/surgery/PopulateContents()
- new /obj/item/scalpel/cruel(src)
- new /obj/item/hemostat/cruel(src)
- new /obj/item/retractor/cruel(src)
- new /obj/item/circular_saw(src)
- new /obj/item/surgicaldrill(src)
- new /obj/item/cautery/cruel(src)
- new /obj/item/bonesetter(src)
- new /obj/item/surgical_drapes(src)
- new /obj/item/razor(src)
- new /obj/item/blood_filter(src)
-
/obj/item/storage/backpack/duffelbag/explorer
name = "explorer duffel bag"
desc = "A large duffel bag for holding extra exotic treasures."
diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm
index dfe83baabdb..99838f5d3c4 100644
--- a/code/game/objects/items/surgery_tray.dm
+++ b/code/game/objects/items/surgery_tray.dm
@@ -11,6 +11,7 @@
/obj/item/cautery,
/obj/item/circular_saw,
/obj/item/clothing/mask/surgical,
+ /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, // SKYRAT EDIT ADDITION
/obj/item/hemostat,
/obj/item/razor,
/obj/item/reagent_containers/medigel,
@@ -193,6 +194,7 @@
new /obj/item/cautery(src)
new /obj/item/circular_saw(src)
new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION
new /obj/item/hemostat(src)
new /obj/item/razor/surgery(src)
new /obj/item/retractor(src)
@@ -207,13 +209,14 @@
name = "autopsy tray"
desc = "A Deforest brand surgery tray, made for use in morgues. It is a folding model, \
meaning the wheels on the bottom can be extended outwards, making it a cart."
-
+
/obj/item/surgery_tray/full/morgue/populate_contents()
new /obj/item/blood_filter(src)
new /obj/item/bonesetter(src)
new /obj/item/cautery/cruel(src)
new /obj/item/circular_saw(src)
new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION
new /obj/item/hemostat/cruel(src)
new /obj/item/razor/surgery(src)
new /obj/item/retractor/cruel(src)
@@ -227,13 +230,13 @@
/obj/item/surgery_tray/full/advanced
/obj/item/surgery_tray/full/advanced/populate_contents()
- new /obj/item/scalpel/advanced
- new /obj/item/retractor/advanced
- new /obj/item/cautery/advanced
- new /obj/item/surgical_drapes
- new /obj/item/reagent_containers/medigel/sterilizine
- new /obj/item/bonesetter
- new /obj/item/blood_filter
- new /obj/item/stack/medical/bone_gel
- new /obj/item/stack/sticky_tape/surgical
- new /obj/item/clothing/mask/surgical
+ new /obj/item/scalpel/advanced(src)
+ new /obj/item/retractor/advanced(src)
+ new /obj/item/cautery/advanced(src)
+ new /obj/item/surgical_drapes(src)
+ new /obj/item/reagent_containers/medigel/sterilizine(src)
+ new /obj/item/bonesetter(src)
+ new /obj/item/blood_filter(src)
+ new /obj/item/stack/medical/bone_gel(src)
+ new /obj/item/stack/sticky_tape/surgical(src)
+ new /obj/item/clothing/mask/surgical(src)
diff --git a/code/game/say.dm b/code/game/say.dm
index a531ee02527..c0e9d4ff8ef 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
filter += tts_filter.Join(",")
if(voice && found_client)
- INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch, silicon = tts_silicon_voice_effect)
+ INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch)
/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), visible_name = FALSE)
//This proc uses [] because it is faster than continually appending strings. Thanks BYOND.
diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm
index a5b2af68c77..9cb661d2fee 100644
--- a/code/modules/admin/view_variables/reference_tracking.dm
+++ b/code/modules/admin/view_variables/reference_tracking.dm
@@ -92,6 +92,7 @@
return
datum_container.last_find_references = search_time
+ var/container_print = datum_container.ref_search_details()
var/list/vars_list = datum_container.vars
for(var/varname in vars_list)
@@ -108,11 +109,11 @@
found_refs[varname] = TRUE
continue //End early, don't want these logging
#endif
- log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [text_ref(datum_container)] [varname] var. [container_name]")
+ log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [container_print] [varname] var. [container_name]")
continue
if(islist(variable))
- DoSearchVar(variable, "[container_name] [text_ref(datum_container)] -> [varname] (list)", recursive_limit - 1, search_time)
+ DoSearchVar(variable, "[container_name] [container_print] -> [varname] (list)", recursive_limit - 1, search_time)
else if(islist(potential_container))
var/normal = IS_NORMAL_LIST(potential_container)
@@ -159,3 +160,13 @@
qdel(src, force)
#endif
+
+// Kept outside the ifdef so overrides are easy to implement
+
+/// Return info about us for reference searching purposes
+/// Will be logged as a representation of this datum if it's a part of a search chain
+/datum/proc/ref_search_details()
+ return text_ref(src)
+
+/datum/callback/ref_search_details()
+ return "[text_ref(src)] (obj: [object] proc: [delegate] args: [json_encode(arguments)] user: [user?.resolve() || "null"])"
diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm
index a6c6616ad48..49d464fde16 100644
--- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm
+++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm
@@ -9,7 +9,6 @@
#define MALF_AI_ROLL_COOLDOWN 1 SECONDS + MALF_AI_ROLL_TIME
#define MALF_AI_ROLL_DAMAGE 75
#define MALF_AI_ROLL_CRIT_CHANCE 5 //percent
-#define MALF_AI_ROLL_MAX_DISTANCE 1 //anything further away than this, and the roll will fail
GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
/obj/machinery/field/containment,
@@ -1138,6 +1137,11 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
enable_text = span_notice("Your inner servos shift as you prepare to roll around. Click adjacent tiles to roll onto them!")
disable_text = span_notice("You disengage your rolling protocols.")
+ /// How long does it take for us to roll?
+ var/roll_over_time = MALF_AI_ROLL_TIME
+ /// On top of [roll_over_time], how long does it take for the ability to cooldown?
+ var/roll_over_cooldown = MALF_AI_ROLL_COOLDOWN
+
/datum/action/innate/ai/ranged/core_tilt/New()
. = ..()
desc = "[desc] It has [uses] use\s remaining."
@@ -1152,7 +1156,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
return FALSE
var/mob/living/silicon/ai/ai_caller = caller
- if (ai_caller.incapacitated())
+ if (ai_caller.incapacitated() || !isturf(ai_caller.loc))
return FALSE
var/turf/target = get_turf(clicked_on)
@@ -1163,30 +1167,32 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
target.balloon_alert(ai_caller, "can't roll on yourself!")
return FALSE
- if (get_dist(ai_caller, target) > MALF_AI_ROLL_MAX_DISTANCE)
- target.balloon_alert(ai_caller, "too far!")
- return FALSE
-
var/picked_dir = get_dir(ai_caller, target)
+ if (!picked_dir)
+ return FALSE
+ var/turf/temp_target = get_step(ai_caller, picked_dir) // we can move during the timer so we cant just pass the ref
- new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(target, MALF_AI_ROLL_TIME)
+ new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(temp_target, roll_over_time)
ai_caller.balloon_alert_to_viewers("rolling...")
- addtimer(CALLBACK(src, PROC_REF(do_roll_over), ai_caller, picked_dir), MALF_AI_ROLL_TIME)
+ addtimer(CALLBACK(src, PROC_REF(do_roll_over), ai_caller, picked_dir), roll_over_time)
adjust_uses(-1)
if(uses)
desc = "[initial(desc)] It has [uses] use\s remaining."
build_all_button_icons()
- COOLDOWN_START(src, time_til_next_tilt, MALF_AI_ROLL_COOLDOWN)
+ COOLDOWN_START(src, time_til_next_tilt, roll_over_cooldown)
/datum/action/innate/ai/ranged/core_tilt/proc/do_roll_over(mob/living/silicon/ai/ai_caller, picked_dir)
+ if (ai_caller.incapacitated() || !isturf(ai_caller.loc)) // prevents bugs where the ai is carded and rolls
+ return
+
var/turf/target = get_step(ai_caller, picked_dir) // in case we moved we pass the dir not the target turf
if (isnull(target))
return
- var/paralyze_time = clamp(6 SECONDS, 0 SECONDS, (MALF_AI_ROLL_COOLDOWN * 0.9)) //the clamp prevents stunlocking as the max is always a little less than the cooldown between rolls
+ var/paralyze_time = clamp(6 SECONDS, 0 SECONDS, (roll_over_cooldown * 0.9)) //the clamp prevents stunlocking as the max is always a little less than the cooldown between rolls
return ai_caller.fall_and_crush(target, MALF_AI_ROLL_DAMAGE, MALF_AI_ROLL_CRIT_CHANCE, null, paralyze_time, picked_dir, rotation = get_rotation_from_dir(picked_dir))
@@ -1321,4 +1327,3 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module))
#undef MALF_AI_ROLL_TIME
#undef MALF_AI_ROLL_DAMAGE
#undef MALF_AI_ROLL_CRIT_CHANCE
-#undef MALF_AI_ROLL_MAX_DISTANCE
diff --git a/code/modules/cargo/packs/general.dm b/code/modules/cargo/packs/general.dm
index 5ebdd5087a8..fa7a3bfa374 100644
--- a/code/modules/cargo/packs/general.dm
+++ b/code/modules/cargo/packs/general.dm
@@ -221,6 +221,13 @@
/obj/item/clothing/under/misc/burial = 2,
)
crate_name = "religious supplies crate"
+
+/datum/supply_pack/misc/candles_bulk
+ name = "Candle Box Crate"
+ desc = "Keep your local chapel lit with three candle boxes!"
+ cost = CARGO_CRATE_VALUE * 1.5
+ contains = list(/obj/item/storage/fancy/candle_box = 3)
+ crate_name = "candle box crate"
/datum/supply_pack/misc/toner
name = "Toner Crate"
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 430c32a35ab..6794a1960e7 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -123,11 +123,11 @@
/datum/supply_pack/medical/surgery
name = "Surgical Supplies Crate"
desc = "Do you want to perform surgery, but don't have one of those fancy \
- shmancy degrees? Just get started with this crate containing a medical duffelbag, \
+ shmancy degrees? Just get started with this crate containing a DeForest surgery tray, \
Sterilizine spray and collapsible roller bed."
cost = CARGO_CRATE_VALUE * 6
contains = list(
- /obj/item/storage/backpack/duffelbag/med/surgery,
+ /obj/item/surgery_tray/full,
/obj/item/reagent_containers/medigel/sterilizine,
/obj/item/emergency_bed,
)
diff --git a/code/modules/client/preferences/middleware/tts.dm b/code/modules/client/preferences/middleware/tts.dm
index 71b7b977f4b..4d3ee3261bd 100644
--- a/code/modules/client/preferences/middleware/tts.dm
+++ b/code/modules/client/preferences/middleware/tts.dm
@@ -23,5 +23,5 @@
var/speaker = preferences.read_preference(/datum/preference/choiced/voice)
var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch)
COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS)
- INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, silicon = TRUE, local = TRUE)
+ INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE)
return TRUE
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index dfcc3060c9f..ad296d30356 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -12,6 +12,10 @@
var/adjusted_flags = null
///Did we install a filtering cloth?
var/has_filter = FALSE
+ /// If defined, what voice should we override with if TTS is active?
+ var/voice_override
+ /// If set to true, activates the radio effect on TTS. Used for sec hailers, but other masks can utilize it for their own vocal effect.
+ var/use_radio_beeps_tts = FALSE
/obj/item/clothing/mask/attack_self(mob/user)
if((clothing_flags & VOICEBOX_TOGGLABLE))
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 7b415bac6dc..c8784d9af6c 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list(
var/has_fov = TRUE
///Cigarette in the mask
var/obj/item/clothing/mask/cigarette/cig
-
+ voice_filter = "lowpass=f=750,volume=2"
/datum/armor/mask_gas
bio = 100
@@ -274,6 +274,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list(
dog_fashion = /datum/dog_fashion/head/clown
has_fov = FALSE
var/list/clownmask_designs = list()
+ voice_filter = null // performer masks expect to be talked through
/obj/item/clothing/mask/gas/clown_hat/plasmaman
starting_filter_type = /obj/item/gas_filter/plasmaman
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index af1d3975645..64de19b95aa 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -68,6 +68,8 @@ GLOBAL_LIST_INIT(hailer_phrases, list(
var/recent_uses = 0
///Whether the hailer is emagged or not
var/safety = TRUE
+ voice_filter = @{"[0:a] asetrate=%SAMPLE_RATE%*0.7,aresample=16000,atempo=1/0.7,lowshelf=g=-20:f=500,highpass=f=500,aphaser=in_gain=1:out_gain=1:delay=3.0:decay=0.4:speed=0.5:type=t [out]; [out]atempo=1.2,volume=15dB [final]; anoisesrc=a=0.01:d=60 [noise]; [final][noise] amix=duration=shortest"}
+ use_radio_beeps_tts = TRUE
/obj/item/clothing/mask/gas/sechailer/plasmaman
starting_filter_type = /obj/item/gas_filter/plasmaman
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 2f29a2233d5..bbd880f5466 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -104,6 +104,7 @@
laser = 20
energy = 30
bomb = 100
+ bio = 50
fire = 80
acid = 50
diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm
index e7f31567f4c..450f9100800 100644
--- a/code/modules/events/mice_migration.dm
+++ b/code/modules/events/mice_migration.dm
@@ -23,7 +23,7 @@
priority_announce("Due to [cause], [plural] [name] have [movement] \
into the [location].", "Migration Alert",
- 'sound/effects/mousesqueek.ogg')
+ 'sound/creatures/mousesqueek.ogg')
/datum/round_event/mice_migration/start()
SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice))
diff --git a/code/modules/explorer_drone/control_console.dm b/code/modules/explorer_drone/control_console.dm
index 7b371e8412b..8cc8854f27d 100644
--- a/code/modules/explorer_drone/control_console.dm
+++ b/code/modules/explorer_drone/control_console.dm
@@ -1,6 +1,6 @@
/obj/machinery/computer/exodrone_control_console
name = "exploration drone control console"
- desc = "control eploration drones from intersteller distances. Communication lag not included."
+ desc = "Control exploration drones from interstellar distances. Communication lag not included."
circuit = /obj/item/circuitboard/computer/exodrone_console
//Currently controlled drone
var/obj/item/exodrone/controlled_drone
diff --git a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json b/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json
index 3f9ee41582e..f06b1d25062 100644
--- a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json
+++ b/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json
@@ -1,343 +1,356 @@
{
- "adventure_name": "There's a tree in the middle of space.",
- "version": 1,
- "starting_node": "Tree Start",
- "starting_qualities": {
- "Confusion": 0
- },
- "required_site_traits": [
- "in space"
- ],
- "loot_categories": [
- "research"
- ],
- "scan_band_mods": {
- "Exotic Radiation": 10
- },
- "deep_scan_description": "",
- "triggers": [
- {
- "name": "Confusion Trigger",
- "target_node": "What is wrong with this tree?",
- "requirements": [
- {
- "quality": "Confusion",
- "operator": ">",
- "value": 30
- }
- ]
- }
- ],
- "nodes": [
- {
- "name": "Tree Start",
- "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.",
- "choices": [
- {
- "key": "choice 0",
- "name": "Ignore site.",
- "exit_node": "FAIL",
- "delay": 10,
- "delay_message": "Leave this for the botanists to figure out."
- },
- {
- "key": "choice 1",
- "name": "Begin sensor scan.",
- "exit_node": "Biological Scan",
- "delay": 10,
- "delay_message": "Lets get some data."
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,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"
- },
- {
- "name": "Biological Scan",
- "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.",
- "choices": [
- {
- "key": "choice 2",
- "name": "Check Sensor Integrity.",
- "exit_node": "Its Not You...",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": 5
- }
- ],
- "delay": 50,
- "delay_message": "This can't be right."
- },
- {
- "key": "choice 4",
- "name": "Attempt to take sample.",
- "exit_node": "Sample Taken",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": 3
- }
- ],
- "delay": 40,
- "delay_message": "Snip snip."
- },
- {
- "key": "choice 6",
- "name": "Examine Tree Roots.",
- "exit_node": "Examine Roots",
- "delay": 10
- },
- {
- "key": "choice 9",
- "name": "Sequence Sample Radiation with background noise.",
- "exit_node": "Background Analysis",
- "requirements": [
- {
- "quality": "Sample",
- "operator": ">=",
- "value": 1
- }
- ],
- "delay": 0,
- "delay_message": "This can't be real."
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,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"
- },
- {
- "name": "Its Not You...",
- "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.",
- "choices": [
- {
- "key": "choice 3",
- "name": "Restart biological scan.",
- "exit_node": "Biological Scan",
- "delay": 25,
- "delay_message": "God damnit."
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7"
- },
- {
- "name": "Sample Taken",
- "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.",
- "choices": [
- {
- "key": "choice 5",
- "name": "Well that was... unexpected.",
- "exit_node": "Biological Scan",
- "delay": 0,
- "delay_message": "Maybe something else might work better.",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Sample",
- "value": 1
- }
- ]
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw=="
- },
- {
- "name": "Examine Roots",
- "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.",
- "choices": [
- {
- "key": "choice 7",
- "name": "That's fucking stupid.",
- "exit_node": "Biological Scan",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": {
- "value_type": "random",
- "low": 6,
- "high": 10
- }
- }
- ],
- "delay": 0,
- "delay_message": "What the hell kind of tree even IS this?"
- },
- {
- "key": "choice 8",
- "name": "Obtain biological sample from roots.",
- "exit_node": "Sample Taken",
- "delay": 10,
- "delay_message": "This is why we hire botanists on-site."
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMQAAAAAAAC15h2QtxeAoxVykROizRpxjxIAcgAAWwAAgAAAUAAAZAAAZgC0tLTKysr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/2AgjmRpnigqrMMqtCvhyvFs17hQuPva67ygTwgcGovA3a61BLaeryj0mapar9isNjCNylpfgWwsLpPPZqBst066le84fB5nRpvdvGDL7/v/JmBeaWiFhIeGbGqLio1ljm2CklKUA4CXmJmaAYidhp9mBmOiYqQEpqZlk3qbra6vsCOenqijtgIHCLG7vL29CQoNCsDCxMPBxw0MxsTLyMLCCwq+1LuVe9VZ0M/c297d4NvZ41vXeueU5N/r4e3o79jkvOb0UAe4+Pf6uMjS7P/TtAAcGKyeQXhT5ClcSKIdwYcHIyKMx7CiwocOwU3cWMmiR4YYQzqM+LGkSQXSUv/2y0jQH0qUJmNqoRSm5ixQbXLK2UmnJ886ToIilFltkk2cNw9B+umz6U87UOsRNXk0KdKrVrOSWWVwqlc+WHHWKnWqrKizZV+QGrA2yte31YDJPTZXrrMEzhbkPSYNWF+4gAFBeICJGTLDxVi2C5yNIxSQikVu48i4j8TLT1i2khwOM+bKVSQaeGLgQOnS+fIBwkiCszfPjqWAnn0ism1hsXO/oM279e3fuqmYeAChN++XKqP9BujP+EcXMKLkoFFm+o3qSH5oJ7L9SPfs3IlEHw/dhfNyLMpbX4+duvvw3uGDj08fCfn0+KVTPI9Ff/T37AHY3nXfFSifgfX9cJ//f/vxh95/1wkoYYQU5oDgfBh+t+B9DsJS4YABfiiDAWWQOGKJKJ6oYidcDdVhUVrFGFZWRl32IlEy0nJLWjyu1VYYrNxY2YxXjZUWW1+0FaSQDiaQ4z0y3OMXX3wxaSUKiWWZTF5c+sVASl8iB9OVbxFH3CVabmOMa9yQ6WYAbHL2Zh+UVRTnbV3NyUlwu120HEuw9WlloO+Mc+c3fCbEH6ES/Ybmn9AwWmdvnu1jaWoHpMBmFYdK+tmLiQqKCaTAebqRnh4d6o6pEqHqEan/sOqiqxbBumqoig42GK0WqUqQY7zCtZKvDgXL37AvEbvNAsaeJ6Zy0JKqErPNYpIj/xqOOKUtU9xu6+1OUekpCJFpLPXtud2mu21UTbhKLraPqCsvuvQ+FdQSqI57bbnxtlHvv/OCK5RsqO4Lr78BA6xwulDR+m4n5iYs8cJNVNyguwYzEi/FE3dsR7UpZJzIxh1z7FO4IJ8gMr860WuAEi/rEHMBM88s8ccpn/AwVhEjTDPMQMsc9M9Cx9HyIJbknMLOEJNC8xpOR/3zy1RPbXXVWD8tM9Rcq3Kx0lesvKORZz2NFtVmnWJ2j2NLAnYsiJCd9tlzz7122XTnnfbb2dxUi96A1x044GDwnc0Zfwuu+OCLK274c4UkzvjkZj3+ldxkUY5AApt3noDlldF1zP/YBAyzuemcp4665wGBDlcDeCUA+zKzyx77Arfnvjnuy+C+u+uADXPXMsTHXvzxxid/PPC8OEAYmnLBPoz0ttMee+3YXx/958y/oqsDl4hel/jkjz9+Md17Rf3620/fvu3uxy97A+lPVT75ic2lJWLDWD7AE/97QQCT1qv3sU9+6ytGAxTIQL7FpiLJiCD/JggOYJxKXAPMIAA3KCp1MHB6H5wfCEcowgRoUIAc/F8L3CSrr/EiGAsc4QKhEcMZwpCG0DihClHIQxVeaYdA1KEQAWioD9pQhEesoRJTOMQe/k9ITQwiEzloQ/q9sIpKxOENt9iAKHpxgw76ohOnKED/LWJRGJrIIhfVWEUxSnGMPDQOGd+4wwME0I76COAC2MhHNPZhjWbk4xzd2MTeNBGPuBiAPg6wyEbiIlMiaEBKYrjHQOJQG5YE5BbpSMhByvGQiixNKBlpGlI+8h5a0OQZg2ECVfYRhoOMJRx36JxZ/k+UbMGjKEupyERi4pUzjGQmV9lGWXLSkxiMoy+ICcxmNsCWxvRi/VYzw2pa85rYvKYKt8nNbnrzm96c5h+G6UwudhKacBTnOLPJznYuEJzwjCc41blOctoTlug8JjTpiSZ3+lOb3LTj/wSqSHlycwQPeB4//8jMe2KRgwJNZDQJaCaFLlQge6ykJP/ZTo3iYbGgHx3oPC+6CZRQspwNNakwEMnSE5L0FRndaEwXqFGO0lSmG32pQmLK043e1KYz7KlO5dHTouKUo0YdKjmMalSk4jSmSh3HAqb61KpqtKZBtWpOo1oNpmoVq9dkKrWMEwIAOw=="
- },
- {
- "name": "Background Analysis",
- "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.",
- "choices": [
- {
- "key": "choice 10",
- "name": "Smash your desk in frustration.",
- "exit_node": "FAIL",
- "delay": 50,
- "delay_message": "No amount of pay is worth dealing with magical plant juju."
- },
- {
- "key": "choice 11",
- "name": "Check every known energy spectroscopy database.",
- "exit_node": "Sample Match Found",
- "delay": 900,
- "delay_message": "You NEED an answer. You DESERVE an answer."
- }
- ],
- "image": null,
- "on_enter_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": {
- "value_type": "random",
- "low": 3,
- "high": 5
- }
- }
- ],
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw=="
- },
- {
- "name": "Sample Match Found",
- "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?",
- "choices": [
- {
- "key": "choice 12",
- "name": "Something must be wrong with the drone.",
- "exit_node": "Its Not You...",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": {
- "value_type": "random",
- "low": 6,
- "high": 10
- }
- }
- ],
- "delay": 30,
- "delay_message": "Lousy piece of junk must be scanning the station instead of the target."
- },
- {
- "key": "choice 13",
- "name": "Perhaps that sample was tainted. Collect a new sample.",
- "exit_node": "Sample Taken",
- "delay": 60,
- "delay_message": "Lets try again, but carefully."
- },
- {
- "key": "choice 14",
- "name": "Remember the Christmas Party.",
- "exit_node": "The Christmas Party",
- "requirements": [
- {
- "quality": "Confusion",
- "operator": "<=",
- "value": 25
- }
- ],
- "delay": 100,
- "delay_message": "Wait a gosh darn fucking second."
- }
- ],
- "image": null,
- "on_enter_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": 10
- }
- ],
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7"
- },
- {
- "name": "The Christmas Party",
- "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?",
- "choices": [
- {
- "key": "choice 15",
- "name": "Wait a minute, was that a god damn...",
- "exit_node": "Rod.",
- "delay": 100,
- "delay_message": "Immovable Rod?"
- }
- ],
- "image": null,
- "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7"
- },
- {
- "name": "Rod.",
- "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.",
- "choices": [
- {
- "key": "choice 16",
- "name": "Snap a photo",
- "exit_node": "Epilogue.",
- "delay": 40,
- "delay_message": "You could easily win an award for these findings!"
- }
- ],
- "image": "default"
- },
- {
- "name": "Epilogue.",
- "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?",
- "choices": [
- {
- "key": "choice 17",
- "name": "God damnit.",
- "exit_node": "WIN",
- "delay": 10,
- "delay_message": "Some things were just not meant for man to know."
- }
- ],
- "image": "default"
- },
- {
- "name": "What is wrong with this tree?",
- "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!",
- "choices": [
- {
- "key": "choice 18",
- "name": "The world can never know about this dumbass stupid plant.",
- "exit_node": "FAIL_DEATH",
- "delay": 60,
- "delay_message": "Activating drone self-destruct."
- },
- {
- "key": "choice 19",
- "name": "Take a moment to calm down.",
- "exit_node": "Biological Scan",
- "on_selection_effects": [
- {
- "effect_type": "Add",
- "quality": "Confusion",
- "value": {
- "value_type": "random",
- "low": -3,
- "high": -5
- }
- }
- ],
- "delay": 20,
- "delay_message": "Breathe."
- }
- ],
- "image": "default"
- }
- ]
- }
+ "adventure_name": "There's a tree in the middle of space.",
+ "version": 1,
+ "starting_node": "Tree Start",
+ "starting_qualities": {
+ "Confusion": 0
+ },
+ "required_site_traits": [
+ "in space"
+ ],
+ "loot_categories": [
+ "research"
+ ],
+ "scan_band_mods": {
+ "Exotic Radiation": 10
+ },
+ "deep_scan_description": "",
+ "triggers": [
+ {
+ "name": "Confusion Trigger",
+ "target_node": "What is wrong with this tree?",
+ "requirements": [
+ {
+ "quality": "Confusion",
+ "operator": ">",
+ "value": 30
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "name": "Tree Start",
+ "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.",
+ "choices": [
+ {
+ "key": "choice 0",
+ "name": "Ignore site.",
+ "exit_node": "FAIL",
+ "delay": 10,
+ "delay_message": "Leave this for the botanists to figure out."
+ },
+ {
+ "key": "choice 1",
+ "name": "Begin sensor scan.",
+ "exit_node": "Biological Scan",
+ "delay": 10,
+ "delay_message": "Lets get some data."
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,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"
+ },
+ {
+ "name": "Biological Scan",
+ "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.",
+ "choices": [
+ {
+ "key": "choice 2",
+ "name": "Check Sensor Integrity.",
+ "exit_node": "Its Not You...",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": 5
+ }
+ ],
+ "delay": 50,
+ "delay_message": "This can't be right."
+ },
+ {
+ "key": "choice 4",
+ "name": "Attempt to take sample.",
+ "exit_node": "Sample Taken",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": 3
+ }
+ ],
+ "delay": 40,
+ "delay_message": "Snip snip."
+ },
+ {
+ "key": "choice 6",
+ "name": "Examine Tree Roots.",
+ "exit_node": "Examine Roots",
+ "delay": 10
+ },
+ {
+ "key": "choice 9",
+ "name": "Sequence Sample Radiation with background noise.",
+ "exit_node": "Background Analysis",
+ "requirements": [
+ {
+ "quality": "Sample",
+ "operator": ">=",
+ "value": 1
+ }
+ ],
+ "delay": 0,
+ "delay_message": "This can't be real."
+ },
+ {
+ "key": "choice 40",
+ "name": "Leave.",
+ "exit_node": "FAIL",
+ "delay": 0
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,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"
+ },
+ {
+ "name": "Its Not You...",
+ "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.",
+ "choices": [
+ {
+ "key": "choice 3",
+ "name": "Restart biological scan.",
+ "exit_node": "Biological Scan",
+ "delay": 25,
+ "delay_message": "God damnit."
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7"
+ },
+ {
+ "name": "Sample Taken",
+ "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.",
+ "choices": [
+ {
+ "key": "choice 5",
+ "name": "Well that was... unexpected.",
+ "exit_node": "Biological Scan",
+ "delay": 0,
+ "delay_message": "Maybe something else might work better.",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Sample",
+ "value": 1
+ }
+ ]
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw=="
+ },
+ {
+ "name": "Examine Roots",
+ "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.",
+ "choices": [
+ {
+ "key": "choice 7",
+ "name": "That's fucking stupid.",
+ "exit_node": "Biological Scan",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": {
+ "value_type": "random",
+ "low": 6,
+ "high": 10
+ }
+ }
+ ],
+ "delay": 0,
+ "delay_message": "What the hell kind of tree even IS this?"
+ },
+ {
+ "key": "choice 8",
+ "name": "Obtain biological sample from roots.",
+ "exit_node": "Sample Taken",
+ "delay": 10,
+ "delay_message": "This is why we hire botanists on-site."
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,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"
+ },
+ {
+ "name": "Background Analysis",
+ "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.",
+ "choices": [
+ {
+ "key": "choice 10",
+ "name": "Smash your desk in frustration.",
+ "exit_node": "FAIL",
+ "delay": 50,
+ "delay_message": "No amount of pay is worth dealing with magical plant juju."
+ },
+ {
+ "key": "choice 11",
+ "name": "Check every known energy spectroscopy database.",
+ "exit_node": "Sample Match Found",
+ "delay": 900,
+ "delay_message": "You NEED an answer. You DESERVE an answer."
+ }
+ ],
+ "image": null,
+ "on_enter_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": {
+ "value_type": "random",
+ "low": 3,
+ "high": 5
+ }
+ }
+ ],
+ "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw=="
+ },
+ {
+ "name": "Sample Match Found",
+ "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?",
+ "choices": [
+ {
+ "key": "choice 12",
+ "name": "Something must be wrong with the drone.",
+ "exit_node": "Its Not You...",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": {
+ "value_type": "random",
+ "low": 6,
+ "high": 10
+ }
+ }
+ ],
+ "delay": 30,
+ "delay_message": "Lousy piece of junk must be scanning the station instead of the target."
+ },
+ {
+ "key": "choice 13",
+ "name": "Perhaps that sample was tainted. Collect a new sample.",
+ "exit_node": "Sample Taken",
+ "delay": 60,
+ "delay_message": "Lets try again, but carefully."
+ },
+ {
+ "key": "choice 14",
+ "name": "Remember the Christmas Party.",
+ "exit_node": "The Christmas Party",
+ "requirements": [
+ {
+ "quality": "Confusion",
+ "operator": "<=",
+ "value": 25
+ }
+ ],
+ "delay": 100,
+ "delay_message": "Wait a gosh darn fucking second."
+ }
+ ],
+ "image": null,
+ "on_enter_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": 10
+ }
+ ],
+ "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7"
+ },
+ {
+ "name": "The Christmas Party",
+ "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?",
+ "choices": [
+ {
+ "key": "choice 15",
+ "name": "Wait a minute, was that a god damn...",
+ "exit_node": "Rod.",
+ "delay": 100,
+ "delay_message": "Immovable Rod?"
+ }
+ ],
+ "image": null,
+ "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7"
+ },
+ {
+ "name": "Rod.",
+ "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.",
+ "choices": [
+ {
+ "key": "choice 16",
+ "name": "Snap a photo",
+ "exit_node": "Epilogue.",
+ "delay": 40,
+ "delay_message": "You could easily win an award for these findings!"
+ }
+ ],
+ "image": "default"
+ },
+ {
+ "name": "Epilogue.",
+ "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?",
+ "choices": [
+ {
+ "key": "choice 17",
+ "name": "God damnit.",
+ "exit_node": "WIN",
+ "delay": 10,
+ "delay_message": "Some things were just not meant for man to know."
+ }
+ ],
+ "image": "default",
+ "on_enter_effects": [
+ {
+ "effect_type": "Set",
+ "quality": "Confusion",
+ "value": 9999
+ }
+ ]
+ },
+ {
+ "name": "What is wrong with this tree?",
+ "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!",
+ "choices": [
+ {
+ "key": "choice 18",
+ "name": "The world can never know about this dumbass stupid plant.",
+ "exit_node": "FAIL_DEATH",
+ "delay": 60,
+ "delay_message": "Activating drone self-destruct."
+ },
+ {
+ "key": "choice 19",
+ "name": "Take a moment to calm down.",
+ "exit_node": "Biological Scan",
+ "on_selection_effects": [
+ {
+ "effect_type": "Add",
+ "quality": "Confusion",
+ "value": {
+ "value_type": "random",
+ "low": -3,
+ "high": -5
+ }
+ }
+ ],
+ "delay": 20,
+ "delay_message": "Breathe."
+ }
+ ],
+ "image": "default"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm
index 72cf09bd81b..5c73f5755df 100644
--- a/code/modules/explorer_drone/exodrone.dm
+++ b/code/modules/explorer_drone/exodrone.dm
@@ -5,7 +5,7 @@
// Fuel types and travel time per unit of distance on that fuel.
#define FUEL_BASIC "basic"
-#define BASIC_FUEL_TIME_COST 300
+#define BASIC_FUEL_TIME_COST 250
#define FUEL_ADVANCED "advanced"
#define ADVANCED_FUEL_TIME_COST 200
@@ -334,9 +334,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers)
drone_log("Sustained [amount] damage.")
/obj/item/exodrone/proc/drone_log(message)
- drone_log.Insert(1,message)
if(length(drone_log) > EXODRONE_LOG_SIZE)
- drone_log.Cut(EXODRONE_LOG_SIZE)
+ drone_log = list()
+ drone_log.Insert(1,message)
/obj/item/exodrone/proc/has_tool(tool_type)
return tools.Find(tool_type)
@@ -354,6 +354,11 @@ GLOBAL_LIST_EMPTY(exodrone_launchers)
. = ..()
GLOB.exodrone_launchers += src
+/obj/machinery/exodrone_launcher/examine(user)
+ . = ..()
+ if(fuel_canister)
+ . += span_notice("You can remove the [fuel_canister] with a prying tool.")
+
/obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, params)
if(istype(weapon, /obj/item/fuel_pellet))
if(fuel_canister)
@@ -374,7 +379,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers)
if(!fuel_canister)
return
- to_chat(user, span_notice("You remove the [fuel_canister] from the [src]."))
+ to_chat(user, span_notice("You remove [fuel_canister] from [src]."))
fuel_canister.forceMove(drop_location())
fuel_canister = null
update_icon()
diff --git a/code/modules/explorer_drone/scanner_array.dm b/code/modules/explorer_drone/scanner_array.dm
index e5b5f7a026c..7f019b0d43c 100644
--- a/code/modules/explorer_drone/scanner_array.dm
+++ b/code/modules/explorer_drone/scanner_array.dm
@@ -14,9 +14,9 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
#define MAX_SCAN_DISTANCE 10
-#define WIDE_SCAN_COST(BAND, SCAN_POWER) (((BAND*BAND)/(SCAN_POWER))*2*60*10)
-#define BASE_POINT_SCAN_TIME (5 MINUTES)
-#define BASE_DEEP_SCAN_TIME (5 MINUTES)
+#define WIDE_SCAN_COST(BAND, SCAN_POWER) (min(((BAND*BAND)/(SCAN_POWER))*2*60*10, 10 MINUTES))
+#define BASE_POINT_SCAN_TIME (2 MINUTES)
+#define BASE_DEEP_SCAN_TIME (3 MINUTES)
/// Represents scan in progress, only one globally for now, todo later split per z or allow partial dish swarm usage
/datum/exoscan
@@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
var/scan_time = 0
switch(scan_type)
if(EXOSCAN_WIDE)
- scan_power = length(GLOB.exoscanner_controller.tracked_dishes)
+ scan_power = GLOB.exoscanner_controller.calculate_scan_power()
scan_time = WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power)
if(EXOSCAN_POINT)
scan_power = GLOB.exoscanner_controller.get_scan_power(target)
@@ -76,7 +76,8 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
deltimer(scan_timer)
/obj/machinery/computer/exoscanner_control
- name = "Scanner Array Control Console"
+ name = "scanner array control console"
+ desc = "Controls scanner arrays to initiate scans for exodrones."
circuit = /obj/item/circuitboard/computer/exoscanner_console
/// If scan was interrupted show a popup until dismissed.
var/failed_popup = FALSE
@@ -105,7 +106,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
condition_descriptions += condition.description
.["scan_conditions"] = condition_descriptions
else
- .["scan_power"] = scan_power = length(GLOB.exoscanner_controller.tracked_dishes)
+ .["scan_power"] = scan_power = GLOB.exoscanner_controller.calculate_scan_power()
.["wide_scan_eta"] = scan_power > 0 ? WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power) : 0
.["possible_sites"] = build_exploration_site_ui_data()
.["scan_conditions"] = null
@@ -196,11 +197,35 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
icon = 'icons/obj/exploration.dmi'
icon_state = "scanner_off"
desc = "A sophisticated scanning array. Easily influenced by its environment."
+ circuit = /obj/item/circuitboard/machine/exoscanner
+ ///the scan power of this array to supply to scanner_controller
+ var/scan_power = 1
/obj/machinery/exoscanner/Initialize(mapload)
. = ..()
RegisterSignals(GLOB.exoscanner_controller,list(COMSIG_EXOSCAN_STARTED,COMSIG_EXOSCAN_FINISHED), PROC_REF(scan_change))
update_readiness()
+ RefreshParts()
+
+/obj/machinery/exoscanner/RefreshParts()
+ . = ..()
+ var/power = 1
+
+ for(var/datum/stock_part/scanning_module/scanning_module in component_parts)
+ power += (scanning_module.tier - 1) / 12
+ scan_power = power
+ GLOB.exoscanner_controller.update_scan_power()
+
+/obj/machinery/exoscanner/screwdriver_act(mob/user, obj/item/tool)
+ . = ..()
+ if(!.)
+ . = default_deconstruction_screwdriver(user, "scanner_open", "scanner_off", tool)
+ update_readiness()
+
+/obj/machinery/exoscanner/crowbar_act(mob/user, obj/item/tool)
+ ..()
+ if(default_deconstruction_crowbar(tool))
+ return TRUE
/obj/machinery/exoscanner/proc/scan_change()
SIGNAL_HANDLER
@@ -215,7 +240,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
GLOB.exoscanner_controller.deactivate_scanner(src)
/obj/machinery/exoscanner/proc/is_ready()
- return anchored && is_operational
+ return anchored && is_operational && !panel_open
/obj/machinery/exoscanner/proc/update_readiness()
if(is_ready())
@@ -302,7 +327,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions())
/datum/scanner_controller/proc/calculate_scan_power(conditions)
. = 0
for(var/obj/machinery/exoscanner/dish in tracked_dishes)
- var/effective_power = 1
+ var/effective_power = dish.scan_power
for(var/datum/scan_condition/condition in conditions)
effective_power *= condition.check_dish(dish)
if(!effective_power) //Don't bother continuing if it's zero
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 8e5dda5a7fa..c1fd02bf9f0 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -37,7 +37,7 @@
plant_icon_offset = 2
species = "replicapod"
plantname = "Replica Pod"
- product = /mob/living/carbon/human //verrry special -- Urist
+ product = null // the human mob is spawned in harvest()
lifespan = 50
endurance = 8
maturation = 10
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index a3804c9262f..04b0edf44bb 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -13,46 +13,33 @@
* * user - checks if we can remove the object from the inventory
* *
*/
-/proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user)
- var/t_amount = 0
+/proc/seedify(obj/item/object, t_max, obj/machinery/seed_extractor/extractor, mob/living/user)
+ //try to get the seed from this item
+ var/obj/item/seeds/seed = object.get_plant_seed()
+ if(isnull(seed))
+ return null
+
+ //generate a random multiplier if value is not specified
var/list/seeds = list()
if(t_max == -1)
if(extractor)
t_max = rand(1,4) * extractor.seed_multiplier
else
t_max = rand(1,4)
-
- var/seedloc = O.loc
+ //drop location for the newly generated seeds
+ var/seedloc = object.loc
if(extractor)
seedloc = extractor.loc
- if(istype(O, /obj/item/food/grown/))
- var/obj/item/food/grown/F = O
- if(F.seed)
- if(user && !user.temporarilyRemoveItemFromInventory(O)) //couldn't drop the item
- return
- while(t_amount < t_max)
- var/obj/item/seeds/t_prod = F.seed.Copy()
- seeds.Add(t_prod)
- t_prod.forceMove(seedloc)
- t_amount++
- qdel(O)
- return seeds
-
- else if(istype(O, /obj/item/grown))
- var/obj/item/grown/F = O
- if(F.seed)
- if(user && !user.temporarilyRemoveItemFromInventory(O))
- return
- while(t_amount < t_max)
- var/obj/item/seeds/t_prod = F.seed.Copy()
- t_prod.forceMove(seedloc)
- t_amount++
- qdel(O)
- return 1
-
- return 0
-
+ //multiply the seeds and delete the item
+ if(user && !user.temporarilyRemoveItemFromInventory(object)) //couldn't drop the item
+ return null
+ for(var/_ in 0 to t_max)
+ var/obj/item/seeds/t_prod = seed.Copy()
+ seeds.Add(t_prod)
+ t_prod.forceMove(seedloc)
+ qdel(object)
+ return seeds
/obj/machinery/seed_extractor
name = "seed extractor"
@@ -80,6 +67,7 @@
if(held_item?.get_plant_seed())
context[SCREENTIP_CONTEXT_LMB] = "Make seeds"
+ context[SCREENTIP_CONTEXT_RMB] = "Make & Store seeds"
return CONTEXTUAL_SCREENTIP_SET
if(istype(held_item, /obj/item/storage/bag/plants) && (locate(/obj/item/seeds) in held_item.contents))
@@ -135,7 +123,17 @@
return TRUE
- if(seedify(attacking_item, -1, src, user))
+ var/list/generated_seeds = seedify(attacking_item, -1, src, user)
+ if(!isnull(generated_seeds))
+ if(LAZYACCESS(params2list(params), RIGHT_CLICK))
+ //find all seeds lying on the turf and add them to the machine
+ for(var/obj/item/seeds/seed as anything in generated_seeds)
+ //machine is full
+ if(contents.len >= max_seeds)
+ to_chat(user, span_warning("[src] is full."))
+ break
+ //add seed to machine. second argument is null which means just force move into the machine
+ add_seed(seed)
to_chat(user, span_notice("You extract some seeds."))
return TRUE
@@ -176,23 +174,16 @@
* needed to go to the ui handler
*
* to_add - what seed are we adding?
- * taking_from - where are we taking the seed from? A mob, a bag, etc?
- * user - who is inserting the seed?
+ * taking_from - where are we taking the seed from? A mob, a bag, etc? If null its means its just laying on the turf so force move it in
**/
/obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/to_add, atom/taking_from)
- if(ismob(taking_from))
- var/mob/mob_loc = taking_from
- if(!mob_loc.transferItemToLoc(to_add, src))
- return FALSE
-
- else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE))
- return FALSE
-
var/seed_id = generate_seed_hash(to_add)
+ var/list/seed_data
+ var/has_seed_data // so we remember to add a seed obj weakref to piles[seed_id] at the end of the proc. That way if some reason we runtime in this proc it won't incorrectly add data to the list
if(piles[seed_id])
- piles[seed_id]["refs"] += WEAKREF(to_add)
+ has_seed_data = TRUE
else
- var/list/seed_data = list()
+ seed_data = list()
seed_data["icon"] = sanitize_css_class_name("[initial(to_add.icon)][initial(to_add.icon_state)]")
seed_data["name"] = capitalize(replacetext(to_add.name,"pack of ", ""));
seed_data["lifespan"] = to_add.lifespan
@@ -216,8 +207,8 @@
seed_data["mutatelist"] = list()
for(var/obj/item/seeds/mutant as anything in to_add.mutatelist)
seed_data["mutatelist"] += initial(mutant.plantname)
- var/obj/item/food/grown/product = new to_add.product
- if(product)
+ if(to_add.product)
+ var/obj/item/food/grown/product = new to_add.product
var/datum/reagent/product_distill_reagent = product.distill_reagent
seed_data["distill_reagent"] = initial(product_distill_reagent.name)
var/datum/reagent/product_juice_typepath = product.juice_typepath
@@ -225,8 +216,25 @@
seed_data["grind_results"] = list()
for(var/datum/reagent/reagent as anything in product.grind_results)
seed_data["grind_results"] += initial(reagent.name)
- qdel(product)
+ qdel(product)
+
+ if(!isnull(taking_from))
+ if(ismob(taking_from))
+ var/mob/mob_loc = taking_from
+ if(!mob_loc.transferItemToLoc(to_add, src))
+ return FALSE
+
+ else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE))
+ return FALSE
+ else
+ to_add.forceMove(src)
+
+ // do this at the end, in case any of the previous steps failed
+ if(has_seed_data)
+ piles[seed_id]["refs"] += WEAKREF(to_add)
+ else
piles[seed_id] = seed_data
+
return TRUE
/obj/machinery/seed_extractor/ui_state(mob/user)
diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm
index 897cddb1401..a4b082f5dd1 100644
--- a/code/modules/mob/living/basic/minebots/minebot_ai.dm
+++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm
@@ -60,6 +60,7 @@
/datum/ai_behavior/basic_ranged_attack/minebot
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
+ avoid_friendly_fire = TRUE
/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
var/mob/living/living_pawn = controller.pawn
diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
index 4cdaba09759..28cffa4ed8e 100644
--- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
+++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm
@@ -64,6 +64,8 @@
/datum/ai_behavior/basic_ranged_attack/hivebot
action_cooldown = 3 SECONDS
+ avoid_friendly_fire = TRUE
/datum/ai_behavior/basic_ranged_attack/hivebot_rapid
action_cooldown = 1.5 SECONDS
+ avoid_friendly_fire = TRUE
diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm
index 347219d0ef0..5bd957a7609 100644
--- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm
+++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm
@@ -32,7 +32,7 @@
/datum/ai_controller/basic_controller/hivebot/ranged/rapid
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
- /datum/ai_planning_subtree/basic_ranged_attack_subtree,
+ /datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/hive_communicate,
)
diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm
index 0b3645b3e0f..9e8f1b8df55 100644
--- a/code/modules/mob/living/basic/vermin/mouse.dm
+++ b/code/modules/mob/living/basic/vermin/mouse.dm
@@ -51,7 +51,7 @@
held_state = "mouse_[body_color]" // not handled by variety element
AddElement(/datum/element/animal_variety, "mouse", body_color, FALSE)
AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10)
- AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever
+ AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 4bd275b5df1..658c7e1ac7c 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -39,6 +39,21 @@
/// Maximum skillchip slots available. Do not reference this var directly and instead call get_max_skillchip_slots()
var/max_skillchip_slots = 5
+ /// Size modifier for the sprite
+ var/brain_size = 1
+
+/obj/item/organ/internal/brain/Initialize(mapload)
+ . = ..()
+ // Brain size logic
+ transform = transform.Scale(brain_size)
+
+/obj/item/organ/internal/brain/examine()
+ . = ..()
+ if(brain_size < 1)
+ . += span_notice("It is a bit on the smaller side...")
+ if(brain_size > 1)
+ . += span_notice("It is bigger than average...")
+
/obj/item/organ/internal/brain/Insert(mob/living/carbon/brain_owner, special = FALSE, drop_if_replaced = TRUE, no_id_transfer = FALSE)
. = ..()
if(!.)
@@ -406,6 +421,9 @@
. = ..()
organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
+/obj/item/organ/internal/brain/felinid //A bit smaller than average
+ brain_size = 0.8
+
////////////////////////////////////TRAUMAS////////////////////////////////////////
/obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 40e4bf095d5..b6fd8dcfacc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -372,7 +372,7 @@
var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced
// Loop through the clothing covering this bodypart and see if there's any thiccmaterials
if(!(injection_flags & INJECT_CHECK_PENETRATE_THICK))
- for(var/obj/item/clothing/iter_clothing in clothingonpart(the_part))
+ for(var/obj/item/clothing/iter_clothing in get_clothing_on_part(the_part))
if(iter_clothing.clothing_flags & THICKMATERIAL)
. = FALSE
break
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index bc951d49bb7..b02aaf03b17 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -6,21 +6,21 @@
if(isbodypart(def_zone))
var/obj/item/bodypart/bp = def_zone
if(bp)
- return checkarmor(def_zone, type)
+ return check_armor(def_zone, type)
var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone))
if(affecting)
- return checkarmor(affecting, type)
+ return check_armor(affecting, type)
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
- armorval += checkarmor(BP, type)
+ armorval += check_armor(BP, type)
organnum++
return (armorval/max(organnum, 1))
-/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, damage_type)
+/mob/living/carbon/human/proc/check_armor(obj/item/bodypart/def_zone, damage_type)
if(!damage_type)
return 0
var/protection = 100
@@ -32,7 +32,7 @@
return 100 - protection
///Get all the clothing on a specific body part
-/mob/living/carbon/human/proc/clothingonpart(obj/item/bodypart/def_zone)
+/mob/living/carbon/human/proc/get_clothing_on_part(obj/item/bodypart/def_zone)
var/list/covering_part = list()
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
for(var/bp in body_parts)
diff --git a/code/modules/mob/living/carbon/human/species_types/abominations.dm b/code/modules/mob/living/carbon/human/species_types/abominations.dm
index b7be74565ac..43ca71311c2 100644
--- a/code/modules/mob/living/carbon/human/species_types/abominations.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abominations.dm
@@ -3,6 +3,7 @@
name = "\improper Tall Boy"
id = SPECIES_TALLBOY
examine_limb_id = SPECIES_HUMAN
+ changesource_flags = MIRROR_BADMIN | WABBAJACK
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right,
@@ -13,8 +14,10 @@
)
/datum/species/monkey/human_legged
+ name = "human-legged monkey"
id = SPECIES_MONKEY_HUMAN_LEGGED
examine_limb_id = SPECIES_MONKEY
+ changesource_flags = MIRROR_BADMIN | WABBAJACK
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey,
@@ -25,8 +28,10 @@
)
/datum/species/monkey/monkey_freak
+ name = "human-armed monkey"
id = SPECIES_MONKEY_FREAK
examine_limb_id = SPECIES_MONKEY
+ changesource_flags = MIRROR_BADMIN | WABBAJACK
bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left,
BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right,
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index 5f59efc6c3a..c64ae3972e5 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -4,6 +4,7 @@
id = SPECIES_FELINE
examine_limb_id = SPECIES_HUMAN
mutant_bodyparts = list("ears" = "Cat", "wings" = "None")
+ mutantbrain = /obj/item/organ/internal/brain/felinid
mutanttongue = /obj/item/organ/internal/tongue/cat
/* SKYRAT EDIT REMOVAL - CUSTOMIZATION
mutantears = /obj/item/organ/internal/ears/cat
@@ -23,8 +24,6 @@
family_heirlooms = list(/obj/item/toy/cattoy)
/// When false, this is a felinid created by mass-purrbation
var/original_felinid = TRUE
- /// Brain size for scaling
- var/brain_size = 0.8
// Prevents felinids from taking toxin damage from carpotoxin
/datum/species/human/felinid/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired)
@@ -47,16 +46,6 @@
ears.Insert(target_human, drop_if_replaced = FALSE)
else
mutantears = /obj/item/organ/internal/ears
- var/obj/item/organ/internal/brain/current_brain = target_human.get_organ_by_type(/obj/item/organ/internal/brain)
- if(current_brain)
- current_brain.transform = current_brain.transform.Scale(brain_size) //smaller brain
- return ..()
-
-/datum/species/human/felinid/on_species_loss(mob/living/carbon/former_feline, datum/species/old_species, pref_load)
- if(iscarbon(former_feline))
- var/obj/item/organ/internal/brain/current_brain = former_feline.get_organ_by_type(/obj/item/organ/internal/brain)
- if(current_brain)
- current_brain.transform = current_brain.transform.Scale(1 / brain_size) //bigger brain
return ..()
/datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob)
diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm
index 52f0d65eac1..5cdeca8cb6f 100644
--- a/code/modules/mob/living/living_say.dm
+++ b/code/modules/mob/living/living_say.dm
@@ -394,13 +394,29 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list(
tts_message_to_use = message_raw
var/list/filter = list()
+ var/list/special_filter = list()
+ var/voice_to_use = voice
+ var/use_radio = FALSE
if(length(voice_filter) > 0)
filter += voice_filter
if(length(tts_filter) > 0)
filter += tts_filter.Join(",")
+ if(ishuman(src))
+ var/mob/living/carbon/human/human_speaker = src
+ if(human_speaker.wear_mask)
+ var/obj/item/clothing/mask/worn_mask = human_speaker.wear_mask
+ if(worn_mask.voice_override)
+ voice_to_use = worn_mask.voice_override
+ if(worn_mask.voice_filter)
+ filter += worn_mask.voice_filter
+ use_radio = worn_mask.use_radio_beeps_tts
+ if(use_radio)
+ special_filter += TTS_FILTER_RADIO
+ if(issilicon(src))
+ special_filter += TTS_FILTER_SILICON
- INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = message_range, pitch = pitch, silicon = tts_silicon_voice_effect)
+ INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice_to_use, filter.Join(","), listened, message_range = message_range, pitch = pitch, special_filters = special_filter.Join("|"))
var/image/say_popup = image('icons/mob/effects/talk.dmi', src, "[bubble_type][talk_icon_state]", FLY_LAYER)
SET_PLANE_EXPLICIT(say_popup, ABOVE_GAME_PLANE, src)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index b392417aab2..2d17820af0b 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -32,7 +32,7 @@
lighting_cutoff_red = 30
lighting_cutoff_green = 15
lighting_cutoff_blue = 50
- unique_name = 1
+ unique_name = TRUE
gold_core_spawnable = NO_SPAWN
death_sound = 'sound/voice/hiss6.ogg'
death_message = "lets out a waning guttural screech, green blood bubbling from its maw..."
@@ -91,7 +91,7 @@
projectiletype = /obj/projectile/neurotoxin/damaging
projectilesound = 'sound/weapons/pierce.ogg'
status_flags = 0
- unique_name = 0
+ unique_name = FALSE
var/sterile = 1
var/plants_off = 0
var/egg_cooldown = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm
index 124b797d0da..23f7590dc8e 100644
--- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm
@@ -28,7 +28,7 @@
maxbodytemp = INFINITY
faction = list(FACTION_CULT)
pressure_resistance = 100
- unique_name = 1
+ unique_name = TRUE
AIStatus = AI_OFF //normal constructs don't have AI
loot = list(/obj/item/ectoplasm)
del_on_death = TRUE
diff --git a/code/modules/mob_spawn/ghost_roles/drone_roles.dm b/code/modules/mob_spawn/ghost_roles/drone_roles.dm
new file mode 100644
index 00000000000..b8a31a16b13
--- /dev/null
+++ b/code/modules/mob_spawn/ghost_roles/drone_roles.dm
@@ -0,0 +1,6 @@
+/obj/effect/mob_spawn/ghost_role/drone/name_mob(mob/living/spawned_mob, forced_name)
+ if(!forced_name)
+ var/designation = pick(GLOB.posibrain_names)
+ forced_name = "Drone ([designation]-[rand(100, 999)])"
+
+ return ..()
diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm
index 960702d608c..9b5617364c0 100644
--- a/code/modules/modular_computers/file_system/programs/records.dm
+++ b/code/modules/modular_computers/file_system/programs/records.dm
@@ -45,6 +45,7 @@
current_record["rank"] = person.rank
current_record["species"] = person.species
current_record["wanted"] = person.wanted_status
+ current_record["voice"] = person.voice
all_records += list(current_record)
if("medical")
diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm
index 1b50dbc8fd1..94c503614a2 100644
--- a/code/modules/surgery/bodyparts/wounds.dm
+++ b/code/modules/surgery/bodyparts/wounds.dm
@@ -85,7 +85,7 @@
// quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow
if(ishuman(owner))
var/mob/living/carbon/human/human_wearer = owner
- var/list/clothing = human_wearer.clothingonpart(src)
+ var/list/clothing = human_wearer.get_clothing_on_part(src)
for(var/obj/item/clothing/clothes_check as anything in clothing)
// unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
if(clothes_check.get_armor_rating(WOUND))
@@ -242,7 +242,7 @@
if(owner && ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
- var/list/clothing = human_owner.clothingonpart(src)
+ var/list/clothing = human_owner.get_clothing_on_part(src)
for(var/obj/item/clothing/clothes as anything in clothing)
// unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
armor_ablation += clothes.get_armor_rating(WOUND)
diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm
index 54eb937e0ae..fd1af3d5f93 100644
--- a/code/modules/surgery/organs/external/_external_organ.dm
+++ b/code/modules/surgery/organs/external/_external_organ.dm
@@ -82,14 +82,13 @@
return
if(bodypart_overlay.imprint_on_next_insertion) //We only want this set *once*
-
- // SKYRAT EDIT - Customization - ORIGINAL: bodypart_overlay.set_appearance_from_name(receiver.dna.features[bodypart_overlay.feature_key])
- if(receiver.dna.features[bodypart_overlay.feature_key])
- bodypart_overlay.set_appearance_from_name(receiver.dna.features[bodypart_overlay.feature_key])
-
+ var/feature_name = receiver.dna.features[bodypart_overlay.feature_key]
+ if (isnull(feature_name))
+ bodypart_overlay.set_appearance_from_dna(receiver.dna) // SKYRAT EDIT CHANGE - ORIGINAL: feature_name = receiver.dna.species.external_organs[type]
+ // SKYRAT EDIT CHANGE START - Puts the following line in an else block
else
- bodypart_overlay.set_appearance_from_dna(receiver.dna)
- // SKYRAT EDIT END
+ bodypart_overlay.set_appearance_from_name(feature_name)
+ // SKYRAT EDIT CHANGE END
bodypart_overlay.imprint_on_next_insertion = FALSE
ownerlimb = limb
diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm
index e767989fc05..c715d88c890 100644
--- a/code/modules/surgery/organs/internal/tongue/_tongue.dm
+++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm
@@ -184,7 +184,7 @@
languages_native = list(/datum/language/draconic, /datum/language/ashtongue) //SKYRAT EDIT: Ashtongue for Ashwalkers
liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS
disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS
-
+ voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"}
/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args)
var/static/regex/lizard_hiss = new("s+", "g")
var/static/regex/lizard_hiSS = new("S+", "g")
@@ -493,7 +493,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
say_mod = "hisses"
taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED
modifies_speech = TRUE // not really, they just hiss
-
+ voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.8,aresample=%SAMPLE_RATE%,atempo=1/0.8,aformat=channel_layouts=mono [p0]; [out2] asetrate=%SAMPLE_RATE%*1.2,aresample=%SAMPLE_RATE%,atempo=1/1.2,aformat=channel_layouts=mono[p2]; [p0][0][p2] amix=inputs=3"}
// Aliens can only speak alien and a few other languages.
/obj/item/organ/internal/tongue/alien/get_possible_languages()
return list(
@@ -601,6 +601,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list())
toxic_foodtypes = NONE //no food is particularly toxic to ethereals
attack_verb_continuous = list("shocks", "jolts", "zaps")
attack_verb_simple = list("shock", "jolt", "zap")
+ voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.99,aresample=%SAMPLE_RATE%,volume=0.3 [p0]; [p0][out2] amix=inputs=2"}
// Ethereal tongues can speak all default + voltaic
/obj/item/organ/internal/tongue/ethereal/get_possible_languages()
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 9d3a298812e..4258dc5a304 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -11,20 +11,24 @@
bare_wound_bonus = 15
sharpness = SHARP_EDGED
-/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, proximity_flag)
+/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/living/user, proximity_flag)
. = ..()
if(!proximity_flag)
return
else if(isliving(target))
if(ishuman(target))
- try_to_zombie_infect(target)
+ try_to_zombie_infect(target, user, user.zone_selected)
else
. |= AFTERATTACK_PROCESSED_ITEM
check_feast(target, user)
-/proc/try_to_zombie_infect(mob/living/carbon/human/target)
+/proc/try_to_zombie_infect(mob/living/carbon/human/target, mob/living/user, def_zone = BODY_ZONE_CHEST)
CHECK_DNA_AND_SPECIES(target)
+ // Can't zombify with no head
+ if(!target.get_bodypart(BODY_ZONE_HEAD))
+ return
+
if(HAS_TRAIT(target, TRAIT_NO_ZOMBIFY))
// cannot infect any TRAIT_NO_ZOMBIFY human
return
@@ -33,11 +37,31 @@
if(HAS_TRAIT(target, TRAIT_VIRUS_RESISTANCE) && prob(75))
return
+ var/obj/item/bodypart/actual_limb = target.get_bodypart(def_zone)
+
+ // What you hitting bro?
+ if(!actual_limb)
+ return
+
+ var/limb_damage = actual_limb.get_damage()
+ var/limb_armor = max(0, target.getarmor(actual_limb, BIO) - 25)
+
+ // This is a pretty jank way to do this, but in short:
+ // if they have thick material on that bodypart it will always need at least 25 previous limb damage to trigger an infection.
+ // and if their bio armor isn't thick it's a bit weaker.
+ for(var/obj/item/clothing/iter_clothing in target.get_clothing_on_part(actual_limb))
+ if(iter_clothing.clothing_flags & THICKMATERIAL)
+ limb_armor += 25
+
+ if(limb_armor > limb_damage)
+ return
+
var/obj/item/organ/internal/zombie_infection/infection
infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE)
if(!infection)
infection = new()
infection.Insert(target)
+ to_chat(user, span_alien("You see [target] twitch for a moment as [target.p_their()] head is covered in \a [infection] - [target.p_Theyve()] been infected."))
/obj/item/mutant_hand/zombie/suicide_act(mob/living/user)
user.visible_message(span_suicide("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!"))
diff --git a/html/changelogs/AutoChangeLog-pr-23787.yml b/html/changelogs/AutoChangeLog-pr-23787.yml
deleted file mode 100644
index e82c2d9ed56..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23787.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "sqnztb"
-delete-after: True
-changes:
- - rscadd: "New medicine to clear up scars, made from synthflesh, ethanol, and miner's salve. Be sure to apply it via patches!"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23887.yml b/html/changelogs/AutoChangeLog-pr-23887.yml
deleted file mode 100644
index ca2b73d59d5..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23887.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - qol: "NT CIMs shows how much power the supermatter is releasing."
- - qol: "NT CIMs internal energy will adjust its prefix."
- - qol: "Energy displays (such as multitooling grid) will use the full range of SI prefixes available, up to the peta prefix if you somehow managed to reach that."
- - rscdel: "Removes the per cubic centimeter part of internal energy."
- - bugfix: "Fix unnecessary delta time scaling on inactive supermatters."
- - bugfix: "Fix high energy zaps not scaling with delta time."
- - bugfix: "Fixes grounding rods lying about potential power you can generate."
- - code_imp: "Convert supermatter_zap() and tesla_zap() zap_str argument unit to be in joules, and scales everything that uses that argument."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23889.yml b/html/changelogs/AutoChangeLog-pr-23889.yml
deleted file mode 100644
index 8349772b109..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23889.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - admin: "First time user connections are now logged"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23892.yml b/html/changelogs/AutoChangeLog-pr-23892.yml
deleted file mode 100644
index 9f953d1e0dc..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23892.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "LT3"
-delete-after: True
-changes:
- - admin: "Successful restart votes will now restart on the current map"
- - code_imp: "End round and persistence data will be saved before executing successful restart vote"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23893.yml b/html/changelogs/AutoChangeLog-pr-23893.yml
deleted file mode 100644
index fa3c43a0ff7..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23893.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - image: "the security records suspected status is now teal instead of orange"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23894.yml b/html/changelogs/AutoChangeLog-pr-23894.yml
deleted file mode 100644
index 6cd9fb8af03..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23894.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Centcom now rejects contraband that somehow makes it way onto the cargo shuttle mid-transit and returns it."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23895.yml b/html/changelogs/AutoChangeLog-pr-23895.yml
deleted file mode 100644
index 18d21bd4a4f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23895.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Rhials"
-delete-after: True
-changes:
- - bugfix: "\"Spooky\" meteors will now properly spawn during halloween."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23896.yml b/html/changelogs/AutoChangeLog-pr-23896.yml
deleted file mode 100644
index 7fd773f39e1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23896.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - image: "adds a frog holoform for pAIs"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23897.yml b/html/changelogs/AutoChangeLog-pr-23897.yml
deleted file mode 100644
index 9b2249526b8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23897.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LT3"
-delete-after: True
-changes:
- - spellcheck: "Improved wording in greyscale JSON error message"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23900.yml b/html/changelogs/AutoChangeLog-pr-23900.yml
deleted file mode 100644
index 8f18d7f885a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23900.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Intellicards in computers are no longer deleted when the computer is destroyed."
- - bugfix: "Modular consoles can now be deconstructed by right clicking with a wrench."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23903.yml b/html/changelogs/AutoChangeLog-pr-23903.yml
deleted file mode 100644
index 1727ab4e93f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23903.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - rscadd: "Adds an advanced plastic surgery procedure, allowing you to imitate people in pictures. Simply hold a picture in your offhand of the person you wish to imitate as while conducting the surgery! Remember, it's not foolproof, it only changes your name and voice!"
- - rscadd: "You can obtain the disk containing the afromentioned surgery. as a role-restricted item to doctors and roboticists for 1TC, as a rare maint loot and BEPIS technode reward"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23904.yml b/html/changelogs/AutoChangeLog-pr-23904.yml
deleted file mode 100644
index da793c3ebb6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23904.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Metalgen can no longer be used to transmute indestructible turfs."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23905.yml b/html/changelogs/AutoChangeLog-pr-23905.yml
deleted file mode 100644
index 7ae72c0d082..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23905.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "posibrains can be inserted again"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23906.yml b/html/changelogs/AutoChangeLog-pr-23906.yml
new file mode 100644
index 00000000000..772d985ddd8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23906.yml
@@ -0,0 +1,5 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Selecting \"Monkey\" on a magic mirror will now once again turn you into a Monkey rather than a disgusting freak of nature."
+ - bugfix: "Tall Boys have once again been barred from joining the Wizard Federation."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23907.yml b/html/changelogs/AutoChangeLog-pr-23907.yml
deleted file mode 100644
index 2bbe4c718ff..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23907.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "cigarettes no longer smoke themselves from inside your pockets or on your hands."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23908.yml b/html/changelogs/AutoChangeLog-pr-23908.yml
deleted file mode 100644
index 4f0b4402b0e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23908.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "you can no longer push watchers (and any other lavaland basic mob) around by running into them"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23910.yml b/html/changelogs/AutoChangeLog-pr-23910.yml
deleted file mode 100644
index b40011ee2c2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23910.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "The custom error message for when there is only one map to vote for should pop up in all cases rather than just a select few."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23911.yml b/html/changelogs/AutoChangeLog-pr-23911.yml
deleted file mode 100644
index d387487e5b2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-23911.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Stun immune people should no longer have issues with gripper gloves and other tackle gloves."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23917.yml b/html/changelogs/AutoChangeLog-pr-23917.yml
new file mode 100644
index 00000000000..84125eca8ed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23917.yml
@@ -0,0 +1,5 @@
+author: "tattle"
+delete-after: True
+changes:
+ - qol: "Basic animals now make sounds for audible emotes"
+ - sound: "Added new sound effects for chicks, chickens, crabs, and insects"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23936.yml b/html/changelogs/AutoChangeLog-pr-23936.yml
new file mode 100644
index 00000000000..b265a2cf070
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23936.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed job configs not being loaded properly."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23940.yml b/html/changelogs/AutoChangeLog-pr-23940.yml
new file mode 100644
index 00000000000..19411fde6f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23940.yml
@@ -0,0 +1,4 @@
+author: "Vekter"
+delete-after: True
+changes:
+ - rscadd: "Added a holodeck to Birdshot Station. It can be reached via the Crew Facilities hallway."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23941.yml b/html/changelogs/AutoChangeLog-pr-23941.yml
new file mode 100644
index 00000000000..88dc26d7d6e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23941.yml
@@ -0,0 +1,6 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - rscdel: "removes surgical duffelbags"
+ - bugfix: "the surgery supply order now comes with a surgery tray"
+ - bugfix: "(skyrat) Hospital gowns will now spawn in surgery trays like they used to in the surgery duffelbags"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23942.yml b/html/changelogs/AutoChangeLog-pr-23942.yml
new file mode 100644
index 00000000000..ef1193e0ee7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23942.yml
@@ -0,0 +1,7 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - qol: "Gas masks now muffle your voice with TTS."
+ - qol: "Security Hailer masks now disguise your voice to protect your right to brutalize greytiders."
+ - qol: "Lizards, Ethereals, and Xenomorphs now have a vocal effect."
+ - qol: "Security Records now show someone's voice name."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23944.yml b/html/changelogs/AutoChangeLog-pr-23944.yml
new file mode 100644
index 00000000000..ac638cd598c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23944.yml
@@ -0,0 +1,4 @@
+author: "Tattle"
+delete-after: True
+changes:
+ - qol: "drones now have individual names, instead of just \"drone\""
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23945.yml b/html/changelogs/AutoChangeLog-pr-23945.yml
new file mode 100644
index 00000000000..44fb93a1aab
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23945.yml
@@ -0,0 +1,6 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "You can no longer break the game by AI rolling in a card or APC"
+ - qol: "AI Roll now doesnt require you to click the exact turf to move you"
+ - qol: "AI roll cooldown and roll time is now a variable, making it possible for AIs to become terrifying catamari damacy balls"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23946.yml b/html/changelogs/AutoChangeLog-pr-23946.yml
new file mode 100644
index 00000000000..ca5b631f216
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23946.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "The flight potion wings will no longer fail to work on lavaland/icemoon on rare occasions."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23947.yml b/html/changelogs/AutoChangeLog-pr-23947.yml
new file mode 100644
index 00000000000..58f4e3bc782
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23947.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixes full advanced surgery trays spawning with 'nothing'"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23948.yml b/html/changelogs/AutoChangeLog-pr-23948.yml
new file mode 100644
index 00000000000..952322c4f48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23948.yml
@@ -0,0 +1,8 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed zombies being able to infect headless corpses (Including former zombies)"
+ - bugfix: "Fixed bio armor being totally useless against zombies. Now it checks how hurt your limb is: If it's more than the bio armor value, you get infected. THICKMATERIAL clothing guarantees at least 25 damage required to infect you, non-thick clothing reduces effective defence by 25. In practice this means people with MODsuits, biosuits will resist infection unless they're pummeled into crit, and wearing a firesuit will save you from the first few slashes."
+ - bugfix: "Fixed the bomb hood armor not having the same bio armor value as bomb armor."
+ - qol: "Added a message to the zed when they succesfully infect someone."
+ - code_imp: "Turned some proc names into snake_case rather than, uh, nospacecase."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23949.yml b/html/changelogs/AutoChangeLog-pr-23949.yml
new file mode 100644
index 00000000000..1d7a5574c83
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23949.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - spellcheck: "Tweaks the message that players get when not being able to qualify for roundstart antag to be more accurate as to what's happening."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23950.yml b/html/changelogs/AutoChangeLog-pr-23950.yml
new file mode 100644
index 00000000000..b4ec81b4207
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23950.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "fixed geysers spawning on turfs with plants"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23952.yml b/html/changelogs/AutoChangeLog-pr-23952.yml
new file mode 100644
index 00000000000..0e3a4edd7b7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23952.yml
@@ -0,0 +1,11 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "you can now deconstruct exodrone scanner arrays"
+ - bugfix: "the tree in space exodrone adventure no longer softlocks you"
+ - qol: "the exodrone launchers now tell you on examine how to remove their fuel canister if you somehow needed to do that"
+ - balance: "exodrone wide scans are now capped at 10 minutes"
+ - balance: "exodrone travel times are 18% faster"
+ - balance: "you can now upgrade scanner arrays for faster wide scan"
+ - balance: "exodrone point scan and deep scan are faster"
+ - spellcheck: "fixes several typos related to exodrones and gives scanner control console a description"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-23954.yml b/html/changelogs/AutoChangeLog-pr-23954.yml
new file mode 100644
index 00000000000..4a5081737a9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-23954.yml
@@ -0,0 +1,7 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Seeds will no longer be removed from existence after receiving the \"You can't seem to add [seed type] to the seed extractor\" message"
+ - bugfix: "Some seeds that were previously not able to be added to the seed extractor may now be added (starthistle for example)"
+ - bugfix: "fixes replica pod seeds spawning humans in nullspace"
+ - qol: "right clicking the seed extractor with a plant/food stores the extracted seeds in the machine."
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml
index e2e709c4b7c..fdba6bf3a13 100644
--- a/html/changelogs/archive/2023-09.yml
+++ b/html/changelogs/archive/2023-09.yml
@@ -1005,3 +1005,61 @@
instead of a random one.
honkpocket:
- rscdel: Removed wall-mushroom outbreak event
+2023-09-26:
+ LT3:
+ - spellcheck: Improved wording in greyscale JSON error message
+ - admin: Successful restart votes will now restart on the current map
+ - code_imp: End round and persistence data will be saved before executing successful
+ restart vote
+ Rhials:
+ - bugfix: '"Spooky" meteors will now properly spawn during halloween.'
+ SkyratBot:
+ - image: the security records suspected status is now teal instead of orange
+ - bugfix: Intellicards in computers are no longer deleted when the computer is destroyed.
+ - bugfix: Modular consoles can now be deconstructed by right clicking with a wrench.
+ - bugfix: cigarettes no longer smoke themselves from inside your pockets or on your
+ hands.
+ - admin: First time user connections are now logged
+ - qol: NT CIMs shows how much power the supermatter is releasing.
+ - qol: NT CIMs internal energy will adjust its prefix.
+ - qol: Energy displays (such as multitooling grid) will use the full range of SI
+ prefixes available, up to the peta prefix if you somehow managed to reach that.
+ - rscdel: Removes the per cubic centimeter part of internal energy.
+ - bugfix: Fix unnecessary delta time scaling on inactive supermatters.
+ - bugfix: Fix high energy zaps not scaling with delta time.
+ - bugfix: Fixes grounding rods lying about potential power you can generate.
+ - code_imp: Convert supermatter_zap() and tesla_zap() zap_str argument unit to be
+ in joules, and scales everything that uses that argument.
+ - rscadd: Adds an advanced plastic surgery procedure, allowing you to imitate people
+ in pictures. Simply hold a picture in your offhand of the person you wish to
+ imitate as while conducting the surgery! Remember, it's not foolproof, it only
+ changes your name and voice!
+ - rscadd: You can obtain the disk containing the afromentioned surgery. as a role-restricted
+ item to doctors and roboticists for 1TC, as a rare maint loot and BEPIS technode
+ reward
+ - bugfix: Centcom now rejects contraband that somehow makes it way onto the cargo
+ shuttle mid-transit and returns it.
+ - bugfix: you can no longer push watchers (and any other lavaland basic mob) around
+ by running into them
+ - bugfix: posibrains can be inserted again
+ - bugfix: Metalgen can no longer be used to transmute indestructible turfs.
+ - image: adds a frog holoform for pAIs
+ - bugfix: The custom error message for when there is only one map to vote for should
+ pop up in all cases rather than just a select few.
+ - bugfix: Stun immune people should no longer have issues with gripper gloves and
+ other tackle gloves.
+ sqnztb:
+ - rscadd: New medicine to clear up scars, made from synthflesh, ethanol, and miner's
+ salve. Be sure to apply it via patches!
+2023-09-27:
+ SkyratBot:
+ - rscadd: added ranged attack friendly fire checks for basic mobs. minebots and
+ hivebots will now try to avoid shooting their friends
+ - bugfix: fixed Strong Stone ruin generation
+ - rscadd: Added a candle box crate for all your candle needs!
+ - bugfix: '[Tramstation] Mass Driver in chapel now has tiny fan so you don''t space
+ yourself.'
+ jjpark-kb:
+ - bugfix: actually fixed the ash revival ritual for basic mobs
+ - bugfix: basic animals now will have their health affected positively and negatively
+ by medicine and toxins respectively.
diff --git a/icons/obj/exploration.dmi b/icons/obj/exploration.dmi
index 2f9d004bee2..b7224d2df84 100644
Binary files a/icons/obj/exploration.dmi and b/icons/obj/exploration.dmi differ
diff --git a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
index e34a414cf8e..92a05c7e3b1 100644
--- a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
+++ b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
@@ -373,5 +373,5 @@
find_animal.faction = list(FACTION_ASHWALKER)
- find_animal.revive()
+ find_animal.revive(HEAL_ALL)
return TRUE
diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm
index 4bf4c720d0f..a17bd093249 100644
--- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm
+++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm
@@ -121,7 +121,7 @@
cost = PAYCHECK_COMMAND
/datum/armament_entry/company_import/deforest/equipment/surgical_tools
- item_type = /obj/item/storage/backpack/duffelbag/med/surgery
+ item_type = /obj/item/surgery_tray/full
cost = PAYCHECK_COMMAND
/datum/armament_entry/company_import/deforest/equipment/advanced_health_analyer
diff --git a/modular_skyrat/modules/customization/game/objects/items/plushes.dm b/modular_skyrat/modules/customization/game/objects/items/plushes.dm
index d718d409b49..1d2992cf8ef 100644
--- a/modular_skyrat/modules/customization/game/objects/items/plushes.dm
+++ b/modular_skyrat/modules/customization/game/objects/items/plushes.dm
@@ -467,7 +467,7 @@
gender = FEMALE
attack_verb_continuous = list("pats", "hugs", "scolds", "pets")
attack_verb_simple = list("pat", "hug", "scold", "pet")
- squeak_override = list('sound/effects/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,)
+ squeak_override = list('sound/creatures/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,)
responses = list("Rabbits are prey animals and are therefore constantly aware of their surroundings.", "Things to jump up on (they like to be in high places)", "become a rabbit today!", "Be cunning and full of tricks...", "Subscription confirmed! Thank you for choosing RABBITFACTS +TM+!", "Holland Lops are a breed of rabbit originating in the Netherlands.", "Rabbits may need medication to keep themselves healthy, and that's ok! Make sure to take yours too!", "rabbits really liked this product", "A healthy rabbit diet includes fresh vegetables.", "Rabbits do not hibernate. Their schedules are much too busy.", "the rate of bunnies is measured by RPB (rabbits per bunny)", )
/obj/item/toy/plush/skyrat/chunko/andrew
@@ -477,7 +477,7 @@
gender = MALE
attack_verb_continuous = list("pats", "hugs", "scolds", "pets")
attack_verb_simple = list("pat", "hug", "scold", "pet")
- squeak_override = list('sound/effects/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,)
+ squeak_override = list('sound/creatures/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,)
// All lowercase messages are intentional
responses = list("bunny who you best pray you never encounter, lest you suffer a fate worse than death.", "this is a bunny!", "I wonder what would happen if you took bunnies, and combined them with rabbits, and merged their properties and characteristics. It's something to think about.", "If you're cold, they're cold. Give them the deed to your house.", "bunny that goes yeah! woo! yeah! woo! yeah! woo! yeah! woo! yeah! woo! yeah!", "the bunnies are beyond my comprehension", "it's a bunny thing, you wouldn't get it", "this bunny has an unfathomable power level", "%pull the string and I'll bink at you...I'm your bunny.", "Bunny (1954)", "the bunny that pulls the strings....", )
diff --git a/modular_skyrat/modules/emotes/code/emotes.dm b/modular_skyrat/modules/emotes/code/emotes.dm
index 85680557334..73b32155d05 100644
--- a/modular_skyrat/modules/emotes/code/emotes.dm
+++ b/modular_skyrat/modules/emotes/code/emotes.dm
@@ -143,7 +143,7 @@
message = "squeaks!"
emote_type = EMOTE_AUDIBLE
vary = TRUE
- sound = 'sound/effects/mousesqueek.ogg'
+ sound = 'sound/creatures/mousesqueek.ogg'
/datum/emote/living/merp
key = "merp"
diff --git a/modular_skyrat/modules/faction/code/outfit.dm b/modular_skyrat/modules/faction/code/outfit.dm
index 4728353e4ec..a808f58c05f 100644
--- a/modular_skyrat/modules/faction/code/outfit.dm
+++ b/modular_skyrat/modules/faction/code/outfit.dm
@@ -43,7 +43,7 @@
back = /obj/item/storage/backpack
id = /obj/item/card/id/faction_crew
l_pocket = /obj/item/melee/energy/sword
- l_hand = /obj/item/storage/backpack/duffelbag/med/surgery
+ l_hand = /obj/item/surgery_tray/full
backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/storage/medkit/tactical=1,/obj/item/storage/medkit/regular=1,/obj/item/storage/medkit/toxin=1, /obj/item/ammo_box/magazine/m45=2, /obj/item/gun/ballistic/automatic/pistol/m1911=1,/obj/item/healthanalyzer=1,/obj/item/stack/spacecash/c1000=1)
/datum/outfit/faction_tech
diff --git a/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm b/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm
index cee0e7efab5..796dbef0daf 100644
--- a/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm
+++ b/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm
@@ -15,14 +15,57 @@
/mob/living/simple_animal/Life(seconds_per_tick, times_fired)
. = ..()
- if(reagent_health && reagents)
- for(var/datum/reagent/reagents_within as anything in reagents.reagent_list)
- if(istype(reagents_within, /datum/reagent/toxin))
- var/datum/reagent/toxin/toxin_reagent = reagents_within
- var/toxin_damage = round(toxin_reagent.toxpwr)
- adjustHealth(toxin_damage + 1)
- reagents.remove_reagent(toxin_reagent.type, 0.5)
- continue
- if(istype(reagents_within, /datum/reagent/medicine))
- adjustHealth(-1)
- reagents.remove_reagent(reagents_within.type, 0.5)
+
+ if(!reagent_health)
+ return
+
+ if(!reagents)
+ return
+
+ if(stat == DEAD)
+ return
+
+ for(var/datum/reagent/reagents_within as anything in reagents.reagent_list)
+ if(istype(reagents_within, /datum/reagent/toxin))
+ var/datum/reagent/toxin/toxin_reagent = reagents_within
+ var/toxin_damage = round(toxin_reagent.toxpwr)
+ adjustHealth(toxin_damage + 1)
+ reagents.remove_reagent(toxin_reagent.type, 0.5)
+ continue
+
+ if(istype(reagents_within, /datum/reagent/medicine))
+ adjustHealth(-1)
+ reagents.remove_reagent(reagents_within.type, 0.5)
+
+/mob/living/basic
+ /// whether the simple animal can be healed/damaged through reagents
+ var/reagent_health = TRUE
+
+/mob/living/basic/Initialize(mapload)
+ . = ..()
+ if(reagent_health)
+ create_reagents(1000, REAGENT_HOLDER_ALIVE)
+
+/mob/living/basic/Life(seconds_per_tick, times_fired)
+ . = ..()
+
+ if(!reagent_health)
+ return
+
+ if(!reagents)
+ return
+
+ if(stat == DEAD)
+ return
+
+ for(var/datum/reagent/reagents_within as anything in reagents.reagent_list)
+ if(istype(reagents_within, /datum/reagent/toxin))
+ var/datum/reagent/toxin/toxin_reagent = reagents_within
+ var/toxin_damage = round(toxin_reagent.toxpwr)
+ adjust_health(toxin_damage + 1)
+ reagents.remove_reagent(toxin_reagent.type, 0.5)
+ continue
+
+ if(istype(reagents_within, /datum/reagent/medicine))
+ adjust_health(-1)
+ reagents.remove_reagent(reagents_within.type, 0.5)
diff --git a/sound/creatures/bagawk.ogg b/sound/creatures/bagawk.ogg
new file mode 100644
index 00000000000..bfdce2da489
Binary files /dev/null and b/sound/creatures/bagawk.ogg differ
diff --git a/sound/creatures/chick_peep.ogg b/sound/creatures/chick_peep.ogg
new file mode 100644
index 00000000000..1e84d1d765f
Binary files /dev/null and b/sound/creatures/chick_peep.ogg differ
diff --git a/sound/creatures/chitter.ogg b/sound/creatures/chitter.ogg
new file mode 100644
index 00000000000..5b2a1443886
Binary files /dev/null and b/sound/creatures/chitter.ogg differ
diff --git a/sound/creatures/claw_click.ogg b/sound/creatures/claw_click.ogg
new file mode 100644
index 00000000000..965b4c3fa9f
Binary files /dev/null and b/sound/creatures/claw_click.ogg differ
diff --git a/sound/creatures/clucks.ogg b/sound/creatures/clucks.ogg
new file mode 100644
index 00000000000..176f46f866f
Binary files /dev/null and b/sound/creatures/clucks.ogg differ
diff --git a/sound/effects/mousesqueek.ogg b/sound/creatures/mousesqueek.ogg
similarity index 100%
rename from sound/effects/mousesqueek.ogg
rename to sound/creatures/mousesqueek.ogg
diff --git a/sound/creatures/pony/snort.ogg b/sound/creatures/pony/snort.ogg
index b023ddcf47c..0ea56ad957d 100644
Binary files a/sound/creatures/pony/snort.ogg and b/sound/creatures/pony/snort.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index fdda7df2da2..c36f9247879 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4767,6 +4767,7 @@
#include "code\modules\mob_spawn\corpses\nonhuman_corpses.dm"
#include "code\modules\mob_spawn\corpses\species_corpses.dm"
#include "code\modules\mob_spawn\ghost_roles\away_roles.dm"
+#include "code\modules\mob_spawn\ghost_roles\drone_roles.dm"
#include "code\modules\mob_spawn\ghost_roles\fugitive_hunter_roles.dm"
#include "code\modules\mob_spawn\ghost_roles\golem_roles.dm"
#include "code\modules\mob_spawn\ghost_roles\mining_roles.dm"
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
index 5e39c743ec3..851425dadfd 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
@@ -56,6 +56,7 @@ const RecordInfo = (props, context) => {
rank,
species,
wanted_status,
+ voice,
// SKYRAT EDIT START - RP Records
past_general_records,
past_security_records,
@@ -172,6 +173,9 @@ const RecordInfo = (props, context) => {
text={fingerprint}
/>
+
+
+