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,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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" - }, - { - "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} /> + + +