diff --git a/.vscode/launch.json b/.vscode/launch.json index d87097ad419..fd029c2874e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,6 +15,13 @@ "preLaunchTask": "Build All (low memory mode)", "dmb": "${workspaceFolder}/${command:CurrentDMB}" }, + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker (absolute minimum)", + "preLaunchTask": "Build All (absolute minimum)", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, { "type": "byond", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f3c14cea754..aa32b74939a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -40,6 +40,26 @@ "dependsOn": "dm: reparse", "label": "Build All (low memory mode)" }, + { + "type": "process", + "command": "tools/build/build.sh", + "args": ["-DLOWMEMORYMODE", "-DABSOLUTE_MINIMUM"], + "windows": { + "command": ".\\tools\\build\\build.bat", + "args": ["-DLOWMEMORYMODE", "-DABSOLUTE_MINIMUM"] + }, + "options": { + "env": { + "DM_EXE": "${config:dreammaker.byondPath}" + } + }, + "problemMatcher": ["$dreammaker", "$tsc", "$eslint-stylish"], + "group": { + "kind": "build" + }, + "dependsOn": "dm: reparse", + "label": "Build All (absolute minimum)" + }, { "type": "process", "command": "tools/build/build.sh", diff --git a/README.md b/README.md index c6397e8312c..671a689ca7d 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,16 @@ [![resentment](.github/images/badges/built-with-resentment.svg)](.github/images/comics/131-bug-free.png) [![technical debt](.github/images/badges/contains-technical-debt.svg)](.github/images/comics/106-tech-debt-modified.png) [![forinfinityandbyond](.github/images/badges/made-in-byond.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) -| Website | Link | -| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| Git / GitHub cheatsheet | [https://www.notion.so/Git-GitHub-61bc81766b2e4c7d9a346db3078ce833](https://www.notion.so/Git-GitHub-61bc81766b2e4c7d9a346db3078ce833) | -| Guide to Modularization | [./modular_skyrat/readme.md](./modular_skyrat/readme.md) | -| Website | [https://wiki.bubberstation.org/index.php?title=Main_Page](https://wiki.bubberstation.org/index.php?title=Main_Page) | -| Code | [https://github.com/Bubberstation/Bubberstation](https://github.com/Bubberstation/Bubberstation) | -| Wiki | [https://tgstation13.org/wiki/Main_Page](https://tgstation13.org/wiki/Main_Page) | -| Codedocs | [https://skyrat-ss13.github.io/Skyrat-tg/](https://skyrat-ss13.github.io/Skyrat-tg/) | -| Bubberstation Discord | [https://discord.gg/AvjrTqnqEx](https://discord.gg/AvjrTqnqEx) | -| Coderbus Discord | [https://discord.gg/Vh8TJp9](https://discord.gg/Vh8TJp9) | +| Website | Link | +| ----------------------- | ----------------------------------------------------------------- | +| Git / GitHub cheatsheet | https://www.notion.so/Git-GitHub-61bc81766b2e4c7d9a346db3078ce833 | +| Guide to Modularization | [./modular_skyrat/readme.md](./modular_skyrat/readme.md) | +| Website | https://wiki.bubberstation.org/index.php?title=Main_Page | +| Code | https://github.com/Bubberstation/Bubberstation | +| Wiki | https://tgstation13.org/wiki/Main_Page | +| Codedocs | https://skyrat-ss13.github.io/Skyrat-tg/ | +| Bubberstation Discord | https://discord.gg/AvjrTqnqEx | +| Coderbus Discord | https://discord.gg/Vh8TJp9 | This is Bubberstation's fork of TG. Originally forked from Skyrat. @@ -47,6 +47,7 @@ As of our recent split from Skyrat, a lot of codedocs/modularization guides need _Credit: [Goonstation contribution guidelines](https://hackmd.io/@goonstation/docs/%2F%40goonstation%2Fcontribute#What-if-I-change-my-mind-about-my-contributions-being-published)_ To forward any licensing concerns, please open an issue report or pull request. Alternatively, you can join our [Discord](https://discord.gg/AvjrTqnqEx) and contact the project leaders. + ## Modularization and codedocs note ## Important note - TEST YOUR PULL REQUESTS @@ -82,9 +83,9 @@ For overall design documentation see [HackMD](https://hackmd.io/@tgstation). ## LICENSE -All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). +All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/12/31 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). -All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). +All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/12/31 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html). (Including tools unless their readme specifies otherwise.) See LICENSE and GPLv3.txt for more details. diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index eebbdf4ede4..d43627c5c00 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,6 +1,15 @@ //#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define ABSOLUTE_MINIMUM //uncomment this to load a smaller centcomm and smaller runtime station, only works together with LOWMEMORYMODE +#ifdef ABSOLUTE_MINIMUM +#define LOWMEMORYMODE +#endif + +#ifndef ABSOLUTE_MINIMUM #include "map_files\generic\CentCom.dmm" +#else +#include "map_files\generic\CentCom_minimal.dmm" +#endif #ifndef LOWMEMORYMODE #ifdef ALL_MAPS diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json index df38ec4c5b8..4acdadf0644 100644 --- a/_maps/gateway_test.json +++ b/_maps/gateway_test.json @@ -8,8 +8,8 @@ "ignored_unit_tests": [ "/datum/unit_test/antag_moodlets", "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/space_dragon_expiration", "/datum/unit_test/spy_bounty", "/datum/unit_test/traitor" diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm index 580c769f54d..0665cfa7698 100644 --- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm +++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm @@ -23,6 +23,13 @@ /obj/structure/showcase/machinery/implanter, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"aaM" = ( +/obj/machinery/computer/atmos_control/nitrogen_tank, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "aaO" = ( /obj/structure/plaque/static_plaque/golden{ desc = "Come get your own gold plaque!"; @@ -98,19 +105,23 @@ /obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"abv" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/table, -/obj/machinery/computer/records/medical/laptop{ - pixel_y = 4 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "abE" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"abF" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "abI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/shaft_miner, @@ -136,6 +147,11 @@ "abT" = ( /turf/closed/wall, /area/station/science/cytology) +"abW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "abY" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -257,6 +273,12 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"aep" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "aeq" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -266,14 +288,6 @@ }, /turf/open/floor/iron/white/textured_edge, /area/station/medical/surgery) -"aeO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/holopad, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "afg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -482,12 +496,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) -"aim" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "aiq" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/doppler_array{ @@ -548,6 +556,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"ajG" = ( +/obj/machinery/light/directional/west, +/obj/structure/table, +/obj/item/clothing/suit/apron/chef, +/obj/item/knife{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/clothing/head/utility/chefhat{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "ajI" = ( /obj/structure/table, /obj/item/taperecorder{ @@ -668,6 +694,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"akU" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "akW" = ( /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 4 @@ -747,29 +783,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"alE" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "catwalk_cafe"; - name = "Feeding Elevator Controller"; - pixel_x = 0; - pixel_y = 26; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/structure/sign/directions/upload/directional/north{ - desc = "It stands for Up Le Dable"; - dir = 2; - name = "Button Indicator"; - pixel_y = 40 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "alF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table_frame, @@ -909,13 +922,6 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"aor" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) "aoz" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -952,6 +958,14 @@ }, /turf/open/floor/wood, /area/station/ai_monitored/command/storage/eva) +"apf" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "api" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/weather/snow, @@ -960,41 +974,18 @@ "apo" = ( /turf/open/openspace, /area/station/command/corporate_showroom) -"apr" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/water, -/area/station/maintenance/port/fore) -"apA" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "CO2 Multideck Adapter"; +"apu" = ( +/obj/effect/turf_decal/tile/dark_green{ dir = 4 }, -/obj/machinery/meter{ - name = "C02 meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/iron/checker, +/area/station/service/bar) "apE" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"apI" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "Chief Engineers Privacy Shutters" - }, -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) "apK" = ( /turf/closed/wall/r_wall, /area/station/security/range) @@ -1037,6 +1028,17 @@ dir = 1 }, /area/station/science/ordnance/storage) +"aqg" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "aqj" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -1107,6 +1109,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) +"ars" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "arv" = ( /obj/structure/table, /obj/item/healthanalyzer{ @@ -1128,19 +1142,15 @@ dir = 8 }, /area/station/science/robotics) -"arw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "arz" = ( /obj/item/radio/intercom/directional/west, /turf/open/openspace, /area/station/science/xenobiology) +"arD" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "arK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light/directional/east, @@ -1172,6 +1182,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"ask" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/landmark/start/cook, +/turf/open/floor/glass, +/area/station/service/kitchen) +"ast" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/smooth, +/area/station/engineering/hallway) "asx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -1281,6 +1301,12 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"atW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "aud" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1290,14 +1316,15 @@ }, /turf/open/openspace, /area/station/maintenance/starboard/aft) -"auf" = ( -/obj/structure/ladder, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) "aug" = ( /obj/machinery/vending/games, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"aum" = ( +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/service/library) "aun" = ( /obj/structure/chair{ dir = 4 @@ -1347,12 +1374,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/lobby) -"auQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "auS" = ( /obj/item/toy/plush/moth{ name = "Goofy Greg"; @@ -1379,23 +1400,16 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "avb" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/closed/wall, -/area/station/service/kitchen) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "avc" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/cargo/storage) -"avd" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/obj/machinery/camera/autoname/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "avY" = ( /obj/item/storage/medkit/regular{ pixel_x = 3; @@ -1610,12 +1624,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/carpet, /area/station/command/bridge) -"azD" = ( -/obj/structure/railing{ - dir = 10 - }, -/turf/open/openspace, -/area/station/hallway/primary/central) "azI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1645,12 +1653,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"azX" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Dormitories - Lower Entrance" - }, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) "aAb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1680,10 +1682,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) -"aAC" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "aAI" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -1730,12 +1728,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"aBK" = ( -/obj/effect/turf_decal/siding/dark/corner{ - dir = 8 - }, -/turf/open/openspace, -/area/station/service/kitchen) "aBN" = ( /obj/structure/railing{ dir = 9 @@ -1760,6 +1752,20 @@ /obj/machinery/rnd/destructive_analyzer, /turf/open/floor/iron, /area/station/science/research) +"aBR" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/computer/order_console/cook, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "aBV" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/wood, @@ -1837,20 +1843,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"aDj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, -/area/station/commons/lounge) "aDm" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/holopad, @@ -1940,6 +1932,11 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"aEG" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/closet/emcloset, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "aEO" = ( /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, @@ -1959,13 +1956,6 @@ "aEZ" = ( /turf/open/floor/iron, /area/station/science/breakroom) -"aFc" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "aFg" = ( /turf/open/openspace, /area/station/maintenance/starboard/aft) @@ -1973,10 +1963,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"aFk" = ( -/obj/structure/sign/clock/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "aFm" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -2021,13 +2007,6 @@ dir = 4 }, /area/station/hallway/primary/fore) -"aFQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/computer/atmos_control/nitrous_tank{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "aFV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, @@ -2069,17 +2048,6 @@ /obj/structure/flora/bush/grassy/style_random, /turf/open/floor/grass, /area/station/engineering/lobby) -"aGL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar Backroom" - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "aGR" = ( /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) @@ -2113,19 +2081,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) -"aHm" = ( -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/hallway/primary/central) "aHo" = ( /obj/structure/safe, /obj/item/storage/fancy/pickles_jar, @@ -2222,6 +2177,26 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/security/brig) +"aIL" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) +"aIO" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = -7; + pixel_y = -13 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "aIP" = ( /obj/structure/sign/poster/contraband/random/directional/north, /obj/item/stack/sheet/mineral/wood{ @@ -2234,6 +2209,23 @@ /obj/machinery/holopad/secure, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) +"aIV" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) +"aJg" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/service/theater_dressing) "aJh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -2243,13 +2235,15 @@ /obj/item/storage/cans/sixbeer, /turf/open/openspace, /area/station/commons/fitness/recreation) -"aJj" = ( -/turf/open/floor/carpet/stellar, -/area/station/service/library) "aJl" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"aJt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) "aJu" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2271,11 +2265,6 @@ "aJE" = ( /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"aJM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/turf/open/openspace, -/area/station/maintenance/port/fore) "aJQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -2293,18 +2282,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"aKj" = ( -/obj/structure/closet/crate, -/obj/item/gps, -/obj/item/assembly/timer, -/obj/item/gps, -/obj/item/assembly/signaler, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "aKk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -2362,6 +2339,30 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron, /area/station/engineering/lobby) +"aKV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) +"aKY" = ( +/obj/machinery/light_switch/directional/south{ + pixel_y = -24 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) +"aLa" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "aLd" = ( /turf/open/floor/glass/airless, /area/station/maintenance/starboard/lesser) @@ -2379,15 +2380,13 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"aLE" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/flashlight{ +"aLu" = ( +/obj/item/paint/white{ + pixel_x = 11; pixel_y = 8 }, -/obj/machinery/light/small/blacklight/directional/north, -/turf/open/floor/eighties/red, -/area/station/maintenance/hallway/abandoned_recreation) +/turf/open/floor/glass/reinforced, +/area/station/service/library) "aLJ" = ( /turf/open/floor/carpet, /area/station/security/courtroom) @@ -2606,6 +2605,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/explab) +"aOX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "aPg" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table, @@ -2694,14 +2699,15 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"aQw" = ( -/obj/structure/railing, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/bookbinder, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 +"aQu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/area/station/service/library) +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/glass, +/area/station/service/kitchen) "aQx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -2713,13 +2719,6 @@ /obj/structure/table, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"aQL" = ( -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/disposalpipe/segment, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "aQM" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/effect/turf_decal/siding/brown{ @@ -2727,21 +2726,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"aQW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/turf/open/floor/wood/large, -/area/station/service/kitchen) "aRa" = ( /obj/effect/turf_decal/trimline/red/corner{ dir = 1 @@ -2778,12 +2762,15 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"aRW" = ( -/obj/machinery/requests_console/directional/west, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"aSb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "aSd" = ( /obj/structure/window/reinforced/tinted/spawner/directional/east, /obj/machinery/shower/directional/east, @@ -2795,13 +2782,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"aSz" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "aSB" = ( /turf/open/floor/engine/hull/air, /area/station/engineering/break_room) @@ -2848,6 +2828,20 @@ /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"aTj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/meter, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "aTt" = ( /turf/open/floor/wood/large, /area/station/service/library) @@ -2976,6 +2970,15 @@ }, /turf/open/floor/carpet, /area/station/ai_monitored/command/storage/eva) +"aUU" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/turf/open/floor/wood, +/area/station/service/library) "aUV" = ( /obj/structure/table/reinforced, /obj/item/screwdriver{ @@ -3034,16 +3037,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) -"aVo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/service/hop_office, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "aVy" = ( /obj/structure/sign/directions/security/directional/north{ dir = 2; @@ -3089,6 +3082,13 @@ "aVN" = ( /turf/closed/wall, /area/station/command/teleporter) +"aVO" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "aVP" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3100,15 +3100,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/fore) +"aWa" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "aWb" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"aWc" = ( -/obj/structure/lattice, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/starboard/fore) "aWk" = ( /obj/machinery/light/directional/west, /obj/machinery/camera/autoname/directional/west{ @@ -3167,13 +3169,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"aWT" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "aWV" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain/private) @@ -3275,6 +3270,14 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) +"aYw" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/skill_station, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/service/library) "aYy" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -3427,6 +3430,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"baL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/turf/open/openspace, +/area/station/maintenance/port/fore) "bba" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner{ @@ -3468,6 +3476,36 @@ /obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"bbY" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "44444" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) +"bcc" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) "bcg" = ( /obj/structure/disposalpipe/trunk/multiz/down{ dir = 1 @@ -3656,15 +3694,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"bfu" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood/large, +"bfw" = ( +/obj/structure/window/spawner/directional/north, +/turf/open/floor/wood, /area/station/service/library) "bfx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3693,18 +3725,6 @@ /obj/structure/stairs/south, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"bgz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table, -/obj/effect/landmark/event_spawn, -/obj/item/chisel{ - pixel_x = 7; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "bgA" = ( /obj/machinery/suit_storage_unit{ storage_type = /obj/item/clothing/shoes/magboots @@ -3736,20 +3756,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"bgY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "bhc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -3817,9 +3823,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) -"biB" = ( -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "biG" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -3894,13 +3897,6 @@ "bjq" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/central) -"bjA" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/service/theater_dressing) "bjD" = ( /obj/effect/spawner/random/maintenance, /obj/structure/rack, @@ -4097,10 +4093,38 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"bmq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "bmx" = ( /obj/structure/transport/linear/public, /turf/open/openspace, /area/station/security/brig) +"bmD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail, +/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, +/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/effect/mapping_helpers/mail_sorting/service/bar, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) +"bmH" = ( +/obj/machinery/barsign{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "bmI" = ( /obj/machinery/door/window/brigdoor/security/holding/left/directional/south{ id = "Holding Cell"; @@ -4180,6 +4204,10 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"boa" = ( +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) "boh" = ( /obj/item/radio/intercom/directional/east, /obj/structure/lattice/catwalk, @@ -4281,13 +4309,6 @@ "bpK" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) -"bpS" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "bpU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/showcase/machinery/cloning_pod{ @@ -4328,16 +4349,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"bqs" = ( -/obj/structure/chair/sofa/right/brown, -/obj/item/pillow, -/obj/item/toy/plush/moth{ - name = "Mender Moff" - }, -/obj/structure/sign/poster/official/get_your_legs/directional/north, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) "bqv" = ( /obj/effect/turf_decal/siding, /obj/effect/turf_decal/trimline/white/line{ @@ -4367,14 +4378,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"bqS" = ( -/obj/machinery/light_switch/directional/east, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "bqV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4393,6 +4396,13 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"brf" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/openspace, +/area/station/engineering/atmos/project) "brm" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/stripes/red/line{ @@ -4494,11 +4504,18 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"bsT" = ( -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) +"bsW" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 1; + pixel_y = 3 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "btb" = ( /obj/machinery/roulette, /turf/open/floor/engine, @@ -4514,11 +4531,6 @@ /obj/machinery/vending/donksnack, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"bts" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/blacklight/directional/north, -/turf/open/floor/carpet/stellar, -/area/station/maintenance/hallway/abandoned_recreation) "btv" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -4735,12 +4747,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/circuit/telecomms, /area/station/science/xenobiology) -"bwZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "bxa" = ( /obj/effect/turf_decal/siding/blue/corner{ dir = 1 @@ -4750,10 +4756,6 @@ "bxd" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/hfr_room) -"bxl" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bxx" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos/upper) @@ -4912,6 +4914,14 @@ "bzB" = ( /turf/closed/wall/r_wall, /area/station/science/robotics) +"bzK" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = 5; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "bzL" = ( /obj/effect/decal/cleanable/plasma, /turf/open/floor/plating, @@ -5002,39 +5012,6 @@ "bAW" = ( /turf/open/floor/iron, /area/station/engineering/lobby) -"bBe" = ( -/mob/living/basic/lizard/wags_his_tail, -/obj/structure/bed, -/obj/item/storage/box/lights/mixed{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/storage/box/mousetraps{ - pixel_x = -9; - pixel_y = 14 - }, -/obj/item/storage/box/mousetraps{ - pixel_x = 5; - pixel_y = 27 - }, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = -11; - pixel_y = 27 - }, -/obj/item/restraints/legcuffs/beartrap{ - pixel_x = -11; - pixel_y = 27 - }, -/obj/effect/landmark/start/janitor, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "bBp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -5091,24 +5068,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_half, /area/station/ai_monitored/turret_protected/aisat/foyer) -"bBE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/service/janitor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/landmark/navigate_destination/janitor, -/obj/machinery/door/airlock{ - name = "Custodial Closet" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "bBK" = ( /obj/effect/landmark/observer_start, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -5146,6 +5105,21 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"bCi" = ( +/obj/structure/closet/l3closet/janitor, +/obj/machinery/requests_console/directional/north{ + department = "Janitorial"; + name = "Janitorial Requests Console"; + pixel_x = -30; + pixel_y = 0 + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "bCv" = ( /obj/structure/railing{ dir = 4 @@ -5192,15 +5166,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"bCP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/lobby) "bDm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/maintenance, @@ -5223,6 +5188,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"bDu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "bDv" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -5244,9 +5219,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/aisat/foyer) -"bDZ" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "bEp" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/plating, @@ -5292,18 +5264,6 @@ /obj/machinery/wall_healer/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"bEK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "bES" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -5436,16 +5396,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/art) -"bGR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "bGX" = ( /obj/effect/turf_decal/arrows/white{ dir = 4 @@ -5476,13 +5426,6 @@ dir = 1 }, /area/station/service/chapel) -"bHa" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Primary Tool Storage" - }, -/obj/effect/landmark/navigate_destination/tools, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bHb" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -5492,11 +5435,12 @@ /turf/open/openspace, /area/station/security/checkpoint/supply) "bHd" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "bHj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5507,14 +5451,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bHk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "bHn" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -5540,29 +5476,10 @@ }, /turf/open/floor/plating, /area/station/security/execution/education) -"bHA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/desk_bell{ - pixel_x = -7 - }, -/turf/open/floor/wood/large, -/area/station/service/kitchen) "bHB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"bHC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/computer/atmos_control/oxygen_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "bHG" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/decal/cleanable/dirt, @@ -5597,6 +5514,12 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"bIh" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/glass/reinforced, +/area/station/solars/starboard/fore) "bIi" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood, @@ -5606,22 +5529,18 @@ /obj/machinery/light/floor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"bIo" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "bIp" = ( /obj/structure/dresser, /obj/machinery/status_display/ai/directional/north, /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"bID" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "bIF" = ( /obj/machinery/atmospherics/components/binary/pump/layer4, /obj/item/storage/box/matches{ @@ -5706,21 +5625,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"bJc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/button/door/directional/south{ - id = "psychology_shutters"; - name = "psychology shutters control"; - pixel_x = -6 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "bJj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -5754,21 +5658,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"bJC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) -"bJH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) "bJJ" = ( /obj/machinery/vending/cigarette, /obj/structure/disposalpipe/segment{ @@ -5776,11 +5665,6 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) -"bJO" = ( -/obj/machinery/light/directional/north, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/wood, -/area/station/commons/storage/tools) "bJU" = ( /obj/machinery/camera/directional/west{ c_tag = "Law & Order Lobby" @@ -5829,6 +5713,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/engineering/lobby) +"bKp" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "bKs" = ( /obj/structure/chair/office{ dir = 8 @@ -5868,14 +5757,18 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) -"bKV" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/structure/sign/departments/psychology/directional/east, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +"bKL" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/crowbar/red, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "bKX" = ( /obj/effect/turf_decal/tile/purple/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5930,6 +5823,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"bLZ" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "bMa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, @@ -5996,25 +5895,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) -"bMs" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/service/kitchen) +"bMt" = ( +/obj/machinery/suit_storage_unit/atmos, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "bMw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 }, /turf/open/floor/iron/dark, /area/station/security/office) -"bMD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "bNk" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -6082,24 +5972,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) +"bOt" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "bOw" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) -"bOy" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/machinery/door/airlock/glass{ - name = "Bar" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/checker, -/area/station/service/bar) "bOC" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -6197,14 +6079,6 @@ /obj/item/clothing/mask/breath, /turf/open/floor/wood, /area/station/command/teleporter) -"bQt" = ( -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) -"bQu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "bQz" = ( /obj/structure/reagent_dispensers/fueltank, /obj/structure/railing, @@ -6245,6 +6119,30 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/solars/starboard/aft) +"bQO" = ( +/obj/machinery/requests_console/directional/west, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) +"bQU" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "bRa" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/wood, @@ -6319,6 +6217,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) +"bRU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "bRW" = ( /obj/effect/turf_decal/arrows{ dir = 1 @@ -6363,6 +6271,21 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) +"bSu" = ( +/obj/item/paint/red{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/paint/black{ + pixel_x = 4; + pixel_y = 12 + }, +/obj/item/paint/blue{ + pixel_x = 9; + pixel_y = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "bSv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -6437,17 +6360,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) -"bTl" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/airlock_painter, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "bTo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6504,15 +6416,18 @@ /obj/machinery/computer/dna_console, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) -"bUk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 +"bUf" = ( +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "bUp" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/structure/urinal/directional/north, @@ -6616,26 +6531,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/glass, /area/station/science/zoo) -"bWf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/mug/tea, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "bWo" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"bWr" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/griddle, -/turf/open/openspace, -/area/station/service/kitchen) "bWB" = ( /obj/effect/turf_decal/trimline/dark_blue/end, /obj/effect/turf_decal/trimline/dark_blue/corner, @@ -6697,6 +6596,18 @@ }, /turf/open/floor/glass, /area/station/maintenance/starboard/fore) +"bXn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "bXp" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -6713,6 +6624,14 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"bXy" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/checker, +/area/station/service/bar) "bXA" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -6806,6 +6725,13 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/science/explab) +"bZm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "bZo" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/mid_joiner, @@ -6943,6 +6869,12 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"caF" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "caO" = ( /obj/structure/table, /turf/open/floor/plating, @@ -7025,16 +6957,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/wood, /area/station/ai_monitored/command/storage/eva) -"cbE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/wood{ - name = "Curator Office" - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "cbI" = ( /obj/machinery/vatgrower{ dir = 4 @@ -7093,11 +7015,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"cck" = ( -/obj/structure/broken_flooring/singular/directional/east, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) "ccm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7191,6 +7108,10 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"cdy" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "cdP" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/crayon{ @@ -7205,6 +7126,10 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ceb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "ced" = ( /obj/structure/sign/departments/lawyer/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, @@ -7231,12 +7156,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/cytology) -"cep" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, -/obj/structure/sign/warning/fire/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) "cer" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper/stack{ @@ -7263,15 +7182,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"cew" = ( -/obj/structure/table, -/obj/item/aicard, -/obj/item/ai_module/reset, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "ceB" = ( /obj/structure/chair/comfy{ dir = 1 @@ -7320,6 +7230,41 @@ }, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"cfp" = ( +/obj/machinery/button/door/directional/east{ + id = "commissarydoor"; + name = "Commissary Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + pixel_y = 5; + specialfunctions = 4 + }, +/obj/structure/table, +/obj/machinery/button/ticket_machine{ + id = "ticket_machine_comissary"; + pixel_x = 23; + pixel_y = -4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/machinery/button/door/directional/east{ + id = "actualcommissaryshutter"; + name = "Commissary Shutters"; + pixel_x = 34 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "cfs" = ( /obj/machinery/button/elevator{ id = "catwalk_engi"; @@ -7398,16 +7343,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/small, /area/station/security/mechbay) -"cgE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Plasma Cell"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) "cgK" = ( /obj/structure/cable, /turf/closed/wall, @@ -7418,10 +7353,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/qm) -"cgZ" = ( -/obj/structure/table/wood, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "chb" = ( /obj/item/vending_refill/coffee, /turf/open/floor/plating, @@ -7445,13 +7376,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/office) -"chj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "chr" = ( /obj/machinery/holopad, /turf/open/floor/wood/tile, @@ -7582,15 +7506,16 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/medical/abandoned) -"cju" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/mirror/directional/north, -/obj/structure/sink/directional/south, +"cjv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /obj/structure/cable, -/turf/open/floor/wood, -/area/station/maintenance/hallway/abandoned_recreation) +/turf/open/floor/wood/large, +/area/station/medical/psychology) "cjE" = ( /obj/machinery/computer/rdconsole, /turf/open/floor/wood, @@ -7615,11 +7540,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"ckk" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/water, -/area/station/maintenance/port/fore) +"ckp" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/glass, +/area/station/service/kitchen) "ckE" = ( /obj/machinery/hydroponics/soil, /turf/open/misc/sandy_dirt, @@ -7691,6 +7617,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"clr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering{ + name = "Telecomms Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "cly" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating, @@ -7735,6 +7676,10 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"cmf" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/openspace, +/area/station/service/kitchen) "cmh" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -7770,11 +7715,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, /area/station/maintenance/starboard/lesser) -"cmR" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "cmS" = ( /turf/closed/wall/r_wall, /area/station/security/mechbay) @@ -7824,6 +7764,10 @@ /obj/structure/grille, /turf/open/space/openspace, /area/space/nearstation) +"cor" = ( +/obj/structure/railing/corner, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "cot" = ( /obj/machinery/atmospherics/components/trinary/filter/layer2{ dir = 8 @@ -7831,10 +7775,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"cou" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) +"cox" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "coI" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/decal/cleanable/dirt, @@ -7864,11 +7812,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"cpr" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "cpy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -7918,13 +7861,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"cpT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/spawner/directional/east, -/turf/open/floor/wood, -/area/station/service/library) "cqe" = ( /obj/structure/curtain, /obj/machinery/shower/directional/south, @@ -7954,20 +7890,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"cqm" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/eighties, -/area/station/maintenance/hallway/abandoned_recreation) -"cqp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "cqt" = ( /obj/docking_port/stationary/laborcamp_home{ dir = 8 @@ -7987,32 +7909,6 @@ /obj/item/trash/boritos, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) -"cqH" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/structure/closet/crate/medical, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/effect/spawner/random/maintenance, -/obj/item/pen/red{ - pixel_y = 10 - }, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychologist's Office Curtains"; - id = "psychpriv" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "cqR" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -8097,6 +7993,13 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/basic, /area/station/maintenance/solars/port/aft) +"crB" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar & Restaurant" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/herringbone, +/area/station/commons/lounge) "crE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -8116,6 +8019,10 @@ }, /turf/open/floor/plating, /area/station/construction/storage_wing) +"crV" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/upper) "crW" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -8147,25 +8054,33 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"csf" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "N2O to Port" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "csh" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/office) -"css" = ( -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark/end{ - dir = 8 +"csk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/iron/dark/smooth_large, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/mug/tea, +/turf/open/floor/carpet/orange, /area/station/commons/lounge) +"csm" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Service Hall" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "cst" = ( /obj/effect/turf_decal/trimline/red/filled/mid_joiner{ dir = 1 @@ -8225,6 +8140,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/engine, /area/station/service/hydroponics) +"csG" = ( +/obj/structure/cable, +/obj/machinery/power/smes, +/turf/open/floor/glass/reinforced, +/area/station/maintenance/solars/port/aft) "csK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -8254,16 +8174,23 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"csU" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "ctb" = ( /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) +"cte" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "cth" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8295,14 +8222,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/medical/surgery) -"ctH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "ctK" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -8313,18 +8232,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"ctQ" = ( -/obj/structure/table/wood, -/obj/structure/desk_bell{ - pixel_x = 7; - pixel_y = -12 - }, -/obj/item/compact_remote{ - pixel_x = -9; - pixel_y = 11 - }, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "ctT" = ( /obj/structure/chair{ dir = 4 @@ -8371,10 +8278,6 @@ /obj/effect/landmark/navigate_destination/dockescpod, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"cvn" = ( -/obj/structure/sign/poster/contraband/space_cube/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "cvH" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8395,6 +8298,14 @@ /obj/effect/mapping_helpers/mail_sorting/science/genetics, /turf/open/floor/iron/dark/textured_large, /area/station/science/zoo) +"cvY" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/storage/box/rubbershot, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "cwf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -8407,17 +8318,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"cwo" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "CO2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "C02 meter" - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "cwq" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/large, @@ -8429,30 +8329,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"cwE" = ( -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "catwalk_cafe"; - name = "Feeding Elevator Controller"; - pixel_x = 0; - pixel_y = 26; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/structure/sign/directions/upload/directional/north{ - desc = "It stands for Up Le Dable"; - dir = 2; - name = "Button Indicator"; - pixel_y = 40 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "cwL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, @@ -8513,6 +8389,13 @@ /obj/structure/sign/poster/contraband/missing_gloves, /turf/closed/wall, /area/station/maintenance/port) +"cxL" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "cxQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8542,6 +8425,23 @@ /obj/structure/sign/warning/hot_temp/directional/north, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"cym" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/computer/atmos_control, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/atmos/project) +"cyq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) "cyx" = ( /obj/structure/table, /obj/item/stack/cable_coil, @@ -8635,32 +8535,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"cyW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/wood/large, -/area/station/service/library) -"czg" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/modular_computer/preset/cargochat/service, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "czk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8727,6 +8601,18 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"czK" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "czN" = ( /turf/open/openspace, /area/station/construction/storage_wing) @@ -8762,13 +8648,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/lesser) -"cAy" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/machinery/light/small/dim/directional/north, -/turf/open/water, -/area/station/maintenance/port/fore) "cAz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8826,6 +8705,16 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"cBc" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "cBf" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -8857,6 +8746,13 @@ /obj/structure/sign/warning/vacuum/directional/north, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/lesser) +"cBv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "cBA" = ( /obj/machinery/door/poddoor/preopen{ id = "Prison Gate"; @@ -8908,6 +8804,34 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"cCj" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/food/pie/cream{ + pixel_y = 9 + }, +/obj/item/food/pie/cream{ + pixel_y = 9 + }, +/obj/item/bikehorn/rubberducky{ + pixel_x = -9; + pixel_y = 2 + }, +/obj/item/bikehorn/rubberducky{ + pixel_x = -14; + pixel_y = 6 + }, +/obj/item/bikehorn/airhorn{ + pixel_x = 9; + pixel_y = 2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "cCq" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -8976,6 +8900,10 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron/textured, /area/station/cargo/storage) +"cCP" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "cCX" = ( /obj/structure/table/reinforced, /obj/item/circuitboard/mecha/ripley/peripherals{ @@ -8992,16 +8920,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/science/robotics/lab) -"cCZ" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/siding/dark/corner, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "cDq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9032,10 +8950,6 @@ dir = 4 }, /area/station/medical/surgery) -"cDI" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) "cDY" = ( /obj/machinery/light/small/directional/west, /obj/structure/rack, @@ -9231,6 +9145,20 @@ /obj/item/clothing/under/color/blue, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) +"cGO" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/service/library) "cGQ" = ( /obj/item/cigbutt{ pixel_x = -12; @@ -9303,13 +9231,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/maintenance/starboard/lesser) -"cHN" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/light/floor, -/turf/open/floor/carpet/black, -/area/station/service/theater) "cHP" = ( /obj/machinery/computer/atmos_alert{ dir = 1 @@ -9358,6 +9279,15 @@ }, /turf/open/floor/iron, /area/station/science/robotics) +"cIu" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/rnd_all, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "cIw" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -9409,15 +9339,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/storage) -"cIM" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "cIN" = ( /obj/structure/table/reinforced, /obj/item/stamp/denied{ @@ -9435,20 +9356,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) -"cIR" = ( -/obj/structure/table/wood, -/obj/item/vending_refill/cigarette{ - pixel_y = 4 - }, -/obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = -32 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "cIT" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/trash/grille_or_waste, @@ -9562,6 +9469,12 @@ }, /turf/open/space/basic, /area/space) +"cKg" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "cKs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -9606,6 +9519,11 @@ /obj/effect/spawner/random/structure/chair_flipped, /turf/open/floor/plating, /area/station/construction/storage_wing) +"cLi" = ( +/obj/structure/chair/sofa/corner/brown, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "cLm" = ( /obj/structure/table/reinforced, /obj/item/statuebust/hippocratic, @@ -9743,11 +9661,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"cOf" = ( -/obj/structure/table/wood/poker, -/obj/item/wrench, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "cOg" = ( /obj/structure/cable, /obj/structure/table, @@ -9778,6 +9691,19 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"cPi" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "cPk" = ( /obj/structure/closet/crate/coffin, /obj/effect/decal/cleanable/dirt, @@ -9843,6 +9769,24 @@ /obj/structure/chair/comfy/black, /turf/open/floor/glass, /area/station/security/brig) +"cQu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) +"cQF" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "cQP" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9878,12 +9822,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"cRj" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "cRk" = ( /turf/open/floor/wood, /area/station/commons/fitness/recreation) @@ -9903,6 +9841,10 @@ dir = 8 }, /area/station/medical/morgue) +"cRN" = ( +/obj/machinery/component_printer, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/service/library) "cRO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9922,12 +9864,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"cSe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "cSf" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/airalarm/directional/south, @@ -10026,6 +9962,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/security/courtroom) +"cTc" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "cTf" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -10056,15 +10005,6 @@ }, /turf/open/floor/plating, /area/station/construction/storage_wing) -"cTL" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N20 Multideck Adapter" - }, -/obj/machinery/meter{ - name = "N20 meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "cTR" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 1 @@ -10162,12 +10102,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"cUM" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/fyellow, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/carpet, -/area/station/commons/storage/tools) "cUX" = ( /obj/structure/railing, /obj/structure/sign/poster/contraband/random/directional/north, @@ -10241,11 +10175,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"cVU" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "cWd" = ( /obj/structure/chair/comfy/brown{ dir = 1 @@ -10286,6 +10215,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"cWt" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/station/commons/lounge) "cWG" = ( /obj/machinery/vending/cola/pwr_game, /turf/open/floor/wood, @@ -10316,6 +10257,25 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) +"cXc" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow{ + pixel_y = 6 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "cXj" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/fax{ @@ -10337,6 +10297,19 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"cXC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "cXM" = ( /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/machinery/door/airlock/maintenance{ @@ -10358,6 +10331,29 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"cYo" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/item/rag{ + pixel_x = 10; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/bowl{ + pixel_y = 17 + }, +/obj/item/reagent_containers/condiment/honey{ + pixel_x = 9; + pixel_y = -3 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "cYq" = ( /obj/structure/table/reinforced, /obj/item/flashlight{ @@ -10378,6 +10374,15 @@ /obj/structure/lattice/catwalk, /turf/open/space/openspace, /area/space/nearstation) +"cYJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "cYN" = ( /obj/structure/ladder, /obj/effect/turf_decal/delivery, @@ -10441,6 +10446,11 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"cZK" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "cZN" = ( /obj/structure/railing{ dir = 4 @@ -10463,6 +10473,12 @@ dir = 8 }, /area/station/science/ordnance/storage) +"dai" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "dak" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10470,25 +10486,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/engine/hull/air, /area/station/medical/chemistry) -"dav" = ( -/obj/item/cardboard_cutout{ - pixel_x = 14; - pixel_y = 9 - }, -/obj/item/cardboard_cutout{ - pixel_x = 14; - pixel_y = 4 - }, -/obj/item/cardboard_cutout{ - pixel_x = 14; - pixel_y = -1 - }, -/obj/effect/landmark/start/mime, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "daw" = ( /obj/structure/lattice/catwalk, /obj/structure/filingcabinet, @@ -10532,19 +10529,6 @@ /obj/structure/sign/poster/contraband/space_cola/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"daX" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/item/wirecutters, -/obj/item/screwdriver{ - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "dbb" = ( /obj/structure/ladder, /turf/open/floor/plating, @@ -10607,33 +10591,25 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"dcs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/east, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "dcv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) +"dcB" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "dcE" = ( /turf/open/space/basic, /area/space) -"dcQ" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/carpet/black, -/area/station/service/theater) "dde" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -10675,6 +10651,15 @@ /obj/item/banner/command/mundane, /turf/open/floor/plating, /area/station/maintenance/port) +"ddz" = ( +/obj/effect/turf_decal/siding/white, +/obj/item/kirbyplants/organic/plant21{ + pixel_x = -7; + pixel_y = 15 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "ddM" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -10684,21 +10669,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"ddT" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/siding/dark{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "ddW" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -10710,11 +10680,6 @@ }, /turf/open/floor/wood, /area/station/command/gateway) -"dec" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/station/service/library) "deg" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -10806,6 +10771,27 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"dfC" = ( +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/folder/white{ + pixel_x = 8; + pixel_y = 3 + }, +/obj/item/pen/fountain{ + pixel_x = 14 + }, +/obj/structure/table, +/obj/machinery/button/curtain{ + pixel_x = -6; + name = "Privacy Curtains"; + id = "psychpriv"; + pixel_y = 30 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "dfD" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -10821,12 +10807,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"dfI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "dfK" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -10862,12 +10842,6 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured_corner, /area/station/science/ordnance/storage) -"dgm" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "dgy" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -10877,6 +10851,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) +"dgD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "dgR" = ( /obj/structure/table/reinforced, /obj/structure/railing/corner{ @@ -10898,6 +10877,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"dhq" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "dhx" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/siding/wood{ @@ -11068,6 +11056,12 @@ }, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) +"djA" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "djC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11089,15 +11083,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"djM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "dkd" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -11198,20 +11183,14 @@ "dlt" = ( /turf/open/floor/plating/airless, /area/station/maintenance/starboard/aft) -"dlO" = ( -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 +"dlF" = ( +/obj/item/clothing/head/soft/orange, +/obj/structure/closet/secure_closet/engineering_chief, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "dlW" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/caution/stand_clear, @@ -11235,6 +11214,11 @@ "dmp" = ( /turf/open/floor/wood, /area/station/command/corporate_showroom) +"dmz" = ( +/obj/effect/turf_decal/stripes/box, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "dmJ" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -11248,6 +11232,18 @@ /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"dmN" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "dmV" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -11273,11 +11269,33 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"dns" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/computer/atmos_control/plasma_tank, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "dnx" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/security/court, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) +"dnE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "dnH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -11301,11 +11319,6 @@ /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dod" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space/openspace, -/area/space/nearstation) "dol" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -11408,12 +11421,31 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/ai_monitored/command/storage/eva) +"doY" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "dpo" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"dpr" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = -4; + pixel_y = 5 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "dpv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -11443,6 +11475,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"dpV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "dqj" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -11586,6 +11630,18 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"drR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "drW" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ dir = 9 @@ -11595,12 +11651,6 @@ "drX" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/command/storage/eva) -"drZ" = ( -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "dsg" = ( /obj/structure/table/wood, /turf/open/floor/carpet, @@ -11747,11 +11797,6 @@ /obj/structure/table, /turf/open/openspace, /area/station/construction/storage_wing) -"dul" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/gravity_generator) "duq" = ( /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ @@ -11858,6 +11903,14 @@ /obj/structure/flora/bush/pale/style_random, /turf/open/floor/grass, /area/station/hallway/primary/central) +"dwi" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/photocopier/prebuilt, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs) "dwl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -11899,15 +11952,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"dwG" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/library) "dwP" = ( /obj/effect/turf_decal/siding/blue/corner{ dir = 1 @@ -11990,6 +12034,28 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"dyk" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/cable_coil, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/glass/reinforced, +/area/station/solars/starboard/fore) "dyl" = ( /obj/structure/table/glass, /obj/item/hand_labeler, @@ -12054,16 +12120,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"dzg" = ( -/obj/structure/rack, -/obj/item/clothing/head/utility/welding, -/obj/item/wrench, -/obj/item/weldingtool, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "dzj" = ( /obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ id = "Cell 1"; @@ -12117,21 +12173,22 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"dzY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/sign/warning/radiation/rad_area/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "dAf" = ( /obj/structure/chair/sofa/corp/left{ dir = 1 }, /turf/open/floor/glass, /area/station/security/brig) -"dAp" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "dAR" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -12162,6 +12219,12 @@ /obj/structure/mirror/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"dBd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/obj/effect/spawner/random/structure/musician/piano/random_piano, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "dBe" = ( /obj/item/kirbyplants/photosynthetic, /turf/open/floor/plating, @@ -12217,22 +12280,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark, /area/station/engineering/lobby) -"dBK" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/fax{ - fax_name = "Service"; - name = "Service Fax Machine" - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "dBM" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -12274,12 +12321,6 @@ }, /turf/open/floor/glass, /area/station/maintenance/starboard/fore) -"dCK" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "dCY" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -12300,10 +12341,6 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) -"dDO" = ( -/obj/structure/ladder, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "dDS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12314,30 +12351,41 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) -"dEa" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/secondary/service) -"dEg" = ( -/obj/structure/chair/sofa/left/brown, -/obj/item/flashlight, -/obj/structure/sign/poster/contraband/grey_tide/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "dEk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/commons/toilet/auxiliary) +"dEo" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/closet/crate/wooden, +/obj/item/tape, +/obj/item/taperecorder, +/obj/item/camera, +/obj/item/pai_card, +/obj/item/toy/plush/moth{ + name = "Spare Sani" + }, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychologist's Office Curtains"; + id = "psychpriv" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) +"dEq" = ( +/obj/machinery/light/warm/dim/directional/west, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "dEu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12358,6 +12406,19 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet/auxiliary) +"dEH" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"dEN" = ( +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "dEW" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -12378,6 +12439,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"dEZ" = ( +/turf/open/floor/plating/elevatorshaft, +/area/station/engineering/atmos/upper) "dFd" = ( /obj/structure/railing/corner{ dir = 8 @@ -12407,6 +12471,11 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"dFs" = ( +/obj/structure/cable, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "dFt" = ( /obj/structure/stairs/north, /turf/open/floor/iron, @@ -12427,14 +12496,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"dFY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/cigbutt, -/obj/machinery/suit_storage_unit/atmos, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "dFZ" = ( /obj/effect/turf_decal/siding/red, /turf/open/floor/wood, @@ -12576,10 +12637,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/dorms) -"dIh" = ( -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "dIt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12589,28 +12646,6 @@ }, /turf/open/floor/glass, /area/station/security/brig) -"dIu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) -"dIB" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "dIM" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor/auto{ @@ -12631,6 +12666,13 @@ /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/plating, /area/station/construction/storage_wing) +"dIW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "dJb" = ( /obj/machinery/light/small/directional/south, /obj/structure/table/wood, @@ -12640,38 +12682,25 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/cafeteria) -"dJk" = ( -/obj/effect/landmark/transport/transport_id{ - specific_transport_id = "catwalk_cafe" +"dJi" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "O2 Multideck Adapter"; + dir = 8 }, -/obj/structure/transport/linear/public, -/obj/structure/table, -/obj/item/plate{ - pixel_x = -6; - pixel_y = 8 +/obj/machinery/meter{ + name = "O2 meter" }, -/turf/open/floor/plating/elevatorshaft, -/area/station/service/kitchen) +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "dJn" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, /turf/open/floor/iron, /area/station/engineering/lobby) -"dJo" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/item/paint_palette{ - pixel_y = 11 - }, -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "dJt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12710,6 +12739,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"dJI" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/item/ai_module/reset, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "dJJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -12721,6 +12761,15 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"dJV" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "dJW" = ( /turf/open/floor/glass/reinforced/airless, /area/station/solars/starboard/aft) @@ -12817,10 +12866,6 @@ "dKN" = ( /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"dKR" = ( -/obj/structure/window/spawner/directional/east, -/turf/open/floor/wood, -/area/station/service/library) "dKT" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -12845,16 +12890,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/range) -"dLp" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "dLq" = ( /turf/open/floor/plating/airless, /area/space/nearstation) @@ -12913,6 +12948,10 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/lesser) +"dMv" = ( +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "dMJ" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 10 @@ -12922,6 +12961,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"dMK" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar{ + pixel_y = 12 + }, +/obj/item/instrument/eguitar{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "dMM" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -12944,13 +12999,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"dNb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood/large, -/area/station/service/library) "dNc" = ( /obj/item/kirbyplants/random, /obj/machinery/power/apc/auto_name/directional/north, @@ -12965,6 +13013,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dNk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/service) "dNu" = ( /turf/open/floor/wood, /area/station/maintenance/starboard/aft) @@ -13117,15 +13177,6 @@ /obj/machinery/light/directional/south, /turf/open/openspace, /area/station/cargo/storage) -"dPu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "dPP" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/disposalpipe/trunk{ @@ -13228,12 +13279,6 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"dSq" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "dSs" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/stripes/line{ @@ -13243,22 +13288,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) -"dSy" = ( -/obj/structure/cable, -/obj/structure/closet/crate/engineering/electrical, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/cable_coil, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "dSA" = ( /obj/structure/railing{ dir = 1 @@ -13266,11 +13295,13 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dSG" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/oil/slippery, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) +"dSJ" = ( +/obj/structure/sign/poster/official/cleanliness/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "dSS" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, @@ -13358,25 +13389,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_edge, /area/station/ai_monitored/turret_protected/ai) -"dUp" = ( -/obj/item/paint/white{ - pixel_x = 11; - pixel_y = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "dUw" = ( /obj/structure/closet/l3closet, /obj/structure/railing, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"dUx" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "dUG" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -13400,12 +13417,6 @@ /obj/machinery/vending/cola/pwr_game, /turf/open/floor/eighties, /area/station/engineering/lobby) -"dUK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "dUN" = ( /obj/machinery/door/poddoor/shutters/window{ dir = 4; @@ -13450,14 +13461,26 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"dVe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"dVh" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"dVj" = ( +/obj/effect/turf_decal/tile/dark_blue, /obj/structure/cable, -/obj/structure/sign/warning/electric_shock/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "dVm" = ( /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13469,6 +13492,13 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"dVn" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "dVs" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 @@ -13491,11 +13521,6 @@ "dVL" = ( /turf/open/floor/iron/textured_large, /area/station/security/prison) -"dVM" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/custom_shuttle, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "dVO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -13558,16 +13583,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"dWr" = ( -/obj/structure/sign/picture_frame/portrait{ - pixel_y = 33 - }, -/obj/machinery/computer/libraryconsole{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/service/library) "dWD" = ( /obj/structure/railing{ dir = 8 @@ -13682,6 +13697,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dXP" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "dXU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13697,12 +13717,6 @@ }, /turf/open/floor/iron, /area/station/science/research) -"dXY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "dYa" = ( /obj/machinery/requests_console/directional/north{ department = "Chapel"; @@ -13720,6 +13734,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"dYi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "dYl" = ( /obj/structure/weightmachine/weightlifter, /obj/machinery/airalarm/directional/north, @@ -13741,6 +13759,12 @@ /obj/machinery/computer/mechpad, /turf/open/floor/iron/smooth, /area/station/science/robotics) +"dYI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "dYY" = ( /obj/structure/railing/corner/end/flip{ dir = 8 @@ -13788,6 +13812,10 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) +"dZA" = ( +/obj/machinery/light/floor, +/turf/open/floor/carpet/black, +/area/station/service/theater) "dZF" = ( /obj/structure/ladder, /obj/machinery/door/window/brigdoor/right/directional/east{ @@ -13797,6 +13825,12 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/tcommsat/server) +"dZH" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/closet/crate/wooden/toy, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "dZM" = ( /obj/structure/girder/reinforced, /obj/structure/grille, @@ -13864,13 +13898,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/glass, /area/station/maintenance/starboard/fore) -"eaJ" = ( -/obj/structure/table, -/obj/item/paint_palette{ - pixel_y = 11 - }, -/turf/open/floor/wood, -/area/station/service/library) "eaL" = ( /obj/structure/table/reinforced, /obj/structure/displaycase/forsale{ @@ -13917,15 +13944,6 @@ "eaV" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) -"eaX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "ebj" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -14077,14 +14095,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/maintenance/port) -"ecY" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "edc" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger{ @@ -14116,6 +14126,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"edl" = ( +/obj/structure/lattice/catwalk, +/obj/effect/spawner/random/engineering/atmospherics_portable, +/turf/open/water, +/area/station/maintenance/port/fore) "eds" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14150,11 +14165,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"edB" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/siding/wood/end, -/turf/open/floor/wood/large, -/area/station/service/library) "edJ" = ( /obj/effect/landmark/start/assistant, /obj/structure/disposalpipe/segment{ @@ -14167,22 +14177,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"edX" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "edY" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -14204,16 +14198,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/construction) -"eed" = ( -/obj/machinery/computer/atmos_control/carbon_tank, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "een" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14258,6 +14242,29 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"eeR" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Access" + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/landmark/navigate_destination/minisat_access_ai, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"eeW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "efh" = ( /obj/item/cigbutt{ pixel_x = -9; @@ -14268,6 +14275,12 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) +"efv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/eighties/red, +/area/station/maintenance/hallway/abandoned_recreation) "efA" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -14283,6 +14296,16 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"efD" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/reagent_containers/spray/pepper, +/obj/structure/closet/secure_closet/psychology, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "efJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14367,24 +14390,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/primary/central) -"egy" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "kitchen_service" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) -"egB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) -"egC" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "egD" = ( /obj/structure/table/reinforced, /turf/open/floor/engine/vacuum, @@ -14408,6 +14413,24 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"egT" = ( +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0 + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/structure/plasticflaps/kitchen, +/turf/open/floor/engine, +/area/station/science/xenobiology) +"egU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/airlock/public/glass{ + name = "Blue Base" + }, +/turf/open/floor/circuit, +/area/station/maintenance/hallway/abandoned_recreation) "egX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14422,6 +14445,17 @@ /obj/effect/landmark/navigate_destination/hydro, /turf/open/floor/iron/stairs/medium, /area/station/hallway/primary/central) +"ehf" = ( +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/machinery/atmospherics/pipe/multiz/cyan/visible{ + dir = 8; + name = "Air Mix Multideck Adapter" + }, +/obj/effect/turf_decal/tile/neutral/full, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "ehg" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14490,14 +14524,6 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"eiG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/commons/lounge) "eiW" = ( /obj/item/beacon, /turf/open/floor/engine/vacuum, @@ -14655,6 +14681,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/maintenance/starboard/lesser) +"elu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "elw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -14801,18 +14836,6 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/iron, /area/station/science/robotics/lab) -"emO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/secondary/service) "emR" = ( /obj/structure/chair/office{ dir = 1 @@ -14828,25 +14851,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"enh" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table, -/obj/item/paper_bin/carbon{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/tcomms{ - pixel_x = 14; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/tcomms/directional/south{ - name = "Telecomms Camera Monitor" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "eny" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -14855,6 +14859,20 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/wood, /area/station/commons/storage/tools) +"enC" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/meter{ + name = "N20 meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N20 Multideck Adapter"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "enE" = ( /obj/effect/turf_decal/siding/green/corner{ dir = 1 @@ -14917,22 +14935,23 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) -"eoP" = ( -/obj/structure/hedge, -/turf/open/floor/glass/reinforced, -/area/station/service/library) -"eoU" = ( -/obj/structure/railing{ - dir = 4 +"epc" = ( +/obj/item/clothing/under/color/grey, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +/obj/structure/rack, +/obj/machinery/camera/autoname/directional/west, +/obj/item/flashlight, +/obj/item/radio/intercom/directional/north, +/obj/item/wrench, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "epi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14981,19 +15000,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"epX" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/closet/crate/medical, -/obj/item/hemostat, -/obj/item/cautery, -/obj/item/scalpel{ - pixel_y = 12 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "epY" = ( /obj/structure/plaque/static_plaque/golden/commission/efficiency{ pixel_y = 32 @@ -15016,11 +15022,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"eqg" = ( -/obj/structure/sign/poster/contraband/robust_softdrinks/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "eqi" = ( /obj/effect/turf_decal/trimline/red/arrow_ccw{ dir = 5 @@ -15041,6 +15042,11 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/engineering/storage_shared) +"eqp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "eqt" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, @@ -15072,13 +15078,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"era" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" +"eqZ" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/obj/machinery/door/firedoor, /turf/open/floor/wood/large, -/area/station/service/library) +/area/station/hallway/primary/central) "erj" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs{ @@ -15144,6 +15151,26 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) +"erM" = ( +/obj/machinery/vending/autodrobe, +/obj/item/clothing/head/cone{ + pixel_x = 18; + pixel_y = 7 + }, +/obj/item/clothing/head/cone{ + pixel_x = 18; + pixel_y = 7 + }, +/obj/item/clothing/head/cone{ + pixel_x = 18; + pixel_y = 7 + }, +/obj/item/plunger{ + pixel_x = 12; + pixel_y = -7 + }, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "esb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -15184,18 +15211,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/medical) -"esV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "eta" = ( /obj/machinery/vending/coffee, /obj/item/radio/intercom/directional/north, @@ -15250,11 +15265,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"etQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "etU" = ( /obj/structure/lattice/catwalk, /obj/structure/closet/crate/cardboard, @@ -15274,6 +15284,27 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) +"eur" = ( +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"eus" = ( +/obj/structure/disposalpipe/segment, +/obj/item/paper_bin{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/stamp/head/ce{ + pixel_x = 7 + }, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/pen, +/obj/structure/table/reinforced/rglass, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "euD" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -15281,6 +15312,14 @@ "euG" = ( /turf/closed/wall, /area/station/cargo/bitrunning/den) +"euH" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Plasma to Port" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "euI" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/carpet, @@ -15315,12 +15354,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/xenobio, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"evj" = ( -/obj/structure/chair/stool/directional/east, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "evv" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer5{ dir = 8; @@ -15398,15 +15431,6 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter) -"ewx" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/weldingtool/empty{ - pixel_x = -5; - pixel_y = -6 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "ewA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15466,14 +15490,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lab) -"exC" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron/checker, -/area/station/service/bar) +"exz" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "exM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15531,16 +15552,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/security/prison) -"eyS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/box/corners, -/obj/item/toy/crayon/spraycan, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_random_offset = 1 - }, -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "eza" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -15549,12 +15560,6 @@ }, /turf/open/openspace, /area/station/commons/dorms) -"eze" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "ezm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, @@ -15610,14 +15615,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"eAc" = ( -/obj/structure/chair{ - dir = 1; - pixel_y = -2 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/service/library) "eAd" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -15840,6 +15837,16 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) +"eEp" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/railing/corner/end, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "eEv" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -15870,6 +15877,17 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/station/maintenance/port) +"eEV" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters{ + id = "actualcommissaryshutter"; + name = "Vacant Commissary Shutter" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "eEW" = ( /obj/machinery/light/directional/north, /obj/structure/lattice/catwalk, @@ -15933,17 +15951,21 @@ }, /turf/open/openspace, /area/station/command/corporate_showroom) -"eGp" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "eGq" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/engineering/break_room) +"eGs" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "eGt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16030,9 +16052,6 @@ /obj/structure/sign/poster/contraband/syndicate_pistol/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eHF" = ( -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/starboard/fore) "eHO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/broken_flooring/pile/always_floorplane/directional/west, @@ -16135,11 +16154,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/wood, /area/station/commons/dorms) -"eIS" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/contraband/microwave/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "eJb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16154,26 +16168,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"eJp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/public/glass{ - name = "Red Base" - }, -/turf/open/floor/circuit/red, -/area/station/maintenance/hallway/abandoned_recreation) -"eJw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "N2 meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "eJX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -16207,6 +16201,10 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"eKz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "eKF" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -16259,11 +16257,6 @@ }, /turf/open/openspace, /area/station/medical/storage) -"eKL" = ( -/obj/machinery/suit_storage_unit/ce, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "eKW" = ( /obj/structure/railing, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -16343,11 +16336,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"eMh" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/glass/reinforced, -/area/station/maintenance/solars/port/aft) "eMi" = ( /obj/machinery/door/airlock/public/glass{ name = "Arrivals Lounge" @@ -16395,26 +16383,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port) -"eNk" = ( -/obj/structure/transport/linear/public, -/obj/structure/table, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -6; - pixel_y = 13 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = -1; - pixel_y = 13 - }, -/obj/item/plate{ - pixel_x = -7; - pixel_y = -3 - }, -/obj/machinery/barsign{ - pixel_y = 32 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/service/kitchen) "eNz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -16494,6 +16462,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) +"eOf" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Primary Tool Storage" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/tools, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "eOh" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -16544,6 +16526,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"eOz" = ( +/obj/machinery/door/airlock/engineering, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/engineering/break_room) "eOA" = ( /obj/effect/turf_decal/tile/dark_green{ dir = 4 @@ -16565,12 +16556,6 @@ /obj/structure/ladder, /turf/open/floor/grass, /area/station/maintenance/starboard/fore) -"eOD" = ( -/obj/structure/rack, -/obj/machinery/firealarm/directional/south, -/obj/effect/spawner/random/techstorage/rnd_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "eOG" = ( /obj/effect/mapping_helpers/damaged_window, /obj/effect/spawner/structure/window, @@ -16594,27 +16579,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"ePd" = ( -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"ePm" = ( -/obj/structure/rack, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "ePn" = ( /obj/structure/mop_bucket/janitorialcart{ dir = 4 @@ -16701,17 +16665,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/upper) -"eRa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "eRb" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -16812,11 +16765,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/warden) -"eRR" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/security_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "eRT" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -16998,10 +16946,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"eUm" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "eUr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17109,6 +17053,20 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"eVF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/airlock/medical{ + name = "Psychology" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "eVW" = ( /obj/structure/plaque/static_plaque/golden{ pixel_x = -32 @@ -17135,25 +17093,6 @@ dir = 1 }, /area/station/science/ordnance/storage) -"eWv" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/commons/lounge) -"eWz" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "eWA" = ( /obj/item/toy/clockwork_watch{ desc = "An ancient piece of machinery, made from an unknown metal by an unknown maker."; @@ -17211,6 +17150,14 @@ dir = 1 }, /area/station/science/robotics) +"eXx" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, +/obj/effect/landmark/start/assistant, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "eXF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -17234,31 +17181,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_half, /area/station/ai_monitored/aisat/exterior) -"eXP" = ( -/obj/structure/table, -/obj/item/stack/sheet/cardboard/fifty{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/stack/sheet/cardboard/fifty{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "eXS" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"eYa" = ( -/obj/item/storage/crayons{ - pixel_x = -2; - pixel_y = 1 - }, -/obj/structure/table, -/turf/open/floor/wood, -/area/station/service/library) "eYe" = ( /obj/structure/displaycase/captain{ pixel_y = 5 @@ -17298,12 +17224,14 @@ /obj/structure/showcase/machinery/tv/broken, /turf/open/floor/plating, /area/station/maintenance/port) -"eYS" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +"eYY" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix Outlet Pump" + }, +/obj/effect/turf_decal/tile/green/full, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "eZd" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/vending/coffee{ @@ -17317,6 +17245,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"eZt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/closed/wall, +/area/station/service/theater_dressing) "eZA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17360,10 +17294,6 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"eZV" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "fai" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -17377,6 +17307,19 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"fas" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "Plasma Multideck Adapter"; + dir = 4 + }, +/obj/machinery/meter{ + name = "Plasma meter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "fav" = ( /obj/machinery/button/door/directional/north{ id = "SM_Outside_shutters"; @@ -17432,12 +17375,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"fby" = ( -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo" - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "fbC" = ( /turf/closed/wall, /area/station/medical/morgue) @@ -17494,6 +17431,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"fcE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "fcH" = ( /obj/structure/lattice, /obj/structure/transit_tube/crossing/horizontal, @@ -17535,12 +17476,6 @@ /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /turf/open/floor/engine, /area/station/science/xenobiology) -"fdH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "fdI" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper{ @@ -17570,13 +17505,6 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"fdM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) "fdT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17586,41 +17514,6 @@ }, /turf/open/floor/glass, /area/station/science/zoo) -"feh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark/end{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/hallway/secondary/service) -"fei" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/door/airlock/research/glass{ - name = "Slime Euthanization Chamber" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"feq" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/surgery{ - pixel_x = -14; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/tcomms{ - pixel_x = -6; - pixel_y = 9 - }, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_y = 13 - }, -/obj/item/book/manual/wiki/research_and_development{ - pixel_x = 12; - pixel_y = 10 - }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/large, -/area/station/service/library) "feA" = ( /obj/structure/table, /obj/item/clothing/suit/apron/chef, @@ -17677,16 +17570,22 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_half, /area/station/science/ordnance/storage) -"ffF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "ffI" = ( /obj/item/statuebust, /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron/vaporwave, /area/station/maintenance/starboard/lesser) +"ffK" = ( +/obj/machinery/meter{ + name = "C02 meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "CO2 Multideck Adapter"; + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "ffN" = ( /obj/structure/stairs/north, /turf/open/floor/wood, @@ -17817,6 +17716,13 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/fore) +"fhm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "fhw" = ( /obj/structure/table/reinforced/rglass, /obj/item/reagent_containers/cup/glass/mug/nanotrasen{ @@ -17869,14 +17775,6 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark, /area/station/science/cytology) -"fii" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "fik" = ( /obj/structure/rack, /obj/item/cardboard_cutout{ @@ -17945,18 +17843,6 @@ /obj/item/gun/energy/recharge/kinetic_accelerator, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"fjr" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/south, -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -4; - pixel_y = 5 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "fjt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18092,12 +17978,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"fkR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "fkX" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -18145,13 +18025,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"flM" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/painting/large/library, -/turf/open/openspace, -/area/station/maintenance/port/fore) "flS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -18200,11 +18073,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fmx" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/tcomms_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "fmN" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -18221,16 +18089,14 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"fnd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"fmW" = ( +/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "fnm" = ( /obj/structure/cable, /turf/closed/wall, @@ -18295,6 +18161,18 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"fob" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) "foj" = ( /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, @@ -18453,6 +18331,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/hull, /area/space/nearstation) +"fqc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/any/service/library, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/wood{ + name = "Curator Office" + }, +/turf/open/floor/wood, +/area/station/service/library/printer) "fqj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18474,13 +18363,15 @@ /obj/machinery/vending/cola/shamblers, /turf/open/floor/plating, /area/station/construction/storage_wing) -"fqz" = ( -/obj/structure/railing{ - dir = 4 +"fqC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/glass, +/area/station/service/kitchen) "fqD" = ( /obj/structure/table, /obj/item/mmi, @@ -18498,6 +18389,14 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fqL" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "fqO" = ( /obj/structure/sign/warning/cold_temp/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -18557,12 +18456,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"frJ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "frK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18572,6 +18465,16 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"frM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "frP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18594,6 +18497,10 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) +"fsb" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "fsf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18766,15 +18673,6 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) -"fuv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "fuP" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/floor/glass, @@ -18822,6 +18720,13 @@ dir = 4 }, /area/station/ai_monitored/aisat/exterior) +"fvk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "fvu" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -18905,19 +18810,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/central) -"fwE" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "fwF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/checker, /area/station/maintenance/port/aft) +"fwI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "fwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -18961,16 +18861,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"fxO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/checker, -/area/station/service/bar) "fxS" = ( /obj/structure/railing{ dir = 8 @@ -19016,6 +18906,15 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"fyp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/smartfridge/drying, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "fyw" = ( /obj/machinery/newscaster/directional/north, /obj/structure/cable, @@ -19036,6 +18935,17 @@ /obj/item/poster/random_contraband, /turf/open/floor/iron/dark, /area/station/maintenance/port) +"fyz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9-Bridge"; + location = "8-Kitchen" + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "fyD" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -19163,19 +19073,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"fzP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "fzS" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -19194,6 +19091,19 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"fzV" = ( +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/hallway/primary/central) "fAb" = ( /obj/machinery/computer/atmos_control/nocontrol/incinerator{ dir = 8 @@ -19237,12 +19147,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"fBh" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 +"fBd" = ( +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -7; + pixel_y = 13 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c10, +/turf/open/floor/carpet/black, +/area/station/commons/lounge) "fBm" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, @@ -19277,6 +19190,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"fBU" = ( +/obj/machinery/photocopier/prebuilt, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "fBX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -19317,6 +19235,15 @@ /obj/effect/spawner/random/maintenance/five, /turf/open/openspace, /area/station/hallway/secondary/entry) +"fCM" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "fCV" = ( /turf/closed/wall/r_wall, /area/station/science/robotics/lab) @@ -19392,15 +19319,13 @@ }, /turf/open/floor/iron, /area/station/science/research) -"fEl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"fEc" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/station/service/library) "fEs" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -19416,15 +19341,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"fEL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "fEO" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/dirt, @@ -19447,6 +19363,10 @@ }, /turf/open/floor/iron, /area/station/science/research) +"fEW" = ( +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fFe" = ( /obj/structure/chair{ dir = 1; @@ -19474,6 +19394,10 @@ /obj/item/surgical_drapes, /turf/open/floor/iron/white/textured_large, /area/station/medical/surgery) +"fFq" = ( +/obj/structure/sign/poster/random/directional/north, +/turf/open/openspace, +/area/station/hallway/secondary/service) "fFA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, @@ -19510,6 +19434,18 @@ /obj/machinery/light/directional/north, /turf/open/openspace, /area/station/security/checkpoint/science) +"fGj" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "fGm" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -19623,11 +19559,29 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"fHv" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "fHG" = ( /obj/structure/lattice, /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/secondary/entry) +"fHR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/table, +/obj/item/storage/toolbox/artistic{ + pixel_x = 1; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/station/service/library) "fHW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19657,18 +19611,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/service/abandoned_gambling_den) -"fIs" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1; - pixel_y = 3 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "fID" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -19681,17 +19623,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"fIF" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "fIN" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -19742,6 +19673,25 @@ dir = 4 }, /area/station/hallway/primary/fore) +"fJK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "fJL" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/engineering) @@ -19751,15 +19701,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"fJY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "fKi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19773,14 +19714,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/hallway/secondary/construction) -"fKD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "fKJ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 @@ -19804,17 +19737,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"fLi" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "fLq" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/openspace, @@ -19858,28 +19780,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/wood, /area/station/commons/toilet/restrooms) -"fLD" = ( -/obj/machinery/light/small/directional/east, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass/fifty, -/obj/structure/closet/crate/engineering/electrical, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "fLX" = ( /obj/structure/table/reinforced, /obj/item/storage/crayons{ @@ -19894,6 +19794,17 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/starboard/aft) +"fMh" = ( +/obj/structure/table/reinforced, +/obj/item/rcl/pre_loaded{ + pixel_y = 5 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "fMl" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -20037,6 +19948,13 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/engine, /area/station/engineering/main) +"fPb" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library) "fPf" = ( /obj/effect/landmark/event_spawn, /turf/open/openspace, @@ -20127,15 +20045,6 @@ "fQp" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) -"fQG" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/flashlight{ - pixel_y = 8 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/eighties/red, -/area/station/maintenance/hallway/abandoned_recreation) "fQI" = ( /obj/structure/table, /obj/machinery/cell_charger{ @@ -20146,6 +20055,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/science/explab) +"fQL" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "fQQ" = ( /obj/machinery/vending/games, /turf/open/floor/iron/dark/smooth_large, @@ -20200,13 +20114,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"fRs" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "fRE" = ( /obj/machinery/computer/security/qm{ dir = 4 @@ -20224,6 +20131,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/brig) +"fRH" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/fax{ + fax_name = "Chief Engineer's Office"; + name = "Chief Engineer's Fax Machine" + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "fRI" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20383,6 +20298,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) +"fUb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "fUd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -20421,6 +20343,15 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/lesser) +"fUv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "fUE" = ( /obj/machinery/vending/clothing, /obj/machinery/status_display/evac/directional/east, @@ -20455,10 +20386,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"fUV" = ( -/obj/machinery/component_printer, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/service/library) "fVa" = ( /obj/effect/landmark/event_spawn, /obj/machinery/light_switch/directional/west, @@ -20542,6 +20469,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"fVC" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "fVD" = ( /turf/closed/wall, /area/station/maintenance/solars/port/aft) @@ -20560,14 +20497,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs) -"fVU" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ - pixel_x = 5; - pixel_y = 9 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "fVX" = ( /obj/structure/table, /obj/machinery/door/poddoor/shutters/preopen{ @@ -20585,20 +20514,6 @@ /obj/effect/spawner/random/clothing/backpack, /turf/open/floor/iron, /area/station/commons/dorms) -"fWk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/commons/lounge) "fWt" = ( /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ dir = 4 @@ -20640,6 +20555,15 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"fWV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "fWW" = ( /obj/item/cigbutt{ pixel_x = -14; @@ -20657,6 +20581,15 @@ "fWY" = ( /turf/closed/wall, /area/station/service/bar) +"fXf" = ( +/obj/item/lighter{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/service/bar) "fXh" = ( /obj/item/flashlight/lamp{ pixel_x = 4; @@ -20732,6 +20665,28 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) +"fYd" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"fYe" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker; + pixel_x = -5 + }, +/obj/item/multitool{ + pixel_x = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage) "fYq" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -20775,6 +20730,14 @@ }, /turf/closed/wall, /area/station/service/lawoffice) +"fYW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/north, +/turf/open/openspace, +/area/station/engineering/atmos/project) "fZc" = ( /obj/effect/turf_decal/siding/red{ dir = 4 @@ -20908,6 +20871,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) +"gas" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "gav" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/effect/turf_decal/stripes/line, @@ -20917,11 +20886,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"gaL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "gaM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20972,11 +20936,6 @@ /obj/machinery/atmospherics/pipe/multiz/general/visible, /turf/open/openspace, /area/station/medical/cryo) -"gbd" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "gby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21220,6 +21179,22 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/science/xenobiology) +"geO" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/bar, +/turf/open/floor/wood/large, +/area/station/commons/lounge) +"gfc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/contraband/microwave/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "gfh" = ( /obj/structure/railing{ dir = 4 @@ -21255,17 +21230,33 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) -"gfM" = ( -/obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" +/obj/machinery/door/airlock/public/glass{ + name = "Bar & Restaurant" }, -/obj/structure/table, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/wood/large, -/area/station/medical/psychology) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/herringbone, +/area/station/commons/lounge) +"gfG" = ( +/obj/machinery/light/directional/west, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) +"gfH" = ( +/obj/structure/railing/corner, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/service/library) "gfU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -21342,14 +21333,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/openspace, /area/station/medical/virology) +"ggN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "ggQ" = ( /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"ggU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "ggW" = ( /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, @@ -21380,6 +21374,21 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"ghz" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood, +/obj/item/soap{ + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/bowl/soup/stew{ + desc = "Exactly what it says on the tin."; + initial_reagent = /datum/reagent/consumable/condensedcapsaicin; + name = "6 seconds blinding stew"; + pixel_y = 12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "ghA" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -21387,17 +21396,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) -"ghC" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "ghO" = ( /obj/item/coin/antagtoken, /obj/item/coin/antagtoken{ @@ -21451,14 +21449,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/storage) -"gid" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "gie" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -21489,17 +21479,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"gii" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8; - network = "tcommsat" - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "gim" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -21514,10 +21493,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"gix" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) +"giz" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/carpet/black, +/area/station/service/theater) "giB" = ( /obj/machinery/camera/directional/east{ c_tag = "Secure Tech Storage" @@ -21623,16 +21604,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/service/cafeteria) -"gkq" = ( -/obj/machinery/light/dim/directional/north, -/obj/structure/closet/secure_closet/personal, -/obj/item/storage/briefcase/secure, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "gkv" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -21684,6 +21655,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"glj" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/glass, +/area/station/service/kitchen) "gll" = ( /obj/effect/landmark/event_spawn, /turf/open/openspace, @@ -21823,11 +21800,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/commons/dorms) -"gmm" = ( -/obj/machinery/air_sensor/plasma_tank, -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) "gmt" = ( /obj/item/clothing/head/wig/random, /obj/effect/mapping_helpers/broken_floor, @@ -21887,6 +21859,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"gnp" = ( +/obj/structure/showcase/machinery/tv, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "gnt" = ( /obj/structure/cable, /obj/structure/railing/corner/end/flip{ @@ -21917,14 +21894,14 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/checkpoint/supply) -"gnF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +"gnA" = ( +/obj/structure/stairs/east, +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/iron/stairs/medium{ + dir = 8 }, -/turf/open/floor/eighties, -/area/station/maintenance/hallway/abandoned_recreation) +/area/station/hallway/primary/central) "gnI" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Space Access Airlock" @@ -22079,17 +22056,19 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"gph" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 +"goW" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 }, -/obj/machinery/firealarm/directional/west, /turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/area/station/hallway/primary/central) +"gpg" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "gpk" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 1 @@ -22102,6 +22081,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library/printer) +"gpv" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "gpx" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -22116,20 +22102,6 @@ /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"gpJ" = ( -/obj/structure/table, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"gpK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "gpO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -22143,10 +22115,18 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/dorms) -"gpW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) +"gqa" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/obj/item/mop, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "gqb" = ( /obj/structure/cable, /obj/machinery/power/terminal{ @@ -22154,12 +22134,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"gqc" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "gqh" = ( /obj/item/cigbutt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/wood, /area/station/commons/dorms) +"gqj" = ( +/obj/machinery/door/airlock/wood{ + name = "Curator Office" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/library, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "gqn" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ @@ -22235,6 +22231,12 @@ /obj/item/clothing/mask/joy, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/aft) +"grJ" = ( +/obj/item/kirbyplants/random, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "grX" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22351,6 +22353,12 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) +"gtZ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "gug" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -22400,13 +22408,11 @@ }, /turf/open/floor/iron/dark/textured_half, /area/station/ai_monitored/turret_protected/aisat/foyer) -"guF" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) +"guL" = ( +/obj/machinery/light/directional/south, +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "guO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -22450,19 +22456,19 @@ /obj/item/radio/intercom/prison/directional/west, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"gvi" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light_switch/directional/east, -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/station/service/hydroponics) "gvk" = ( /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/maintenance/starboard/lesser) +"gvn" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "gvI" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/dark/smooth_large, @@ -22481,22 +22487,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"gwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"gwx" = ( -/obj/machinery/door/airlock/external{ - name = "MiniSat Space Access Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "AI-Transit-Tube-Access" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/minisat, -/turf/open/floor/plating, -/area/station/engineering/transit_tube) "gwD" = ( /obj/item/stack/ore/gold{ pixel_x = -8; @@ -22516,6 +22506,13 @@ "gwK" = ( /turf/open/floor/engine/hull/air, /area/station/security/courtroom) +"gxl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood/large, +/area/station/service/library) "gxm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/spawner/directional/north, @@ -22535,30 +22532,16 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"gxW" = ( -/obj/structure/table, -/obj/item/storage/toolbox/artistic{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 9; - pixel_y = 2 - }, -/obj/item/trapdoor_remote/preloaded{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "gyc" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, /obj/machinery/digital_clock/directional/north, /turf/open/floor/wood/large, /area/station/service/library/private) +"gyd" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/black, +/area/station/service/theater) "gyg" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/arrow_ccw{ @@ -22628,6 +22611,16 @@ /obj/machinery/air_sensor, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) +"gyL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "gyN" = ( /obj/structure/table/glass, /obj/item/storage/briefcase/secure, @@ -22694,6 +22687,12 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"gzE" = ( +/obj/structure/cable, +/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/storage/primary) "gzH" = ( /obj/item/kirbyplants/photosynthetic, /obj/effect/turf_decal/siding/dark, @@ -22939,12 +22938,19 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"gDK" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +"gDQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "gDU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23001,6 +23007,10 @@ /obj/machinery/grill, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"gEx" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "gEE" = ( /obj/structure/chair/pew/left{ dir = 4 @@ -23016,6 +23026,12 @@ }, /turf/open/floor/engine/hull/reinforced/air, /area/station/ai_monitored/turret_protected/ai) +"gEX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "gEZ" = ( /obj/item/toy/cards/deck{ pixel_y = 4 @@ -23102,14 +23118,6 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/ai_monitored/turret_protected/aisat/foyer) -"gFO" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "gFU" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -23125,15 +23133,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"gGb" = ( -/obj/machinery/computer/apc_control{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "gGl" = ( /turf/open/floor/iron/stairs{ dir = 1 @@ -23189,6 +23188,19 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/science/breakroom) +"gGT" = ( +/obj/machinery/door/airlock/external{ + name = "MiniSat Space Access Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "AI-Transit-Tube-Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/minisat, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/turf/open/floor/plating, +/area/station/engineering/transit_tube) "gGU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23231,6 +23243,24 @@ /obj/machinery/icecream_vat, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"gHJ" = ( +/obj/structure/table, +/obj/machinery/requests_console/directional/west{ + department = "Kitchen"; + name = "Kitchen Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/processor{ + pixel_x = -4; + pixel_y = 13 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "gHK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tank, @@ -23351,17 +23381,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/storage) -"gKB" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/machinery/light/warm/dim/directional/east, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "gKL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -23387,34 +23406,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"gLe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/firealarm/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) -"gLk" = ( -/obj/structure/sign/poster/random/directional/north, -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/hand_labeler{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "gLp" = ( /obj/machinery/holopad/secure, /obj/structure/cable/layer3, @@ -23499,6 +23490,14 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) +"gMI" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hydropony_shutters"; + name = "Hydroponics Shutters" + }, +/turf/open/floor/plating, +/area/station/service/hydroponics) "gMO" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/space/openspace, @@ -23552,6 +23551,12 @@ /obj/machinery/defibrillator_mount/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"gNE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, +/turf/open/openspace, +/area/station/engineering/atmos/project) "gNK" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -23767,6 +23772,20 @@ }, /turf/open/openspace, /area/station/ai_monitored/turret_protected/ai) +"gQA" = ( +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "gQB" = ( /obj/structure/table/reinforced, /obj/item/pai_card{ @@ -23846,6 +23865,11 @@ }, /turf/open/floor/engine, /area/station/engineering/break_room) +"gRA" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "gRB" = ( /obj/machinery/door/airlock/research{ name = "Research and Development Lab" @@ -23882,20 +23906,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"gRI" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "gRQ" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) +"gRR" = ( +/obj/structure/broken_flooring/singular/directional/east, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) "gRT" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -23915,6 +23934,21 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"gSq" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) +"gSG" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "gSK" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -23939,12 +23973,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/hull/air, /area/station/medical/chemistry) -"gSY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "gTe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24035,6 +24063,14 @@ /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/security/detectives_office) +"gUx" = ( +/obj/structure/chair{ + dir = 8; + pixel_y = -2 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/station/service/library) "gUQ" = ( /obj/machinery/door/airlock/public/glass{ name = "Nanotrasen Museum" @@ -24044,6 +24080,15 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/corporate_showroom) +"gUV" = ( +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/machinery/atmospherics/pipe/multiz/violet/visible{ + name = "Mix Multideck Adapter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "gVi" = ( /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, @@ -24052,6 +24097,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) +"gVq" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "gVs" = ( /obj/machinery/computer/teleporter{ dir = 4 @@ -24125,18 +24176,6 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"gWA" = ( -/obj/item/storage/box/shipping{ - pixel_x = -11; - pixel_y = 6 - }, -/obj/item/storage/toolbox/electrical{ - pixel_y = -2 - }, -/obj/item/radio/intercom/directional/north, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "gWM" = ( /obj/machinery/camera/autoname/directional/south, /turf/open/openspace, @@ -24219,13 +24258,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"gYr" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "gYu" = ( /obj/item/lazarus_injector, /obj/item/gun/grenadelauncher, @@ -24248,6 +24280,16 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai) +"gYB" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "catwalk_engi"; + preset_destination_names = list("2"="Lower Engine","3"="Upper Engine.") + }, +/turf/open/openspace, +/area/station/engineering/break_room) "gYG" = ( /obj/machinery/atmospherics/pipe/multiz/dark/visible{ dir = 8 @@ -24270,10 +24312,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"gYR" = ( -/obj/structure/table/wood/poker, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "gYS" = ( /obj/structure/table/reinforced, /obj/item/cigbutt, @@ -24433,14 +24471,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/library) -"haK" = ( +"haE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /obj/effect/turf_decal/siding/wood{ - dir = 10 + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/eighties, -/area/station/maintenance/hallway/abandoned_recreation) +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/wood/large, +/area/station/service/library) "haN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24530,15 +24570,30 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/qm) -"hcs" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) +"hcn" = ( +/obj/machinery/meter{ + name = "Mixed Air Tank In" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "hcx" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"hcC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) +"hcD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "hcH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24616,10 +24671,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"hdX" = ( +/obj/machinery/light/dim/directional/north, +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/briefcase/secure, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "hea" = ( /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/engine/hull, /area/space/nearstation) +"heb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/banner/blue{ + inspiration_available = 0 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit, +/area/station/maintenance/hallway/abandoned_recreation) "hei" = ( /obj/structure/chair{ dir = 8 @@ -24629,18 +24703,6 @@ dir = 1 }, /area/station/service/chapel) -"hej" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/station/commons/lounge) "heo" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -24718,6 +24780,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science/central) +"hgu" = ( +/obj/structure/sign/poster/contraband/eat/directional/north, +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/service/kitchen) "hgv" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 9 @@ -24763,18 +24831,6 @@ /obj/machinery/vending/snack/orange, /turf/open/floor/wood, /area/station/service/library) -"hgS" = ( -/obj/structure/mop_bucket/janitorialcart{ - dir = 8 - }, -/obj/item/mop, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "hgW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24799,24 +24855,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/medbay/central) -"hhf" = ( -/obj/structure/table, -/obj/item/grenade/chem_grenade/teargas/moustache{ - pixel_x = 6; - pixel_y = 7 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/grenade/chem_grenade/glitter/pink{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/grenade/smokebomb{ - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/service/theater_dressing) "hhp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/circuit/telecomms, @@ -24838,13 +24876,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) -"hhx" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/commons/lounge) "hhz" = ( /obj/structure/railing/corner{ dir = 1 @@ -24880,6 +24911,11 @@ }, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) +"hhO" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/open/space/basic, +/area/space/nearstation) "hhP" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24908,10 +24944,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"hij" = ( -/obj/structure/displaycase/trophy, -/turf/open/floor/wood/large, -/area/station/service/library) "hik" = ( /obj/machinery/door/airlock{ id_tag = "Cabin3"; @@ -24919,6 +24951,13 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) +"hil" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "hip" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -24945,10 +24984,24 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/dark, /area/station/security/medical) -"hiA" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) +"hiB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/structure/table/reinforced, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "hiK" = ( /obj/structure/railing/corner{ dir = 4 @@ -24961,19 +25014,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) -"hiS" = ( -/obj/structure/table, -/obj/item/multitool{ - pixel_x = -5 - }, -/obj/item/multitool{ - pixel_x = 5 - }, -/obj/item/t_scanner{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "hja" = ( /obj/machinery/light/small/directional/south, /obj/effect/mapping_helpers/burnt_floor, @@ -24984,9 +25024,34 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/hallway/secondary/construction) +"hjL" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/light/warm/dim/directional/west, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/checker, +/area/station/service/bar) "hkm" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/fore) +"hkq" = ( +/mob/living/carbon/human/species/monkey/punpun, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) +"hkv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "hkw" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -25085,13 +25150,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) -"hlG" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/jumpskirt/grey, -/obj/item/clothing/under/color/grey, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "hlJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -25119,11 +25177,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"hmt" = ( -/obj/item/reagent_containers/cup/glass/mug/tea, -/obj/structure/table/wood, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "hmw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -25202,6 +25255,16 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"hni" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "hnk" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -25217,6 +25280,12 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"hnt" = ( +/obj/structure/stairs/east, +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/service/kitchen) "hny" = ( /obj/structure/table, /obj/structure/microscope, @@ -25252,6 +25321,13 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) +"hnO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "hnU" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/table, @@ -25302,14 +25378,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) -"hoO" = ( -/obj/structure/stairs/north{ - pixel_x = 0; - pixel_y = 0 - }, -/obj/structure/sign/departments/botany/alt2/directional/west, -/turf/open/floor/iron/stairs/medium, -/area/station/hallway/primary/central) "hoP" = ( /obj/structure/table/reinforced, /obj/item/surgery_tray/full/morgue{ @@ -25319,15 +25387,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"hoQ" = ( -/obj/machinery/light/warm/dim/directional/south, -/obj/item/kirbyplants/potty, -/obj/effect/turf_decal/siding/thinplating_new/dark/end{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "hpe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25356,14 +25415,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"hpB" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/wirecutters, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "hpH" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -25425,6 +25476,12 @@ "hqz" = ( /turf/closed/wall, /area/station/medical/abandoned) +"hqD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/service/kitchen) "hqL" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/openspace, @@ -25489,6 +25546,13 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"hsh" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/library, +/obj/machinery/door/airlock/wood{ + name = "Curator Office" + }, +/turf/open/floor/wood/large, +/area/station/maintenance/hallway/abandoned_recreation) "hsi" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -25516,6 +25580,20 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"hsD" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/atmos/project) +"hsG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/large, +/area/station/service/library) "hsI" = ( /obj/machinery/shower/directional/east, /obj/structure/fluff/shower_drain, @@ -25524,6 +25602,21 @@ }, /turf/open/floor/iron/dark/smooth_corner, /area/station/engineering/main) +"hsL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/button/door/directional/south{ + id = "psychology_shutters"; + name = "psychology shutters control"; + pixel_x = -6 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "hsR" = ( /obj/structure/sign/directions/supply{ dir = 4; @@ -25542,6 +25635,15 @@ }, /turf/closed/wall, /area/station/hallway/primary/central) +"hsZ" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/openspace, +/area/station/engineering/atmos/project) "htb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper/stack{ @@ -25574,6 +25676,12 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"hto" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "hty" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25679,6 +25787,14 @@ /obj/item/binoculars, /turf/open/space/openspace, /area/space/nearstation) +"hvw" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "hvG" = ( /obj/structure/railing{ dir = 1 @@ -25696,16 +25812,28 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"hwe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"hvX" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/wood, -/area/station/ai_monitored/command/storage/eva) +/turf/open/floor/wood/large, +/area/station/service/library) "hwn" = ( /obj/effect/spawner/random/trash/crushed_can, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"hwu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "hwP" = ( /obj/structure/chair/sofa/middle/brown, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -25724,6 +25852,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/gateway) +"hwT" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "hwU" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -25732,12 +25867,27 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"hxa" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/space/openspace, -/area/space/nearstation) +"hwV" = ( +/obj/structure/closet/firecloset, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood, +/area/station/hallway/primary/central) +"hwW" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"hxc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "hxd" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/structure/window/reinforced/spawner/directional/east, @@ -25852,11 +26002,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) -"hyw" = ( -/obj/structure/closet/firecloset, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "hyx" = ( /obj/effect/decal/cleanable/dirt, /obj/item/restraints/legcuffs/beartrap/prearmed, @@ -25873,12 +26018,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"hyZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +"hyS" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/service/library) "hzo" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/east, @@ -25911,15 +26054,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/medbay/central) -"hzP" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/light/warm/dim/directional/west, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/checker, -/area/station/service/bar) "hzQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -25989,6 +26123,16 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) +"hAm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock{ + id_tag = "commissarydoor"; + name = "Commissary" + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) "hAq" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -26035,22 +26179,29 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/medical/medbay/central) "hAW" = ( -/obj/structure/closet/crate, -/obj/item/book/manual/chef_recipes, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/item/storage/box/papersack{ - icon_state = "paperbag_NanotrasenStandard_closed" +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 }, -/obj/item/storage/box/papersack{ - icon_state = "paperbag_NanotrasenStandard_closed" +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) +"hBc" = ( +/obj/structure/table, +/obj/item/hfr_box/body/moderator_input{ + pixel_x = -8; + pixel_y = 8 }, -/obj/effect/turf_decal/siding/dark{ - dir = 10 +/obj/item/hfr_box/body/waste_output{ + pixel_x = 8; + pixel_y = 8 }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) +/obj/item/hfr_box/body/interface{ + pixel_x = 5 + }, +/obj/item/hfr_box/body/fuel_input{ + pixel_x = -10 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/hfr_room) "hBh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -26087,6 +26238,10 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"hBA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "hBM" = ( /obj/structure/chair/office{ dir = 1 @@ -26110,13 +26265,30 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"hCe" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 4 +"hBY" = ( +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "catwalk_cafe"; + name = "Feeding Elevator Controller"; + pixel_x = 0; + pixel_y = 26; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +/obj/structure/sign/directions/upload/directional/north{ + desc = "It stands for Up Le Dable"; + dir = 2; + name = "Button Indicator"; + pixel_y = 40 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "hCg" = ( /turf/open/floor/engine, /area/station/engineering/break_room) @@ -26164,12 +26336,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"hCH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "hCP" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -26208,6 +26374,11 @@ "hDg" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"hDk" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/service/bar) "hDp" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -26223,14 +26394,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/engine, /area/station/service/hydroponics) -"hDv" = ( -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree{ - pixel_x = 4; - pixel_y = 10 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "hDG" = ( /obj/structure/railing/corner/end{ dir = 4 @@ -26243,12 +26406,6 @@ }, /turf/open/floor/catwalk_floor/iron_white, /area/station/ai_monitored/turret_protected/aisat_interior) -"hDS" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "hDT" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, @@ -26271,6 +26428,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/tcommsat/server) +"hDW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/hop_office, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "hEf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26389,6 +26556,12 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) +"hFI" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "hFL" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/closet{ @@ -26478,6 +26651,34 @@ }, /turf/open/space/basic, /area/space/nearstation) +"hGM" = ( +/obj/machinery/meter{ + name = "Mix Meter" + }, +/obj/machinery/atmospherics/pipe/multiz/violet/visible{ + dir = 8; + name = "Mix Multideck Adapter" + }, +/obj/effect/turf_decal/tile/green/full, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) +"hGP" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/hallway/primary/central) "hGR" = ( /obj/structure/table/reinforced, /obj/item/pen, @@ -26521,6 +26722,17 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"hHF" = ( +/obj/machinery/disposal/bin/tagger, +/obj/machinery/airalarm/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "hHK" = ( /obj/machinery/computer/atmos_alert{ dir = 1 @@ -26559,17 +26771,6 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"hIj" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "hIn" = ( /obj/structure/cable, /obj/item/stack/sticky_tape{ @@ -26642,6 +26843,16 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/wood, /area/station/ai_monitored/command/storage/eva) +"hJz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/siding/dark/end{ + dir = 4 + }, +/turf/open/floor/iron/kitchen, +/area/station/hallway/secondary/service) "hJA" = ( /obj/effect/turf_decal/plaque{ icon_state = "L8" @@ -26667,6 +26878,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/station/commons/dorms) +"hJP" = ( +/obj/effect/decal/cleanable/blood/oil/slippery, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "hJS" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line, @@ -26738,11 +26954,6 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) -"hKO" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/service/library) "hKP" = ( /obj/structure/chair/office/light{ dir = 4 @@ -26846,12 +27057,6 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics/garden/abandoned) -"hLS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/pdapainter/engineering, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "hLT" = ( /obj/docking_port/stationary/escape_pod{ dir = 8 @@ -26937,16 +27142,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"hMG" = ( -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/item/book/manual/wiki/cooking_to_serve_man{ - pixel_x = -4; - pixel_y = 6 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "hMI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance, @@ -27018,6 +27213,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) +"hNy" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/black, +/area/station/service/theater) "hNC" = ( /obj/structure/stairs/west, /turf/open/floor/plating, @@ -27079,6 +27281,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"hOO" = ( +/obj/structure/table/wood, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "hOQ" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 8 @@ -27088,12 +27294,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"hOZ" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "hPa" = ( /obj/structure/railing{ dir = 1 @@ -27180,26 +27380,22 @@ /obj/machinery/light/directional/south, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"hQj" = ( -/obj/effect/turf_decal/stripes/line{ +"hQk" = ( +/obj/item/reagent_containers/cup/soup_pot{ + pixel_x = 6; + pixel_y = 16 + }, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = -6; + pixel_y = 14 + }, +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/glass, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"hQr" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychologist's Office Curtains"; - id = "psychpriv" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "hQE" = ( /obj/structure/railing{ dir = 8 @@ -27355,6 +27551,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/security/courtroom) +"hSd" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/vending/games, +/turf/open/floor/wood, +/area/station/service/library) "hSh" = ( /obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -27368,13 +27569,6 @@ "hSk" = ( /turf/closed/wall, /area/station/security/checkpoint/medical) -"hSq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "hSu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -27412,6 +27606,11 @@ /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /turf/open/floor/iron/white/textured_large, /area/station/medical/surgery) +"hSA" = ( +/obj/machinery/light/directional/north, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/wood, +/area/station/commons/storage/tools) "hSW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -27421,25 +27620,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"hSZ" = ( -/obj/item/vending_refill/boozeomat{ - pixel_x = -4; - pixel_y = 14 +"hTr" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "psychology_shutters"; + name = "Psychologist's Office Shutters" }, -/obj/item/vending_refill/cytopro{ - pixel_x = 11; - pixel_y = 11 - }, -/obj/item/vending_refill/hotdog{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/station/maintenance/port/greater) +/area/station/medical/psychology) "hTs" = ( /obj/machinery/light/directional/south, /obj/structure/cable, @@ -27464,6 +27653,15 @@ dir = 4 }, /area/station/security/courtroom) +"hTJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "hTK" = ( /obj/structure/cable, /obj/effect/turf_decal/caution, @@ -27480,13 +27678,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/tcommsat/server) -"hUw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "hUA" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -27494,6 +27685,10 @@ /obj/effect/spawner/random/structure/closet_empty/crate, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"hUK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "hUM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -27548,6 +27743,10 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"hVx" = ( +/obj/machinery/pdapainter/engineering, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "hVz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, @@ -27559,6 +27758,21 @@ /obj/machinery/light/directional/north, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/upper) +"hVO" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) +"hWb" = ( +/obj/structure/chair{ + dir = 1; + pixel_y = -2 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/service/library) "hWk" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, @@ -27587,16 +27801,6 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat/foyer) -"hWP" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) "hWU" = ( /obj/effect/decal/cleanable/glitter{ color = "ff8080" @@ -27816,6 +28020,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) +"hZx" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/flashlight{ + pixel_y = 8 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/carpet/stellar, +/area/station/maintenance/hallway/abandoned_recreation) "hZC" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -27828,6 +28041,16 @@ }, /turf/open/floor/iron, /area/station/science/research) +"hZD" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "hZE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/poddoor{ @@ -27851,9 +28074,6 @@ /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/station/maintenance/port) -"iaf" = ( -/turf/closed/wall, -/area/station/service/theater_dressing) "iak" = ( /obj/structure/railing{ dir = 1 @@ -27872,15 +28092,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"iaE" = ( -/obj/effect/landmark/start/assistant, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "iaF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/entertainment/arcade, @@ -27949,6 +28160,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) +"ibw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "iby" = ( /obj/structure/railing/corner/end, /obj/structure/disposalpipe/segment{ @@ -28313,15 +28529,6 @@ }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) -"ihy" = ( -/obj/item/lighter{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/wood/large, -/area/station/service/bar) "ihE" = ( /obj/structure/table/wood, /obj/item/clothing/under/misc/burial, @@ -28335,36 +28542,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/dorms) -"ihG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/book/manual/wiki/medicine{ - pixel_x = -4; - pixel_y = 14 - }, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/cooking_to_serve_man{ - pixel_x = -6; - pixel_y = 14 - }, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 9; - pixel_y = 12 - }, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_y = 9 - }, -/obj/structure/table/wood, -/turf/open/floor/wood/large, -/area/station/service/library) "ihP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28404,6 +28581,18 @@ }, /turf/open/floor/iron/white/textured_corner, /area/station/science/robotics) +"iib" = ( +/obj/structure/table, +/obj/item/storage/box/hug{ + pixel_y = 9 + }, +/obj/item/bikehorn{ + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "iis" = ( /turf/closed/wall, /area/station/command/heads_quarters/captain/private) @@ -28417,23 +28606,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"iiN" = ( -/obj/structure/sign/poster/official/cleanliness/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +"iiU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/meter, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "iiV" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/cigarette_pack, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"iiX" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "ijh" = ( /obj/structure/railing{ dir = 8 @@ -28481,24 +28663,37 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"ijH" = ( -/obj/machinery/vending/assist, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "ikc" = ( /obj/structure/railing, /turf/open/openspace, /area/station/medical/morgue) -"ikp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +"ikq" = ( /obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/spawner/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"ikG" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -14; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_y = 13 + }, +/obj/item/book/manual/wiki/research_and_development{ + pixel_x = 12; + pixel_y = 10 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/station/service/library) "ikK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28515,6 +28710,11 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"ikR" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "ikZ" = ( /turf/open/floor/eighties, /area/station/maintenance/starboard/fore) @@ -28541,6 +28741,11 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/starboard/aft) +"ilC" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "ilE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28566,6 +28771,11 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison) +"imo" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/station/service/kitchen) "imq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28589,21 +28799,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"imH" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "imJ" = ( /obj/structure/railing/corner{ dir = 4 }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"imL" = ( +/obj/structure/table/wood, +/obj/item/hand_labeler{ + pixel_y = -12 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "imQ" = ( /obj/structure/table, /obj/item/storage/medkit/toxin{ @@ -28659,6 +28871,11 @@ dir = 8 }, /area/station/medical/abandoned) +"inG" = ( +/obj/structure/sign/poster/official/get_your_legs/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "inI" = ( /obj/machinery/shower/directional/west, /obj/structure/fluff/shower_drain, @@ -28694,6 +28911,16 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/science/genetics) +"inX" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/east, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/hand_labeler, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "ioc" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, @@ -28730,10 +28957,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) -"iov" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "iox" = ( /obj/machinery/vending/wardrobe/sec_wardrobe, /obj/structure/cable, @@ -28743,6 +28966,11 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"ioC" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "ioK" = ( /obj/structure/sign/warning/cold_temp/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28933,6 +29161,14 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/maintenance/central) +"ire" = ( +/obj/machinery/restaurant_portal/bar, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/machinery/light/warm/dim/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "irh" = ( /turf/closed/wall, /area/station/medical/cryo) @@ -28993,16 +29229,6 @@ /obj/effect/decal/cleanable/fuel_pool, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"isi" = ( -/obj/machinery/light/warm/dim/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "isn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/barricade/wooden/crude, @@ -29062,11 +29288,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"isX" = ( -/obj/machinery/air_sensor/nitrous_tank, -/obj/structure/window/reinforced/plasma/spawner/directional/north, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) "ite" = ( /obj/effect/turf_decal/siding/red{ dir = 4 @@ -29086,28 +29307,28 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"itm" = ( -/obj/structure/transport/linear, -/turf/open/openspace, -/area/station/engineering/break_room) +"ito" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "itq" = ( /turf/open/floor/engine/hull/air, /area/station/engineering/lobby) +"itr" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "itt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/fore) -"itu" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "itw" = ( /obj/effect/turf_decal/siding/blue/corner{ dir = 1 @@ -29140,16 +29361,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/primary/starboard) -"itP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "itV" = ( /obj/item/stack/sheet/mineral/wood{ pixel_x = -5; @@ -29159,20 +29370,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/security/detectives_office/private_investigators_office) -"itW" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, -/area/station/service/library) "itX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29188,19 +29385,24 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/dark, /area/station/security/medical) -"iuu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "iux" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"iuO" = ( +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "catwalk_cafe" + }, +/obj/structure/transport/linear/public, +/obj/structure/table, +/obj/item/plate{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/service/kitchen) "iuR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -29270,6 +29472,21 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"ivX" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/obj/item/storage/briefcase/secure{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/paper/monitorkey, +/obj/item/clipboard, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "iwa" = ( /obj/effect/turf_decal/trimline/red/line, /obj/effect/turf_decal/trimline/red/line{ @@ -29284,18 +29501,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"iwp" = ( -/obj/structure/table, -/obj/item/plant_analyzer{ - pixel_y = 8 - }, -/obj/item/healthanalyzer, -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Secure - Tech Storage" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "iwq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -29326,6 +29531,14 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) +"ixe" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "ixf" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -29359,11 +29572,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/engine/hull/air, /area/station/command/meeting_room/council) -"ixW" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/glass, -/area/station/service/kitchen) "iyb" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room" @@ -29386,6 +29594,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"iym" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "iyn" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -29416,25 +29633,41 @@ /obj/structure/sign/poster/official/pda_ad/directional/north, /turf/open/floor/eighties, /area/station/maintenance/starboard/fore) +"iyA" = ( +/obj/structure/table/wood, +/obj/item/toy/crayon/spraycan/lubecan{ + charges = 5; + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/toy/crayon/spraycan/mimecan{ + charges = 5; + pixel_x = 3; + pixel_y = 13 + }, +/obj/item/toy/figure/clown{ + pixel_x = 5 + }, +/obj/item/toy/figure/mime{ + pixel_x = -5 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "iyE" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 }, /turf/open/water/jungle, /area/station/science/genetics) -"iyI" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_guide, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) +"iyF" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "iyL" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -29491,6 +29724,13 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/aft) +"izF" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "izI" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/table, @@ -29577,12 +29817,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"iBl" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "iBn" = ( /obj/machinery/vending/wardrobe/curator_wardrobe, /obj/machinery/light_switch/directional/east, @@ -29611,6 +29845,16 @@ /obj/structure/sign/warning/no_smoking/directional/east, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"iBZ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "iCa" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -29660,6 +29904,15 @@ /obj/machinery/holopad, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"iCt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "iCx" = ( /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/engine/hull/air, @@ -29822,6 +30075,17 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"iEH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "iEI" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -29933,12 +30197,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/hallway/primary/starboard) -"iFM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/space/basic, -/area/station/maintenance/solars/port/aft) "iFR" = ( /obj/structure/chair{ dir = 8 @@ -30044,24 +30302,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) -"iGK" = ( -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"iGL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/eighties/red, -/area/station/maintenance/hallway/abandoned_recreation) "iGP" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable/layer3, @@ -30147,10 +30387,6 @@ dir = 4 }, /area/station/hallway/primary/fore) -"iIr" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "iIs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/biogenerator, @@ -30168,6 +30404,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"iIJ" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/library, +/obj/structure/cable, +/obj/machinery/door/airlock/wood{ + name = "Curator Office" + }, +/turf/open/floor/wood, +/area/station/maintenance/hallway/abandoned_recreation) "iIL" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/closet/firecloset, @@ -30216,15 +30460,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) -"iJs" = ( -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "iJu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -30288,14 +30523,6 @@ }, /turf/open/openspace, /area/station/engineering/lobby) -"iKl" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydropony_shutters"; - name = "Hydroponics Shutters" - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/service/hydroponics) "iKm" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box, @@ -30358,31 +30585,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"iLq" = ( -/obj/structure/transport/linear/public, -/obj/structure/table, -/obj/item/plate{ - pixel_x = 6 - }, -/obj/item/plate{ - pixel_x = -13; - pixel_y = 8 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/service/kitchen) -"iLr" = ( -/obj/machinery/button/door/directional/west{ - name = "Kitchen Counter Shutters Control"; - id = "kitchen_counter"; - req_access = list("kitchen") - }, -/obj/effect/turf_decal/siding/dark{ - dir = 10 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "iLy" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -30464,13 +30666,6 @@ }, /turf/open/misc/asteroid, /area/station/science/robotics) -"iLH" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "iLL" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/transit_tube/horizontal, @@ -30508,11 +30703,6 @@ }, /turf/closed/wall, /area/station/maintenance/starboard/aft) -"iMq" = ( -/obj/item/clothing/head/soft/orange, -/obj/structure/closet/secure_closet/engineering_chief, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "iMr" = ( /obj/structure/railing/corner{ dir = 8 @@ -30542,6 +30732,14 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/hallway/primary/starboard) +"iMH" = ( +/obj/structure/stairs/north{ + pixel_x = 0; + pixel_y = 0 + }, +/obj/structure/sign/departments/botany/alt2/directional/west, +/turf/open/floor/iron/stairs/medium, +/area/station/hallway/primary/central) "iML" = ( /obj/machinery/shower/directional/west, /obj/machinery/power/apc/auto_name/directional/north, @@ -30613,10 +30811,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"iOc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "iOk" = ( /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) @@ -30705,6 +30899,18 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"iPH" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) +"iPI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "iPL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -30752,6 +30958,26 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/iron, /area/station/construction/storage_wing) +"iQw" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_x = 9; + pixel_y = 1 + }, +/obj/item/compact_remote{ + pixel_x = -7; + pixel_y = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/service/library) "iQA" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -30798,12 +31024,6 @@ "iRf" = ( /turf/open/floor/carpet, /area/station/command/meeting_room/council) -"iRx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "iRA" = ( /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) @@ -30873,15 +31093,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"iSA" = ( -/obj/machinery/light/directional/south, -/obj/machinery/light_switch/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "iSB" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -30911,6 +31122,16 @@ }, /turf/open/floor/iron/freezer, /area/station/maintenance/port) +"iSW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "iSX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -30968,6 +31189,13 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"iTM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "iTW" = ( /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/structure/table, @@ -30978,14 +31206,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"iUj" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage) "iUl" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/science/genetics, @@ -31034,12 +31254,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/service/chapel) -"iUJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "iUM" = ( /obj/machinery/requests_console/directional/north{ department = "Security"; @@ -31080,6 +31294,20 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"iVA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/commons/lounge) +"iVI" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "iVT" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -31151,6 +31379,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"iWD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "iWM" = ( /obj/structure/broken_flooring/side/directional/west, /turf/open/floor/plating, @@ -31160,6 +31397,17 @@ /obj/effect/decal/remains/human, /turf/open/space/openspace, /area/space/nearstation) +"iXg" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "iXw" = ( /obj/structure/bed/dogbed/renault, /mob/living/basic/pet/fox/renault, @@ -31227,6 +31475,36 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"iYC" = ( +/obj/machinery/air_sensor/carbon_tank, +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) +"iYG" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table, +/obj/item/paper_bin/carbon{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 14; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/tcomms/directional/south{ + name = "Telecomms Camera Monitor" + }, +/obj/item/pen, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"iYJ" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "iYK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -31314,6 +31592,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"jak" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "jal" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, @@ -31395,13 +31682,6 @@ /obj/structure/sign/poster/official/help_others/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"jbD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) "jbO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -31465,6 +31745,10 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) +"jcN" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "jcP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -31528,15 +31812,6 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"jdV" = ( -/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) "jdZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -31614,6 +31889,13 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"jeM" = ( +/obj/machinery/computer/atmos_control/oxygen_tank, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "jeU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -31747,6 +32029,11 @@ "jgy" = ( /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) +"jgz" = ( +/obj/structure/secure_safe/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "jgB" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -31784,13 +32071,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"jhg" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/camera/autoname/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "jhj" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31835,6 +32115,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/medical) +"jhS" = ( +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/techstorage/tcomms_all, +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "jhU" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/engineering/tank, @@ -31928,18 +32217,6 @@ }, /turf/closed/wall/r_wall, /area/station/engineering/atmos/pumproom) -"jjh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"jjj" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) "jjn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31966,6 +32243,29 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"jjC" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/structure/rack, +/obj/item/pai_card{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/integrated_circuit/loaded/speech_relay{ + pixel_x = 1; + pixel_y = -4 + }, +/obj/item/integrated_circuit/loaded/hello_world{ + pixel_x = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/service/library) "jjG" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/decal/cleanable/blood/old, @@ -31991,10 +32291,6 @@ }, /turf/open/floor/grass, /area/station/science/genetics) -"jjZ" = ( -/obj/machinery/holopad, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "jkd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32037,10 +32333,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) -"jkI" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "jkL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -32164,11 +32456,6 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"jmT" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jmY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32178,6 +32465,10 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) +"jmZ" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "jna" = ( /obj/structure/disposalpipe/junction/flip, /turf/open/floor/plating, @@ -32189,10 +32480,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/plating, /area/station/maintenance/central) -"jnk" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jno" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -32255,6 +32542,17 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"jol" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/camera/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "joC" = ( /obj/structure/railing{ dir = 8 @@ -32263,24 +32561,15 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) -"joH" = ( -/obj/item/vending_refill/donksnackvendor{ - pixel_y = 15 +"joE" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/item/vending_refill/sovietsoda{ - pixel_x = -4; - pixel_y = 5 +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 }, -/obj/structure/railing{ - dir = 6 - }, -/obj/item/vending_refill/coffee{ - pixel_x = 5; - pixel_y = 12 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "joI" = ( /obj/machinery/power/emitter{ dir = 4 @@ -32338,6 +32627,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/lockers) +"jpy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/checker, +/area/station/service/bar) "jpA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32404,6 +32703,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"jqO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/vatgrower, +/turf/open/floor/engine, +/area/station/service/hydroponics) "jqR" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -32458,11 +32763,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/dorms) -"jrq" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) "jrt" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -32488,6 +32788,10 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"jrz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "jrK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -32510,13 +32814,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"jrX" = ( -/obj/effect/landmark/start/bartender, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "jsh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -32569,26 +32866,6 @@ /obj/structure/railing, /turf/open/space/openspace, /area/space/nearstation) -"jtS" = ( -/obj/machinery/vending/autodrobe, -/obj/item/clothing/head/cone{ - pixel_x = 18; - pixel_y = 7 - }, -/obj/item/clothing/head/cone{ - pixel_x = 18; - pixel_y = 7 - }, -/obj/item/clothing/head/cone{ - pixel_x = 18; - pixel_y = 7 - }, -/obj/item/plunger{ - pixel_x = 12; - pixel_y = -7 - }, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "jtT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -32634,9 +32911,45 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/break_room) -"juh" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +"jui" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 4; + pixel_y = 7 + }, +/obj/machinery/camera/autoname/directional/south, +/obj/machinery/light/directional/south, +/obj/machinery/button/door/directional/south{ + id = "kitchen_service"; + name = "Kitchen Window Shutters"; + pixel_x = 6; + req_access = list("kitchen") + }, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"juj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) "juo" = ( @@ -32659,6 +32972,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"juq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jur" = ( /obj/structure/table, /obj/effect/turf_decal/siding/dark{ @@ -32689,14 +33011,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"juM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) "juP" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -32728,6 +33042,24 @@ }, /turf/open/space/openspace, /area/space/nearstation) +"jvb" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/security_all, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"jvd" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "jvf" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -32783,11 +33115,6 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) -"jvZ" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/smooth, -/area/station/engineering/main) "jwa" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/central) @@ -32905,10 +33232,6 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/starboard/lesser) -"jxs" = ( -/obj/machinery/light/floor, -/turf/open/floor/carpet/black, -/area/station/service/theater) "jxt" = ( /obj/structure/ladder, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -32975,21 +33298,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"jxZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/end{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "jyd" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -32999,10 +33307,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"jyg" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/openspace, -/area/station/service/kitchen) +"jyk" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Quarters" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "jyl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing, @@ -33077,11 +33389,6 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/central) -"jyP" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil/thirty, -/turf/open/space/basic, -/area/space/nearstation) "jyW" = ( /obj/structure/table, /obj/item/shard{ @@ -33101,13 +33408,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/dorms) -"jzj" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "jzx" = ( /obj/machinery/vending/wardrobe/law_wardrobe, /obj/machinery/firealarm/directional/east, @@ -33185,6 +33485,14 @@ }, /turf/open/openspace, /area/station/engineering/break_room) +"jAh" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "jAo" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -33238,6 +33546,13 @@ }, /turf/open/floor/iron/edge, /area/station/hallway/primary/fore) +"jAW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "jBb" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -33287,11 +33602,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"jBB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "jBI" = ( /obj/structure/cable, /obj/structure/table, @@ -33307,6 +33617,11 @@ /obj/structure/flora/tree/jungle, /turf/open/floor/grass, /area/station/hallway/primary/starboard) +"jBU" = ( +/obj/item/reagent_containers/cup/glass/mug/tea, +/obj/structure/table/wood, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "jBW" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -33326,16 +33641,6 @@ }, /turf/open/openspace, /area/station/command/gateway) -"jCa" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/hallway/primary/central) -"jCk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "jCt" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -33401,10 +33706,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"jCN" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "jCO" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -33426,6 +33727,16 @@ /obj/item/surgicaldrill, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"jCW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "jDe" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -33475,6 +33786,15 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/smooth_corner, /area/station/engineering/main) +"jDn" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "jDq" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/trunk/multiz/down{ @@ -33487,15 +33807,6 @@ /obj/effect/spawner/random/clothing/wardrobe_closet_colored, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"jDt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "jDx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -33522,6 +33833,22 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat_interior) +"jDO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "jDW" = ( /obj/structure/table, /obj/item/burner/fuel{ @@ -33556,6 +33883,21 @@ "jEm" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/foyer) +"jEr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) +"jEv" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "jEw" = ( /obj/effect/turf_decal/tile/dark/fourcorners, /turf/open/floor/iron/dark, @@ -33566,6 +33908,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"jEy" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/red_alert_access, +/turf/open/floor/iron/dark, +/area/station/security/eva) "jEz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4; @@ -33644,6 +33999,11 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/lab) +"jFI" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "jFU" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -33664,27 +34024,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"jGa" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/table/wood, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = -13 - }, -/obj/item/stack/package_wrap{ - pixel_x = -2; - pixel_y = -13 - }, -/obj/item/holosign_creator/robot_seat/bar{ - pixel_y = -20 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "jGh" = ( /obj/machinery/computer/records/security, /obj/machinery/light/directional/north, @@ -33697,12 +34036,6 @@ /obj/effect/spawner/random/structure/table_or_rack, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"jGm" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) "jGq" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -33819,15 +34152,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/cryo) -"jIj" = ( -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "jIs" = ( /obj/structure/table/glass, /turf/open/floor/wood, @@ -33867,6 +34191,22 @@ }, /turf/open/openspace, /area/station/medical/storage) +"jIO" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/trash/can{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "jIX" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -33916,6 +34256,12 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"jJE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "jJH" = ( /obj/structure/chair/comfy/carp{ dir = 1; @@ -34091,33 +34437,11 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"jLH" = ( -/obj/machinery/button/door/directional/south{ - id = "ceprivacy"; - name = "Privacy Shutters Control"; - pixel_y = 8 +"jLY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/obj/machinery/button/door/directional/west{ - id = "transitlockdown"; - name = "Transit Tube Lockdown"; - pixel_x = 0; - pixel_y = -8 - }, -/obj/machinery/button/door{ - id = "securestoragecw"; - name = "Secure Storage" - }, -/obj/structure/table/reinforced, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"jLV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/turf/open/floor/wood/large, +/turf/open/floor/glass, /area/station/service/kitchen) "jMi" = ( /obj/machinery/camera/autoname/directional/south, @@ -34135,6 +34459,10 @@ /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/commons/vacant_room/office) +"jML" = ( +/obj/effect/decal/cleanable/confetti, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jMO" = ( /obj/structure/lattice/catwalk, /obj/structure/table/reinforced, @@ -34185,14 +34513,6 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"jNT" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/oven{ - pixel_y = -3 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "jOe" = ( /obj/structure/railing{ dir = 4 @@ -34225,16 +34545,6 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"jOl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/effect/turf_decal/siding/dark/end{ - dir = 4 - }, -/turf/open/floor/iron/kitchen, -/area/station/hallway/secondary/service) "jOE" = ( /turf/closed/wall, /area/station/service/lawoffice) @@ -34251,13 +34561,6 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/hallway/primary/starboard) -"jPb" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "jPh" = ( /obj/structure/broken_flooring/pile/directional/south, /turf/open/floor/plating, @@ -34303,15 +34606,13 @@ /obj/machinery/light/floor, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"jQb" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/landmark/navigate_destination/kitchen, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) +"jQe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/blacklight/directional/south, +/obj/item/kirbyplants/random/fullysynthetic, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/carpet/stellar, +/area/station/maintenance/hallway/abandoned_recreation) "jQn" = ( /obj/effect/turf_decal/siding/green/corner{ dir = 4 @@ -34396,14 +34697,6 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"jRK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 8 - }, -/area/station/commons/lounge) "jRL" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -34413,6 +34706,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai) +"jRW" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/space_heater, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "jRZ" = ( /obj/structure/table/wood, /obj/effect/spawner/random/bureaucracy/paper, @@ -34519,6 +34817,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) +"jTD" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "jTO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -34553,38 +34856,6 @@ "jUe" = ( /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/exit/departure_lounge) -"jUg" = ( -/obj/machinery/barsign{ - pixel_y = 32 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) -"jUh" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/machinery/reagentgrinder{ - pixel_x = -6; - pixel_y = 6 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) -"jUp" = ( -/obj/structure/table, -/obj/machinery/status_display/ai/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "jUt" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/light/directional/south, @@ -34637,14 +34908,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/openspace, /area/station/maintenance/hallway/abandoned_recreation) -"jVp" = ( -/obj/structure/table/wood/poker, -/obj/item/reagent_containers/cup/soda_cans/cola{ - pixel_x = -4; - pixel_y = 9 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "jVs" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/very_dim/directional/north, @@ -34663,6 +34926,13 @@ "jVB" = ( /turf/closed/wall/r_wall, /area/station/engineering/gravity_generator) +"jVI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/lounge) "jVP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -34795,39 +35065,21 @@ /obj/structure/ladder, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"jXl" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydropony_shutters"; - name = "Hydropony's Shutters" - }, -/obj/item/paper{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "jXm" = ( /obj/structure/ladder, /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/delivery, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/qm) -"jXz" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) +"jXC" = ( +/obj/structure/table, +/obj/item/instrument/eguitar{ + pixel_y = 5 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "jXX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -34885,21 +35137,17 @@ /obj/machinery/photocopier/prebuilt, /turf/open/floor/iron, /area/station/cargo/storage) -"jYG" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Access" +"jYE" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/toolbox/fishing, +/obj/item/storage/box/lights/mixed{ + pixel_x = -8; + pixel_y = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/command/minisat, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/obj/effect/landmark/navigate_destination/minisat_access_ai, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) +/obj/structure/lattice/catwalk, +/turf/open/water, +/area/station/maintenance/port/fore) "jYI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34926,6 +35174,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"jYS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "jZc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -34977,40 +35234,6 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat/foyer) -"kaG" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/landmark/start/bartender, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) -"kaH" = ( -/obj/item/reagent_containers/cup/soup_pot{ - pixel_x = 6; - pixel_y = 16 - }, -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_x = -6; - pixel_y = 14 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"kaM" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "kaN" = ( /obj/structure/cable, /obj/effect/decal/cleanable/crayon{ @@ -35090,18 +35313,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"kbU" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "kci" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -35110,10 +35321,24 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/explab) +"kcn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/station_alert, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/atmos/project) "kcs" = ( /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"kcu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/sign/warning/electric_shock/directional/west, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "kcx" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -35144,11 +35369,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"kdh" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/module_duplicator, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/service/library) "kdl" = ( /turf/open/floor/wood, /area/station/service/chapel) @@ -35419,13 +35639,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"kgZ" = ( -/obj/structure/chair{ - dir = 4; - pixel_y = -2 - }, -/turf/open/floor/wood, -/area/station/service/library) "khi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35442,6 +35655,10 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"kho" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "khC" = ( /obj/machinery/plumbing/receiver{ dir = 1 @@ -35562,6 +35779,13 @@ /obj/structure/sign/poster/ripped/directional/north, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"kjF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "kjH" = ( /obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/box/red, @@ -35569,18 +35793,15 @@ dir = 4 }, /area/station/science/ordnance/storage) -"kjK" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/rnd/production/techfab/department/service, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "kjN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"kjQ" = ( +/obj/machinery/light/directional/west, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/hallway) "kka" = ( /obj/effect/turf_decal/tile/bar{ dir = 8 @@ -35634,16 +35855,6 @@ /obj/machinery/computer/security/telescreen/rd/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"kkH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "kkM" = ( /obj/effect/turf_decal/siding, /obj/effect/turf_decal/trimline/white/line{ @@ -35657,11 +35868,6 @@ }, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) -"kkQ" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "kkT" = ( /obj/structure/railing/corner/end/flip{ dir = 4 @@ -35702,10 +35908,25 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"klp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +"kle" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/item/book/manual/wiki/cooking_to_serve_man{ + pixel_x = -4; + pixel_y = 6 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"kll" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library) "klx" = ( /obj/structure/table, /obj/machinery/status_display/ai/directional/north, @@ -35755,6 +35976,17 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"klJ" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) +"kmb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "kmh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner/end/flip{ @@ -35767,6 +35999,12 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/station/engineering/lobby) +"kmr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/lattice/catwalk, +/turf/open/water, +/area/station/maintenance/starboard/fore) "kmD" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -35871,6 +36109,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/security/armory) +"kns" = ( +/obj/effect/spawner/random/maintenance/two, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "kny" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -35975,6 +36218,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"koM" = ( +/obj/structure/table/wood/poker, +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "koU" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -36002,10 +36254,6 @@ }, /turf/open/openspace, /area/station/medical/storage) -"kpc" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "kpz" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -36026,11 +36274,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"kpJ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/port/aft) "kpS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -36363,6 +36606,13 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"ktL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/glass, +/area/station/service/kitchen) "ktZ" = ( /obj/structure/closet/crate/trashcart/filled, /obj/effect/decal/cleanable/dirt, @@ -36405,16 +36655,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"kul" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "kup" = ( /obj/structure/cable, /obj/effect/decal/cleanable/blood/old, @@ -36429,18 +36669,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/openspace, /area/station/construction/storage_wing) -"kus" = ( -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "kuv" = ( /mob/living/carbon/human/species/monkey, /obj/structure/flora/bush/sparsegrass/style_random, @@ -36482,19 +36710,6 @@ /obj/structure/lattice/catwalk, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"kve" = ( -/obj/machinery/vending/wardrobe/jani_wardrobe, -/obj/item/reagent_containers/cup/bucket{ - pixel_x = -7; - pixel_y = -13 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "kvl" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -36541,6 +36756,12 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"kvF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "kvH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/security{ @@ -36840,6 +37061,13 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/science/lobby) +"kzC" = ( +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/station/service/library) "kzD" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -36897,18 +37125,20 @@ /obj/structure/chair/comfy, /turf/open/openspace, /area/station/maintenance/port/aft) -"kAx" = ( -/obj/machinery/door/airlock/engineering{ - name = "Telecomms Storage" +"kAv" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/machinery/camera/directional/north{ + c_tag = "Telecomms - Storage" + }, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/engineering/storage/tcomms) "kAy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36934,13 +37164,16 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "kAY" = ( -/obj/structure/closet/secure_closet/bar, -/obj/item/storage/box/rubbershot, -/obj/effect/turf_decal/tile/dark_green{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/light/warm/dim/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "kAZ" = ( /obj/machinery/newscaster/directional/north, /obj/machinery/light/directional/north, @@ -36990,10 +37223,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"kBx" = ( -/obj/structure/table/wood/poker, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "kBA" = ( /obj/structure/mirror/directional/north{ pixel_y = 31 @@ -37013,13 +37242,6 @@ "kBF" = ( /turf/open/floor/engine/hull/air, /area/station/hallway/primary/aft) -"kBG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/hallway) "kCp" = ( /obj/structure/lattice, /turf/open/openspace, @@ -37048,6 +37270,20 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"kCP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "kDa" = ( /obj/structure/disposalpipe/segment, /obj/structure/railing/corner/end{ @@ -37142,6 +37378,18 @@ dir = 8 }, /area/station/tcommsat/server) +"kEn" = ( +/obj/structure/stairs/east, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/hallway/primary/central) "kEq" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4 @@ -37192,22 +37440,25 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"kFh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair{ - dir = 8; - pixel_y = -2 - }, -/turf/open/floor/wood, -/area/station/service/library) +"kFg" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "kFi" = ( /obj/structure/railing/corner/end{ dir = 4 }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"kFr" = ( +/obj/structure/table, +/obj/machinery/coffeemaker, +/obj/item/reagent_containers/cup/coffeepot, +/obj/item/storage/box/coffeepack, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "kFt" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37239,15 +37490,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"kFS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/engineering, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "kGD" = ( /obj/machinery/air_sensor/nitrogen_tank, /obj/structure/window/reinforced/plasma/spawner/directional/south, @@ -37281,20 +37523,18 @@ }, /turf/open/openspace, /area/station/maintenance/port) -"kHg" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "kHj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"kHv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library) "kHw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -37323,6 +37563,11 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) +"kHK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/space/openspace, +/area/space/nearstation) "kHU" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -37359,6 +37604,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"kIy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "kIz" = ( /obj/effect/landmark/start/detective, /obj/structure/chair/comfy/brown{ @@ -37366,12 +37618,6 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) -"kIH" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "kIW" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -37442,6 +37688,12 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/station/science/breakroom) +"kKr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "kKw" = ( /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, @@ -37470,17 +37722,6 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"kKS" = ( -/obj/machinery/light_switch/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "kLe" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -37494,9 +37735,24 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, /area/station/cargo/storage) +"kLs" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/openspace, +/area/station/engineering/atmos/project) "kLD" = ( /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"kLF" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, +/obj/structure/chair/sofa/middle/brown{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "kLH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -37559,13 +37815,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/port) -"kMF" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) "kMI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/fax{ @@ -37626,37 +37875,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"kOc" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) -"kOf" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/effect/turf_decal/siding/dark{ - dir = 10 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"kOh" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "kOk" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -37721,18 +37939,6 @@ }, /turf/open/floor/wood/tile, /area/station/science/robotics) -"kOZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/kitchen) "kPd" = ( /obj/machinery/conveyor{ dir = 4; @@ -37769,6 +37975,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"kPH" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "kPI" = ( /obj/structure/table/wood, /obj/item/storage/briefcase/secure{ @@ -37887,41 +38098,16 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"kQx" = ( -/obj/machinery/button/door/directional/east{ - id = "commissarydoor"; - name = "Commissary Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - pixel_y = 5; - specialfunctions = 4 +"kQn" = ( +/obj/structure/sign/picture_frame/portrait{ + pixel_y = 33 + }, +/obj/machinery/computer/libraryconsole{ + dir = 8 }, /obj/structure/table, -/obj/machinery/button/ticket_machine{ - id = "ticket_machine_comissary"; - pixel_x = 23; - pixel_y = -4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/item/paper_bin{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/machinery/button/door/directional/east{ - id = "actualcommissaryshutter"; - name = "Commissary Shutters"; - pixel_x = 34 - }, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) +/turf/open/floor/iron/dark/smooth_edge, +/area/station/service/library) "kQy" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -37983,6 +38169,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) +"kRv" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Mix" + }, +/obj/effect/turf_decal/tile/neutral/full, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "kRD" = ( /obj/effect/spawner/random/vending/snackvend, /obj/structure/disposalpipe/segment{ @@ -38010,11 +38204,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) -"kRS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "kSc" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -38070,6 +38259,11 @@ }, /turf/open/floor/grass, /area/station/hallway/primary/starboard) +"kSP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "kSS" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -38086,6 +38280,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kSZ" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "kTi" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) @@ -38143,6 +38342,10 @@ /obj/structure/table, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"kTW" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "kUf" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -38150,10 +38353,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/upper) -"kUm" = ( -/obj/structure/sign/poster/contraband/hacking_guide/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "kUq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port) @@ -38164,9 +38363,33 @@ }, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) +"kUD" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/medical_all, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"kUI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "kUO" = ( /turf/open/openspace, /area/station/security/courtroom) +"kUU" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "kUW" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ @@ -38348,20 +38571,11 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"kXe" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "kXt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/upper) -"kXy" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/medical_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "kXB" = ( /obj/effect/turf_decal/delivery, /obj/structure/table, @@ -38481,6 +38695,10 @@ /obj/structure/flora/grass/jungle/b/style_5, /turf/open/floor/grass, /area/station/ai_monitored/turret_protected/aisat_interior) +"kZl" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/freezer, +/area/station/engineering/atmos/pumproom) "kZo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -38633,6 +38851,11 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) +"lbx" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "lbD" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -38681,22 +38904,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"lcb" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark/arrow_cw{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "lce" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38766,16 +38973,11 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"ldL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - n2o Cell"; - name = "atmospherics camera" - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) +"ldN" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/oven/range, +/turf/open/openspace, +/area/station/service/kitchen) "ldX" = ( /obj/machinery/door/airlock{ id_tag = "commissarydoor"; @@ -38825,6 +39027,19 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"leB" = ( +/obj/structure/transport/linear/public, +/obj/structure/table, +/obj/item/plate{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/plate{ + pixel_x = -11; + pixel_y = -2 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/service/kitchen) "leD" = ( /obj/machinery/computer/message_monitor{ dir = 1 @@ -38842,24 +39057,6 @@ "leL" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) -"leN" = ( -/obj/structure/table, -/obj/machinery/requests_console/directional/west{ - department = "Kitchen"; - name = "Kitchen Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/processor{ - pixel_x = -4; - pixel_y = 13 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 5 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "leR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38895,18 +39092,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/security/armory) -"lfk" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/siding/dark/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lfx" = ( /obj/effect/landmark/event_spawn, /turf/open/openspace, @@ -38935,14 +39120,6 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/starboard/aft) -"lfX" = ( -/obj/structure/chair{ - dir = 8; - pixel_y = -2 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/station/service/library) "lgb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -38950,14 +39127,10 @@ "lge" = ( /turf/open/floor/wood, /area/station/engineering/lobby) -"lgj" = ( -/obj/structure/stairs/east, -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/hallway/primary/central) +"lgi" = ( +/obj/structure/chair/office, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "lgo" = ( /obj/item/storage/box/silver_ids{ pixel_x = -4; @@ -38977,6 +39150,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"lgq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "lgv" = ( /obj/item/hfr_box/corner{ pixel_x = -10; @@ -39050,13 +39229,14 @@ /obj/structure/cable, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"lhX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 +"lhE" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "lhY" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/conveyor{ @@ -39137,6 +39317,19 @@ "lji" = ( /turf/closed/wall/r_wall, /area/station/security/evidence) +"ljt" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "ljx" = ( /obj/structure/tank_holder/extinguisher, /obj/effect/turf_decal/trimline/purple/filled/line, @@ -39173,6 +39366,15 @@ /obj/structure/closet/crate/cardboard, /turf/open/openspace, /area/station/maintenance/port/aft) +"lki" = ( +/obj/structure/ladder, +/turf/open/floor/plating, +/area/station/solars/starboard/fore) +"lkj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/water, +/area/station/maintenance/port/fore) "lkt" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -39203,14 +39405,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"llg" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) "llh" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4 @@ -39263,6 +39457,25 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"llS" = ( +/obj/machinery/door/poddoor/preopen{ + id = "ceprivacy"; + name = "Chief Engineers Privacy Shutters" + }, +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"llY" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "lmc" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/siding/purple{ @@ -39322,12 +39535,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"lmJ" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "lmL" = ( /obj/structure/chair/sofa/left/brown, /obj/item/instrument/guitar{ @@ -39335,6 +39542,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"lmN" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "lmT" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, @@ -39360,10 +39574,6 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"lnf" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "lng" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -39393,15 +39603,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/textured, /area/station/cargo/storage) -"lnL" = ( -/obj/structure/closet/crate/freezer, -/obj/item/food/grown/tomato, -/obj/item/food/grown/tomato, -/obj/item/food/grown/tomato, -/obj/item/food/grown/tomato, -/obj/item/food/grown/tomato, -/turf/open/floor/wood, -/area/station/service/library) "lnO" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -39483,6 +39684,13 @@ /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"loW" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/warning/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "lpc" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -39499,14 +39707,6 @@ /obj/structure/fake_stairs/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"lpw" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma to Port" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "lpG" = ( /obj/machinery/door/poddoor/massdriver_chapel, /obj/machinery/atmos_shield_gen/active{ @@ -39661,6 +39861,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"lro" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "lrp" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -39675,23 +39881,19 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"lrF" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) -"lrG" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 +"lrA" = ( +/obj/machinery/computer/station_alert{ + dir = 1 }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) +"lrJ" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "lrM" = ( /obj/structure/cable, /turf/open/floor/engine/hull, @@ -39699,27 +39901,6 @@ "lrT" = ( /turf/open/floor/glass, /area/station/maintenance/starboard/lesser) -"lrW" = ( -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass/fifty, -/obj/structure/closet/crate/engineering/electrical, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "lse" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -39740,14 +39921,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/glass/reinforced/airless, /area/station/solars/starboard/aft) -"lsu" = ( -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lsA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -39815,22 +39988,6 @@ "lul" = ( /turf/closed/wall/r_wall, /area/space/nearstation) -"lup" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/warm/dim/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "luw" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -39868,25 +40025,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/engine/hull/air, /area/station/command/meeting_room/council) -"lvs" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/turf_decal/siding/dark{ - dir = 6 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/item/holosign_creator/robot_seat/restaurant{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/stack/package_wrap, -/obj/item/rag{ - pixel_x = -4 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lvv" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/east, /obj/structure/disposalpipe/segment{ @@ -39942,17 +40080,33 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"lwT" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ - dir = 1 - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos/upper) +"lwX" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) +"lxh" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "lxl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"lxn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/box/corners, +/obj/item/toy/crayon/spraycan, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "lxs" = ( /obj/effect/turf_decal/trimline/yellow/corner, /obj/item/storage/toolbox/electrical{ @@ -40003,6 +40157,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) +"lxS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/floor/carpet/stellar, +/area/station/maintenance/hallway/abandoned_recreation) "lxW" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -40028,6 +40187,10 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"lys" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/engine, +/area/station/service/hydroponics) "lyw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40106,18 +40269,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/science/research) -"lyQ" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "lyX" = ( /obj/machinery/door/airlock/highsecurity{ name = "AI Chamber" @@ -40210,6 +40361,23 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"lAF" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/obj/machinery/requests_console/directional/south{ + department = "Bar"; + name = "Bar Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/checker, +/area/station/service/bar) "lAG" = ( /obj/structure/railing{ dir = 8 @@ -40276,6 +40444,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"lAW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/holopad, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "lBg" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -40286,6 +40462,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"lBh" = ( +/obj/machinery/portable_atmospherics/canister/water_vapor, +/obj/machinery/firealarm/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "lBi" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -40363,15 +40548,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"lBW" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 1 - }, -/area/station/commons/lounge) "lBX" = ( /obj/machinery/quantum_server, /obj/effect/decal/cleanable/dirt/dust, @@ -40412,18 +40588,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"lCJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "lCO" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -40469,15 +40633,6 @@ dir = 8 }, /area/station/ai_monitored/turret_protected/ai) -"lDh" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "Plasma Multideck Adapter" - }, -/obj/machinery/meter{ - name = "Plasma meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "lDj" = ( /obj/structure/chair/office{ dir = 1 @@ -40526,14 +40681,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"lEj" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/effect/landmark/start/atmospheric_technician, -/obj/machinery/light/directional/south, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "lEo" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/yellow/arrow_ccw{ @@ -40573,6 +40720,18 @@ dir = 1 }, /area/station/cargo/bitrunning/den) +"lEG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "lEJ" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "SM_shutters"; @@ -40638,12 +40797,6 @@ "lFm" = ( /turf/closed/wall, /area/station/security/range) -"lFz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) "lFB" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ dir = 8 @@ -40687,12 +40840,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai) -"lGc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/hallway/secondary/service) "lGy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -40719,6 +40866,11 @@ }, /turf/open/floor/iron/textured, /area/station/cargo/storage) +"lGF" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "lGT" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -40742,21 +40894,19 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"lHo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "lHp" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"lHs" = ( -/obj/machinery/light/warm/dim/directional/west, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/dark{ - dir = 9 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lHx" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -40767,6 +40917,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) +"lHE" = ( +/obj/machinery/holopad, +/turf/open/floor/glass, +/area/station/service/kitchen) "lHK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -40806,13 +40960,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lIm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/computer/atmos_control/air_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "lIp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -40827,17 +40974,6 @@ "lIr" = ( /turf/closed/wall, /area/station/maintenance/port/aft) -"lIw" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "Plasma Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "Plasma meter" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "lIA" = ( /obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/plating, @@ -40929,6 +41065,12 @@ }, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"lJM" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "lJQ" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 4 @@ -40953,15 +41095,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) -"lKB" = ( -/obj/machinery/portable_atmospherics/canister/water_vapor, -/obj/machinery/firealarm/directional/south, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "lKK" = ( /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, @@ -40998,16 +41131,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"lLg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "lLh" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/table/glass, @@ -41030,18 +41153,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lLl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "lLs" = ( /turf/open/floor/engine/hull/air, /area/station/science/research) +"lLu" = ( +/obj/machinery/power/tracker, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "lLy" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -41065,10 +41184,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"lLL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "lLY" = ( /obj/effect/turf_decal/siding/thinplating_new, /obj/effect/turf_decal/loading_area{ @@ -41081,6 +41196,14 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/commons/dorms) +"lMf" = ( +/obj/structure/sink/directional/east, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/bar, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "lMt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/oil, @@ -41129,17 +41252,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/security/prison) -"lMN" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/obj/machinery/light/dim/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "lMS" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -41184,6 +41296,10 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"lNg" = ( +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "lNj" = ( /obj/machinery/computer/records/security{ dir = 1 @@ -41252,9 +41368,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"lNY" = ( -/turf/open/floor/carpet/black, -/area/station/service/library/private) "lNZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -41297,11 +41410,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lOi" = ( -/obj/structure/sign/poster/official/get_your_legs/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "lOy" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -41463,18 +41571,6 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/floor/plating, /area/station/security/brig) -"lRn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "lRp" = ( /obj/item/storage/box/lights/mixed, /obj/structure/cable, @@ -41509,13 +41605,15 @@ /obj/item/stack/spacecash/c1, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lRB" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_corner, -/area/station/commons/lounge) +"lRM" = ( +/obj/structure/cable, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "lRP" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 8 @@ -41544,17 +41642,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics) -"lSC" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "lSH" = ( /obj/structure/cable, /obj/structure/table, @@ -41600,16 +41687,28 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) -"lTy" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/obj/effect/turf_decal/tile/green/full, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/hydroponics{ - name = "Hydroponics" +"lTx" = ( +/obj/structure/closet/crate/wooden{ + desc = "Used for storing props for a stage play!."; + name = "Space Station 27 Props" }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/collectable/captain, +/obj/item/disk/nuclear/fake/obvious, +/obj/item/clothing/head/collectable/hos, +/obj/item/toy/gun, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/clothing/head/collectable/xenom, +/obj/item/clothing/head/collectable/hardhat, +/obj/item/clothing/head/collectable/police, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "lTA" = ( /obj/effect/turf_decal/siding/brown{ dir = 4 @@ -41623,21 +41722,35 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"lTB" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/rack, +/obj/item/radio{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/radio{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/radio, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "lTD" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"lTE" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - co2 Cell"; + name = "atmospherics camera" + }, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "lTH" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/security/courtroom) -"lTX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "lUk" = ( /obj/structure/railing, /obj/structure/cable, @@ -41744,6 +41857,15 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"lVv" = ( +/obj/machinery/fax{ + fax_name = "Psychology Office"; + name = "Psychology Office Fax Machine" + }, +/obj/structure/table, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "lVA" = ( /obj/machinery/meter, /obj/structure/cable, @@ -41826,13 +41948,6 @@ }, /turf/open/openspace, /area/station/maintenance/port/fore) -"lWy" = ( -/obj/machinery/light_switch/directional/south{ - pixel_y = -24 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "lWK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41872,20 +41987,6 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"lXr" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/computer/order_console/cook, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "lXz" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, @@ -41937,6 +42038,17 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lXU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/button/elevator/directional/east{ + id = "catwalk_atmos"; + name = "Elevator Button" + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/project) "lXX" = ( /obj/machinery/stasis, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -42031,24 +42143,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lZc" = ( -/obj/effect/landmark/start/bartender, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/checker, -/area/station/service/bar) -"lZh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "lZj" = ( /obj/structure/lattice/catwalk, /obj/structure/sign/poster/contraband/clown/directional/south, @@ -42238,15 +42332,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"mcr" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "mcB" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy{ @@ -42379,12 +42464,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"mdZ" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/service/library) "mek" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/biogenerator, @@ -42441,6 +42520,11 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"mev" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "meE" = ( /obj/machinery/camera/autoname/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -42525,6 +42609,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"mfA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "mfD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -42559,12 +42649,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"mgj" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "mgu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42697,19 +42781,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) -"min" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "mip" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -42816,6 +42887,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"mkd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/banner/red{ + inspiration_available = 0 + }, +/turf/open/floor/circuit/red, +/area/station/maintenance/hallway/abandoned_recreation) "mke" = ( /obj/structure/table, /obj/item/binoculars, @@ -42873,13 +42951,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"mkV" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "mlL" = ( /obj/structure/kitchenspike, /obj/machinery/power/apc/auto_name/directional/west, @@ -42897,17 +42968,15 @@ /obj/machinery/vending/cigarette, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"mmn" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +"mmi" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Holodeck - Fore"; + name = "holodeck camera" }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood/large, -/area/station/commons/lounge) +/area/station/holodeck/rec_center) "mmq" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -42925,15 +42994,17 @@ /obj/structure/cable, /turf/open/openspace, /area/station/engineering/atmos/project) -"mmM" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/broken_flooring/side/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "mmS" = ( /obj/machinery/light/small/broken, /turf/closed/wall/r_wall, /area/station/maintenance/central) +"mmU" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/painting/large/library, +/turf/open/openspace, +/area/station/maintenance/port/fore) "mmX" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 1 @@ -43033,6 +43104,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"moE" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/turf/open/floor/wood/large, +/area/station/service/bar) "moI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43090,6 +43166,19 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/carpet, /area/station/commons/storage/tools) +"mpz" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/obj/machinery/meter{ + name = "C02 meter" + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "CO2 Multideck Adapter"; + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "mpB" = ( /obj/machinery/door/airlock/command{ name = "Gateway Atrium" @@ -43172,28 +43261,11 @@ /obj/item/stack/rods/two, /turf/open/space/basic, /area/space/nearstation) -"mqD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydropony_shutters"; - name = "Hydroponics Shutters" - }, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - req_access = list("hydroponics"); - name = "Hydroponics Desk" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) +"mqJ" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/wood/large, +/area/station/service/library) "mqK" = ( /obj/structure/chair{ dir = 8 @@ -43216,6 +43288,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"mqU" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "mqY" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -43234,6 +43312,26 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mrj" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) +"mrp" = ( +/obj/structure/transport/linear/public, +/obj/structure/table, +/obj/item/plate{ + pixel_x = 6 + }, +/obj/item/plate{ + pixel_x = -13; + pixel_y = 8 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/service/kitchen) "mrq" = ( /obj/structure/chair/sofa/corner/brown{ dir = 1 @@ -43275,6 +43373,13 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"mrQ" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "mrS" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -43291,19 +43396,6 @@ dir = 1 }, /area/station/science/robotics/lab) -"msh" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler{ - pixel_y = 11 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "msm" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -43340,6 +43432,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"msH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "msK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/effect/spawner/structure/window/reinforced, @@ -43349,6 +43450,10 @@ /obj/structure/sign/poster/official/soft_cap_pop_art/directional/west, /turf/open/openspace, /area/station/maintenance/starboard/fore) +"mth" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/service/library) "mtl" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/item/toy/plush/moth{ @@ -43422,6 +43527,13 @@ /obj/structure/closet/crate/goldcrate, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/command/nuke_storage) +"mtJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "mtP" = ( /obj/item/knife/kitchen{ pixel_x = 10; @@ -43512,13 +43624,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) -"muE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "muF" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/north, @@ -43555,17 +43660,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) -"muV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "muW" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2{ dir = 8 @@ -43605,18 +43699,10 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/chapel, /area/station/service/chapel) -"mvL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) +"mvH" = ( +/obj/machinery/holopad, +/turf/open/floor/wood/large, +/area/station/service/library) "mwd" = ( /obj/structure/railing/corner{ dir = 1 @@ -43640,23 +43726,19 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) -"mwl" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 4 - }, -/area/station/commons/lounge) "mwm" = ( /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mwn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "mwr" = ( /turf/closed/wall, /area/station/security/evidence) @@ -43671,6 +43753,11 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/lawoffice) +"mwF" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/warning/fire/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "mwL" = ( /obj/effect/turf_decal/bot_white/left, /turf/open/floor/iron/dark/textured_large, @@ -43796,6 +43883,9 @@ "myx" = ( /turf/closed/wall, /area/station/service/library/private) +"myC" = ( +/turf/closed/wall, +/area/station/solars/starboard/fore) "myD" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -43826,6 +43916,13 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"mza" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/engineering/atmos/project) "mzh" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -43920,17 +44017,6 @@ /obj/item/clothing/head/costume/shrine_wig, /turf/open/floor/plating/airless, /area/space/nearstation) -"mAY" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/shutters{ - id = "actualcommissaryshutter"; - name = "Vacant Commissary Shutter" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "mBb" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/large, @@ -43963,6 +44049,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"mBW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "mBY" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -43993,29 +44090,17 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"mCo" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 +"mCw" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/iron/dark/smooth_large, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, /area/station/commons/lounge) -"mCJ" = ( -/obj/item/paint/red{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/paint/black{ - pixel_x = 4; - pixel_y = 12 - }, -/obj/item/paint/blue{ - pixel_x = 9; - pixel_y = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "mCM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -44041,6 +44126,17 @@ "mDk" = ( /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"mDm" = ( +/obj/item/trash/can{ + pixel_x = -8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "mDo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -44049,11 +44145,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"mDq" = ( -/obj/effect/spawner/random/maintenance/two, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "mDv" = ( /obj/machinery/vending/coffee{ pixel_x = -3 @@ -44062,17 +44153,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/wood, /area/station/command/meeting_room/council) -"mDy" = ( -/obj/structure/closet/secure_closet/hydroponics, -/obj/machinery/button/door/directional/north{ - id = "hydropony_shutters"; - name = "hydroponics shutters control"; - pixel_x = 10; - pixel_y = 30; - req_access = list("hydroponics") - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) "mDz" = ( /obj/structure/railing{ dir = 1 @@ -44146,9 +44226,25 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"mEh" = ( -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) +"mDZ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/hallway/primary/central) +"mEk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "mEv" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/firealarm_sanity, @@ -44195,6 +44291,11 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) +"mFU" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/south, +/obj/machinery/air_sensor/plasma_tank, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos/upper) "mGb" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -44210,6 +44311,15 @@ /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"mGh" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "mGx" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -44254,17 +44364,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"mHz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/wood{ - name = "Event Storage" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/machinery/door/firedoor, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "mHC" = ( /obj/structure/table, /obj/item/camera, @@ -44288,6 +44387,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"mHJ" = ( +/obj/structure/table, +/obj/item/paint_palette{ + pixel_y = 11 + }, +/turf/open/floor/wood, +/area/station/service/library) "mHK" = ( /obj/structure/disposalpipe/trunk/multiz/down{ dir = 8 @@ -44317,6 +44423,15 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"mHY" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "mHZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/east, @@ -44331,17 +44446,6 @@ "mId" = ( /turf/open/floor/iron/freezer, /area/station/engineering/atmos/pumproom) -"mIg" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "mIi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -44384,17 +44488,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/cargo/miningoffice) -"mIE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) "mIJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/full, @@ -44419,13 +44512,6 @@ /obj/structure/ladder, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/command/nuke_storage) -"mIR" = ( -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "mIX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/frame/computer{ @@ -44500,16 +44586,14 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mJJ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/commons/lounge) "mJL" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"mJQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "mKk" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plating, @@ -44552,11 +44636,27 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mKK" = ( +/obj/machinery/light/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "mKN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"mKO" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/sink/kitchen/directional/west, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "mKV" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, @@ -44579,12 +44679,6 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mLk" = ( -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "mLl" = ( /obj/machinery/vending/cigarette, /turf/open/floor/carpet, @@ -44617,6 +44711,14 @@ "mLS" = ( /turf/open/openspace, /area/station/engineering/break_room) +"mLZ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "mMb" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -44658,13 +44760,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"mMW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Bar & Restaurant" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/lounge) "mMX" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -44676,6 +44771,17 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"mNn" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/landmark/start/janitor, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "mNp" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -44693,19 +44799,6 @@ }, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"mNK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/effect/turf_decal/siding/dark_green/end{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/checker, -/area/station/hallway/secondary/service) "mNN" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment{ @@ -44746,16 +44839,6 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) -"mOv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "mOx" = ( /obj/structure/bed/dogbed/runtime, /obj/item/toy/figure/cmo{ @@ -44829,18 +44912,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"mPi" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/item/newspaper{ - pixel_y = 2 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "mPn" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/plating, @@ -44851,6 +44922,15 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) +"mPB" = ( +/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) "mPP" = ( /obj/structure/table/wood, /obj/item/radio/intercom, @@ -44864,10 +44944,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"mPT" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/black, -/area/station/service/theater) "mPV" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -44995,6 +45071,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"mSt" = ( +/obj/effect/landmark/start/mime, +/turf/open/floor/carpet/black, +/area/station/service/theater) "mSA" = ( /obj/structure/bed, /obj/item/bedsheet/qm, @@ -45063,10 +45143,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"mTz" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/engineering/atmos/upper) +"mTx" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) "mTH" = ( /obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating/airless, @@ -45119,12 +45204,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"mUF" = ( -/obj/item/kirbyplants/random, -/obj/structure/sign/poster/official/random/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "mUN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -45141,6 +45220,26 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/hallway) +"mUY" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/cable, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"mVa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "mVm" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, @@ -45161,9 +45260,6 @@ }, /turf/open/openspace, /area/station/command/gateway) -"mVu" = ( -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "mVw" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -45182,17 +45278,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output, /turf/open/floor/engine/air, /area/station/engineering/atmos/upper) -"mWn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"mVX" = ( +/obj/structure/lattice/catwalk, /obj/structure/cable, -/obj/effect/mapping_helpers/mail_sorting/service/theater, -/obj/effect/mapping_helpers/mail_sorting/service/library, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/turf/open/openspace, +/area/station/engineering/atmos/project) "mWu" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/glass, @@ -45230,13 +45323,19 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) -"mWP" = ( -/obj/structure/railing/corner/end{ - dir = 8 +"mWQ" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/gambling{ + pixel_x = 6; + pixel_y = 3 }, -/obj/effect/spawner/random/trash/botanical_waste, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/machinery/light/warm/dim/directional/south, +/turf/open/floor/carpet/black, +/area/station/commons/lounge) "mWV" = ( /obj/machinery/door/airlock/virology{ name = "Cytology Lab" @@ -45306,15 +45405,14 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/security/office) -"mXT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ +"mXV" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/dark_green{ dir = 4 }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "mXW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45349,6 +45447,17 @@ }, /turf/open/openspace, /area/station/engineering/break_room) +"mYk" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "mYm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45463,6 +45572,15 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/primary/central) +"mZZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "naa" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -45504,12 +45622,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) -"nav" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +"naC" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hydropony_shutters"; + name = "Hydroponics Shutters" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/service/kitchen) +"naJ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) "naR" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/glass, @@ -45554,6 +45679,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/station/science/robotics/lab) +"nbo" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"nbC" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "nbY" = ( /obj/structure/table, /obj/effect/turf_decal/siding/wood{ @@ -45567,16 +45703,6 @@ }, /turf/open/floor/wood, /area/station/engineering/lobby) -"ncj" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/landmark/start/cook, -/turf/open/floor/glass, -/area/station/service/kitchen) -"ncs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) "nct" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45588,6 +45714,12 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ncB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/meter, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "ncF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/structure/lattice/catwalk, @@ -45625,6 +45757,11 @@ "nde" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/cmo) +"ndl" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/service/library) "ndo" = ( /obj/structure/table, /obj/item/electronics/airlock, @@ -45652,6 +45789,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"ndT" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "ndY" = ( /obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -45675,11 +45825,13 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"nem" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/power/tracker, -/turf/open/space/basic, -/area/station/solars/starboard/fore) +"nek" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/glass/reinforced/plasma, +/area/station/engineering/atmos/project) "nen" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -45712,6 +45864,29 @@ /obj/effect/turf_decal/trimline/purple/line, /turf/open/floor/iron, /area/station/science/robotics) +"neF" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "catwalk_cafe"; + name = "Feeding Elevator Controller"; + pixel_x = 0; + pixel_y = 26; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/structure/sign/directions/upload/directional/north{ + desc = "It stands for Up Le Dable"; + dir = 2; + name = "Button Indicator"; + pixel_y = 40 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "neJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45856,25 +46031,11 @@ /obj/effect/spawner/random/entertainment/cigarette_pack, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"nha" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/structure/cable, -/obj/machinery/door/airlock/wood{ - name = "Curator Office" - }, -/turf/open/floor/wood, -/area/station/maintenance/hallway/abandoned_recreation) "nhg" = ( /turf/open/floor/iron/smooth_edge{ dir = 4 }, /area/station/ai_monitored/turret_protected/aisat/foyer) -"nhh" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "nhj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45956,6 +46117,14 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"niq" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/custom_shuttle, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "nir" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron/dark, @@ -45977,6 +46146,16 @@ /obj/item/plunger, /turf/open/floor/wood, /area/station/medical/medbay/central) +"niF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "niN" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -46067,13 +46246,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"nkE" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "nkF" = ( /obj/machinery/light/directional/east, /turf/open/floor/iron/large, @@ -46153,14 +46325,6 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) -"nmk" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/camera/autoname/directional/east, -/turf/open/openspace, -/area/station/engineering/atmos/project) "nml" = ( /obj/machinery/button/door/directional/east{ id = "qm_cargobay"; @@ -46177,35 +46341,21 @@ /obj/effect/turf_decal/trimline/brown/filled/corner, /turf/open/floor/iron, /area/station/cargo/storage) +"nmn" = ( +/obj/structure/window/spawner/directional/east, +/turf/open/floor/wood, +/area/station/service/library) "nmu" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"nmx" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos/upper) "nmB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/confetti, /obj/effect/spawner/random/vending/colavend, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"nmF" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/circuitboard/computer/apc_control{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/stock_parts/power_store/cell{ - pixel_x = -3; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "nmH" = ( /obj/item/pushbroom, /turf/open/floor/engine/hull/air, @@ -46252,6 +46402,11 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"nny" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "nnB" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, @@ -46388,6 +46543,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"noH" = ( +/obj/structure/rack, +/obj/item/circuitboard/computer/apc_control{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/stock_parts/power_store/cell{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "noI" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -46623,16 +46790,6 @@ /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"nrs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "nrw" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -46755,6 +46912,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ntw" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Dormitories - Lower Entrance" + }, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) "ntx" = ( /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, @@ -46763,13 +46926,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"ntE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "ntJ" = ( /obj/structure/railing, /obj/machinery/camera/autoname/directional/north{ @@ -46799,13 +46955,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"nux" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/blacklight/directional/south, -/obj/item/kirbyplants/random/fullysynthetic, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/carpet/stellar, -/area/station/maintenance/hallway/abandoned_recreation) "nuy" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -46934,6 +47083,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nvR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "nvS" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -46983,13 +47140,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/fore) -"nwC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "nwG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -46999,6 +47149,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"nwO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "nwQ" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 @@ -47007,6 +47163,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/textured, /area/station/cargo/storage) +"nwR" = ( +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "nwT" = ( /obj/structure/table/glass, /obj/item/storage/box/shipping{ @@ -47059,11 +47221,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"nxs" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/service_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "nxv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/clothing/head/wig/random, @@ -47131,6 +47288,9 @@ /obj/structure/sign/poster/contraband/missing_gloves/directional/west, /turf/open/floor/wood, /area/station/commons/dorms) +"nyq" = ( +/turf/open/floor/iron/dark/smooth_half, +/area/station/service/library) "nyz" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -47149,6 +47309,10 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) +"nyB" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "nyG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -47169,6 +47333,14 @@ /obj/structure/railing/corner, /turf/open/openspace, /area/station/commons/fitness/recreation) +"nyI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/commons/lounge) "nyY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -47202,16 +47374,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) -"nzv" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "nzy" = ( /obj/structure/closet/crate/trashcart/filled, /obj/structure/sign/poster/contraband/random/directional/west, @@ -47289,13 +47451,6 @@ }, /turf/open/floor/plating, /area/station/science/cytology) -"nAG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/landmark/start/cook, -/turf/open/floor/glass, -/area/station/service/kitchen) "nAN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -47313,16 +47468,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"nAX" = ( -/obj/machinery/light/warm/dim/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "nAY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -47429,10 +47574,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"nCl" = ( -/obj/structure/sign/poster/random/directional/north, -/turf/open/openspace, -/area/station/hallway/secondary/service) "nCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_blue{ @@ -47441,6 +47582,15 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"nCr" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "nCt" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -47512,6 +47662,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"nDm" = ( +/obj/machinery/light/warm/dim/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "nDt" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -47545,18 +47705,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/openspace, /area/station/medical/storage) -"nDM" = ( -/obj/item/reagent_containers/cup/glass/bottle/wine_voltaic{ - pixel_y = 5; - pixel_x = 7 - }, -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/shaker{ - pixel_y = 6; - pixel_x = -6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nDS" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/siding/blue{ @@ -47590,6 +47738,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/maintenance/starboard/lesser) +"nEH" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/yellow/filled/warning/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "nEM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47694,13 +47849,6 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"nGp" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "nGr" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -47799,6 +47947,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"nHo" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/entertainment/cigarette{ + pixel_x = -5 + }, +/turf/open/floor/wood/large, +/area/station/service/bar) +"nHt" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/cable, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "nHy" = ( /obj/structure/barricade/sandbags, /obj/effect/turf_decal/siding/wood{ @@ -47807,17 +47968,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"nHI" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/landmark/navigate_destination/bar, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "nHL" = ( /mob/living/basic/slime, /turf/open/floor/engine, @@ -47879,6 +48029,30 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"nIR" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/rack, +/obj/item/encryptionkey/headset_sci{ + pixel_x = -6; + pixel_y = 1 + }, +/obj/item/encryptionkey/headset_med, +/obj/item/encryptionkey/headset_eng{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"nIT" = ( +/mob/living/basic/parrot/poly, +/obj/structure/filingcabinet/chestdrawer, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "nIW" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -47915,6 +48089,10 @@ dir = 4 }, /area/station/maintenance/port) +"nJl" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nJB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48004,13 +48182,16 @@ dir = 8 }, /area/station/ai_monitored/turret_protected/aisat/foyer) -"nKU" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, +"nLl" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/trunk/multiz{ + dir = 1 }, -/turf/open/floor/wood, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, /area/station/hallway/primary/central) "nLn" = ( /obj/structure/disposalpipe/segment, @@ -48061,11 +48242,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"nMu" = ( -/obj/machinery/holopad, -/obj/effect/spawner/random/engineering/tracking_beacon, +"nMr" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/circuitboard/machine/telecomms/bus{ + pixel_y = -3 + }, +/obj/item/circuitboard/machine/telecomms/broadcaster{ + pixel_y = 2 + }, /turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/area/station/engineering/storage/tcomms) "nMC" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -48078,31 +48267,6 @@ /obj/structure/closet/l3closet/scientist, /turf/open/openspace, /area/station/command/gateway) -"nMV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/openspace, -/area/station/engineering/atmos/project) -"nMW" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 6 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) -"nNb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair{ - dir = 4; - pixel_y = -2 - }, -/turf/open/floor/wood, -/area/station/service/library) "nNd" = ( /obj/structure/railing/corner{ dir = 8 @@ -48180,6 +48344,11 @@ dir = 4 }, /area/station/ai_monitored/turret_protected/aisat/foyer) +"nNO" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/space/basic, +/area/space/nearstation) "nNY" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -48211,6 +48380,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) +"nOt" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/obj/effect/turf_decal/tile/green/full, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/hydroponics{ + name = "Hydroponics" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "nOw" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/washing_machine, @@ -48260,15 +48439,6 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/smooth_large, /area/station/security/eva) -"nPu" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "nPA" = ( /obj/item/storage/medkit/regular{ pixel_x = 3; @@ -48391,6 +48561,11 @@ }, /turf/open/floor/iron, /area/station/science/research) +"nQV" = ( +/obj/structure/cable/multilayer/multiz, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "nRg" = ( /obj/structure/flora/tree/jungle/small, /obj/structure/flora/bush/sparsegrass/style_random, @@ -48399,13 +48574,6 @@ }, /turf/open/floor/grass, /area/station/science/genetics) -"nRk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "nRm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, @@ -48576,6 +48744,14 @@ }, /turf/open/floor/iron, /area/station/science/research) +"nTw" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree{ + pixel_x = 4; + pixel_y = 10 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "nTA" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -48603,6 +48779,13 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) +"nTZ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "nUd" = ( /obj/machinery/firealarm/directional/south, /obj/effect/decal/cleanable/wrapping, @@ -48686,6 +48869,12 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) +"nUE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/commons/lounge) "nUV" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -48703,15 +48892,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"nVd" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "nVg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/closed/wall/r_wall, @@ -48780,15 +48960,20 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) -"nWF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "nWI" = ( /obj/effect/spawner/random/contraband/permabrig_weapon, /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, /area/station/maintenance/department/medical) +"nWN" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/landmark/navigate_destination/kitchen, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "nWO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -48864,36 +49049,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/freezer, /area/station/engineering/atmos/pumproom) -"nXz" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/siding/dark{ - dir = 9 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"nXH" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) -"nXM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/trunk/multiz{ - dir = 1 - }, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/hallway/primary/central) "nXQ" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -48934,6 +49089,26 @@ /obj/structure/showcase/mecha/ripley, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) +"nYp" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) +"nYq" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "nYu" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -49064,14 +49239,6 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"nZX" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "oaa" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -49103,31 +49270,11 @@ "oaj" = ( /turf/closed/wall, /area/station/security/medical) -"oaq" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "oaA" = ( /obj/machinery/camera/autoname/directional/north, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"oaD" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "oaF" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49145,14 +49292,6 @@ "obn" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central) -"obp" = ( -/obj/machinery/fax{ - fax_name = "Chief Engineer's Office"; - name = "Chief Engineer's Fax Machine" - }, -/obj/structure/table/reinforced, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "obu" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/trimline/yellow, @@ -49177,11 +49316,6 @@ /obj/structure/flora/bush/flowers_br/style_3, /turf/open/floor/grass, /area/station/ai_monitored/turret_protected/aisat/foyer) -"obI" = ( -/obj/machinery/light/directional/south, -/obj/machinery/vending/clothing, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "obJ" = ( /obj/machinery/door/airlock/external{ name = "Mining Dock Airlock" @@ -49201,15 +49335,6 @@ dir = 4 }, /area/station/medical/morgue) -"obX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "oca" = ( /obj/structure/chair/office/light{ dir = 1 @@ -49217,10 +49342,6 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) -"oce" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ocj" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -49395,19 +49516,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"oeV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "O2 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "O2 meter" - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "ofc" = ( /obj/machinery/digital_clock/directional/west, /obj/structure/disposalpipe/trunk{ @@ -49455,6 +49563,14 @@ /obj/item/reagent_containers/cup/beaker/cryoxadone, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"ofE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/service/bar) "ofL" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -49619,15 +49735,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"oiF" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/desk_bell{ - pixel_x = 6; - pixel_y = 15 - }, -/turf/open/floor/wood/large, -/area/station/service/bar) "oiH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49660,6 +49767,18 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"oiW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) "ojb" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -49756,6 +49875,16 @@ /obj/structure/cable/layer1, /turf/open/floor/engine, /area/station/engineering/supermatter) +"oky" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "okC" = ( /obj/effect/turf_decal/siding/blue{ dir = 8 @@ -49806,20 +49935,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/engineering/lobby) -"ola" = ( -/obj/structure/table, -/obj/item/food/chocolatebar{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/dry_ramen{ - pixel_x = -8; - pixel_y = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "olm" = ( /obj/structure/stairs/west, /obj/structure/railing, @@ -49899,6 +50014,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/hallway) +"onj" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "onm" = ( /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/dirt, @@ -49971,6 +50094,14 @@ /obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ooE" = ( +/obj/machinery/light/directional/east, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/openspace, +/area/station/engineering/atmos/project) "ooF" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 4 @@ -49992,6 +50123,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"ooL" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/package_wrap, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "ooS" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 1 @@ -50025,23 +50163,6 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"opt" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/hallway/primary/central) "opu" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -50098,16 +50219,6 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"opT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "opU" = ( /obj/structure/table, /obj/item/camera{ @@ -50141,10 +50252,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"oqb" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "oqd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"oqi" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hydropony_shutters"; + name = "Hydroponics Shutters" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/service/hydroponics) "oqq" = ( /obj/structure/table, /obj/item/folder/red, @@ -50188,15 +50312,6 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"orh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "orm" = ( /obj/structure/cable, /obj/structure/sign/poster/random/directional/north, @@ -50206,18 +50321,6 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/floor/iron, /area/station/engineering/main) -"orn" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table/reinforced, -/obj/item/storage/briefcase/secure{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/paper/monitorkey, -/obj/item/clipboard, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "orr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/graffiti, @@ -50249,21 +50352,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) +"orD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/hallway) +"orH" = ( +/obj/effect/spawner/random/techstorage/service_all, +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "orJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/research) -"osg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "osp" = ( /obj/machinery/door/airlock/public/glass{ name = "Departure Balcony" @@ -50309,6 +50420,22 @@ /obj/machinery/light/directional/east, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) +"osO" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"osQ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/computer/security/telescreen/ce/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "osS" = ( /obj/structure/table/glass, /obj/item/clothing/head/costume/festive, @@ -50391,6 +50518,20 @@ }, /turf/open/openspace, /area/station/hallway/secondary/construction) +"ouE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/siding/dark/end{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/hallway/secondary/service) "ouH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50424,6 +50565,15 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/port) +"ovz" = ( +/obj/structure/chair/office, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "ovE" = ( /obj/effect/decal/cleanable/crayon{ icon_state = "n"; @@ -50528,12 +50678,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/glass, /area/station/maintenance/starboard/aft) -"oxf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/sign/poster/official/work_for_a_future/directional/west, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "oxg" = ( /obj/machinery/photocopier/prebuilt, /obj/structure/railing{ @@ -50631,22 +50775,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"oys" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) -"oyx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/arrows{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) "oyy" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/box/white, @@ -50676,10 +50804,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"oyU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "ozh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -50732,17 +50856,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ozC" = ( -/obj/structure/chair/stool/directional/south{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/landmark/start/janitor, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "ozE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50756,6 +50869,19 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"ozL" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "ozN" = ( /obj/structure/lattice/catwalk, /obj/item/storage/box/syndie_kit{ @@ -50779,25 +50905,12 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"oAq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "oAz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"oAJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "oAL" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -50837,18 +50950,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"oBf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "oBo" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1" @@ -50876,10 +50977,17 @@ /obj/structure/cable, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"oBM" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) +"oBH" = ( +/obj/structure/sign/poster/official/walk/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/station/service/library) "oBT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -50916,11 +51024,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"oCi" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit, -/area/station/maintenance/hallway/abandoned_recreation) "oCr" = ( /obj/structure/chair/office{ dir = 1 @@ -50974,30 +51077,31 @@ /obj/item/clothing/head/cone, /turf/open/floor/engine/hull, /area/space/nearstation) -"oCU" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics" +"oCX" = ( +/obj/structure/railing{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) +/obj/structure/table, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/item/holosign_creator/robot_seat/restaurant{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/stack/package_wrap, +/obj/item/rag{ + pixel_x = -4 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "oDc" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"oDg" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/coffeepot, -/obj/item/storage/box/coffeepack, -/obj/machinery/coffeemaker, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "oDj" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/structure/cable, @@ -51271,6 +51375,17 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"oIk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"oIv" = ( +/obj/structure/table, +/obj/item/flashlight/lamp{ + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "oII" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -51288,6 +51403,21 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) +"oIU" = ( +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_twentythree{ + pixel_x = 0; + pixel_y = 0 + }, +/obj/structure/closet/crate, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "oJd" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -51370,17 +51500,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"oJx" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "oJy" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 4 @@ -51485,6 +51604,18 @@ /obj/structure/railing, /turf/open/floor/engine/hull, /area/space/nearstation) +"oLo" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "oLt" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -51596,10 +51727,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"oMV" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) "oMX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -51628,6 +51755,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"oNc" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/under/color/red, +/obj/machinery/light/small/blacklight/directional/south, +/turf/open/floor/eighties/red, +/area/station/maintenance/hallway/abandoned_recreation) +"oNi" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "oNp" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/iron/cafeteria, @@ -51661,12 +51802,21 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"oNP" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/photocopier/prebuilt, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +"oNU" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "oOc" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, @@ -51757,11 +51907,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/security/brig) -"oPd" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured_large, -/area/station/engineering/atmos/upper) "oPh" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/dark_blue{ @@ -51936,6 +52081,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"oSI" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "oST" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51982,15 +52131,6 @@ /obj/structure/sign/warning/yes_smoking/circle/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"oTq" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) "oTr" = ( /obj/structure/railing/corner{ dir = 8 @@ -52170,17 +52310,6 @@ /obj/effect/spawner/random/food_or_drink/donkpockets, /turf/open/floor/iron, /area/station/science/breakroom) -"oVu" = ( -/obj/structure/railing/corner, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/station/service/library) "oVz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/east, @@ -52200,8 +52329,8 @@ }, /turf/open/floor/carpet, /area/station/security/detectives_office) -"oVR" = ( -/obj/machinery/holopad, +"oVO" = ( +/obj/structure/displaycase/trophy, /turf/open/floor/wood/large, /area/station/service/library) "oVY" = ( @@ -52216,6 +52345,15 @@ /obj/item/book/manual/wiki/engineering_construction, /turf/open/floor/iron, /area/station/engineering/lobby) +"oWp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "oWy" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/engine/hull/reinforced/air, @@ -52266,11 +52404,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/lesser) -"oXm" = ( -/obj/item/restraints/handcuffs/fake, -/obj/structure/table/wood, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "oXn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/railing/corner{ @@ -52285,13 +52418,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"oXI" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "oXJ" = ( /obj/structure/railing{ dir = 1 @@ -52357,13 +52483,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"oYa" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "oYd" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -52422,6 +52541,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"oYP" = ( +/obj/structure/easel, +/obj/item/canvas/twentythree_nineteen{ + pixel_x = 3; + pixel_y = 10 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "oZh" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -52492,6 +52619,13 @@ }, /turf/open/openspace, /area/station/medical/storage) +"oZO" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/spawner/random/trash/botanical_waste, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "oZV" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/power/apc/auto_name/directional/south, @@ -52500,6 +52634,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"oZX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "pac" = ( /obj/machinery/door/airlock/security{ name = "Interrogation" @@ -52515,6 +52653,11 @@ "paf" = ( /turf/open/openspace, /area/station/hallway/primary/starboard) +"pag" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/glass, +/area/station/service/kitchen) "paq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cigarette, @@ -52531,6 +52674,18 @@ /obj/structure/curtain/bounty/start_closed, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"paV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/project) "paY" = ( /obj/structure/window/reinforced/tinted/spawner/directional/north, /turf/open/openspace, @@ -52546,6 +52701,15 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"pbk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "pbp" = ( /obj/machinery/door/airlock/maintenance{ name = "Medbay Maintenance" @@ -52565,6 +52729,15 @@ /obj/structure/table/reinforced, /turf/open/floor/engine/hull, /area/space/nearstation) +"pbs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/lobby) "pbt" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/atmospherics/components/unary/portables_connector/visible, @@ -52593,16 +52766,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/wood, /area/station/service/library/printer) -"pbL" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/sink/kitchen/directional/west, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "pbN" = ( /obj/structure/railing{ dir = 1 @@ -52736,6 +52899,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/gateway) +"pdr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/ai_monitored/command/storage/eva) "pdy" = ( /obj/structure/bed, /obj/effect/decal/cleanable/dirt, @@ -52775,15 +52944,6 @@ /obj/structure/cable, /turf/closed/wall, /area/station/engineering/main) -"pdM" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "pdO" = ( /turf/closed/wall, /area/station/medical/pharmacy) @@ -52808,6 +52968,26 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pef" = ( +/obj/structure/transport/linear/public, +/obj/structure/table, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -6; + pixel_y = 13 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/item/plate{ + pixel_x = -7; + pixel_y = -3 + }, +/obj/machinery/barsign{ + pixel_y = 32 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/service/kitchen) "pem" = ( /obj/machinery/door/airlock/medical/glass{ name = "Cryogenics Room" @@ -52857,16 +53037,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/security/courtroom) -"peO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/library) "peQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52889,21 +53059,11 @@ dir = 8 }, /area/station/hallway/secondary/service) -"pfb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Laser Tag" +"pfd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/circuit/red, -/area/station/maintenance/hallway/abandoned_recreation) -"pfi" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/turf/open/floor/iron/kitchen, +/turf/open/floor/glass, /area/station/service/kitchen) "pfl" = ( /obj/structure/chair{ @@ -52936,6 +53096,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"pfF" = ( +/obj/structure/bed, +/obj/item/bedsheet/ce, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "pfK" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -52957,26 +53125,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) -"pfO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"pgd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/vatgrower, -/turf/open/floor/engine, -/area/station/service/hydroponics) "pgh" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -53139,13 +53287,6 @@ }, /turf/open/openspace, /area/station/medical/medbay/central) -"phC" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "phE" = ( /obj/structure/lattice/catwalk, /obj/structure/table, @@ -53165,6 +53306,15 @@ }, /turf/open/floor/wood, /area/station/service/chapel) +"phP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/customs) "phT" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -53181,6 +53331,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"piR" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/flashlight{ + pixel_y = 8 + }, +/obj/machinery/light/small/blacklight/directional/north, +/turf/open/floor/eighties/red, +/area/station/maintenance/hallway/abandoned_recreation) +"pjd" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Kitchen" + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/disposal/bin/tagger, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "pje" = ( /obj/structure/closet/firecloset, /turf/open/floor/iron, @@ -53199,14 +53371,6 @@ /obj/machinery/light/small/dim/directional/east, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"pjI" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 8 - }, -/obj/effect/landmark/start/psychologist, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "pjN" = ( /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) @@ -53215,11 +53379,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/textured_large, /area/station/medical/virology) -"pkl" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/landmark/start/assistant, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "pko" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/coffee, @@ -53274,6 +53433,11 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, /area/space/nearstation) +"plS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "pma" = ( /obj/structure/chair, /obj/item/cigbutt, @@ -53292,6 +53456,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) +"pmg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "pmn" = ( /obj/structure/window/reinforced/tinted/spawner/directional/east, /obj/machinery/shower/directional/east, @@ -53310,15 +53480,6 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat_interior) -"pmu" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Curator Office" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/service/library/printer) "pmw" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -53360,6 +53521,33 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/pharmacy) +"pmN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) +"pmS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/end{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "pmV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53406,6 +53594,22 @@ "pnd" = ( /turf/open/floor/wood, /area/station/commons/toilet/restrooms) +"pni" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N20 Multideck Adapter"; + dir = 4 + }, +/obj/machinery/meter{ + name = "N20 meter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "pno" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53450,13 +53654,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"pnX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/wood, -/area/station/service/library) "pod" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/computer/security{ @@ -53481,6 +53678,10 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/engine, /area/station/engineering/main) +"por" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/glass, +/area/station/service/kitchen) "pot" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -53525,34 +53726,10 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"ppw" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "ppL" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/upper) -"ppX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/lobby) -"ppY" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) "pqj" = ( /turf/closed/wall/r_wall, /area/station/security/interrogation) @@ -53568,26 +53745,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) -"pqW" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"prb" = ( -/obj/structure/chair/sofa/right/brown{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "prn" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -53659,13 +53816,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) -"psc" = ( -/mob/living/carbon/human/species/monkey/punpun, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "psi" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck{ @@ -53757,6 +53907,17 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"ptt" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/five, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "ptC" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -53764,15 +53925,11 @@ }, /turf/open/openspace, /area/station/medical/storage) -"ptD" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "psychology_shutters"; - name = "Psychologist's Office Shutters" - }, -/turf/open/floor/plating, -/area/station/medical/psychology) +"ptH" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "ptI" = ( /obj/structure/railing/corner{ dir = 8 @@ -53826,6 +53983,11 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, /area/station/science/lab) +"puJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/sign/poster/contraband/eat/directional/west, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "puR" = ( /obj/structure/filingcabinet, /obj/machinery/light/directional/south, @@ -53897,13 +54059,6 @@ /obj/structure/sign/warning/radiation/rad_area/directional/east, /turf/open/floor/catwalk_floor, /area/station/engineering/main) -"pwb" = ( -/obj/machinery/meter{ - name = "Mixed Air Tank In" - }, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) "pwy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -53940,6 +54095,11 @@ }, /turf/open/floor/glass, /area/station/science/zoo) +"pwP" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "pwQ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -53965,28 +54125,10 @@ dir = 8 }, /area/station/hallway/primary/fore) -"pwU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "pxv" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/wood, /area/station/commons/storage/tools) -"pxw" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) -"pxJ" = ( -/obj/structure/window/spawner/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "pxN" = ( /obj/machinery/atmospherics/pipe/multiz/yellow/visible{ name = "N2 Multideck Adapter"; @@ -54003,6 +54145,18 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) +"pxZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "pyd" = ( /obj/machinery/door/airlock/external{ name = "Arrival Airlock" @@ -54029,30 +54183,11 @@ }, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) -"pyj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "pyw" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/maintenance/no_decals, /turf/open/space/basic, /area/space/nearstation) -"pyy" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/theatre, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Theater Backstage" - }, -/turf/open/floor/plating, -/area/station/service/theater) "pyB" = ( /obj/machinery/light_switch/directional/east, /turf/open/floor/carpet, @@ -54061,6 +54196,12 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"pzb" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/openspace, +/area/station/hallway/primary/central) "pzg" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -54167,16 +54308,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"pAI" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/psychologist, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) "pAJ" = ( /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, @@ -54206,16 +54337,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"pBA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock{ - id_tag = "commissarydoor"; - name = "Commissary" - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) "pBB" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/dark/textured_half{ @@ -54232,6 +54353,24 @@ /obj/machinery/vending/autodrobe, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"pBH" = ( +/obj/item/key/janitor, +/obj/vehicle/ridden/janicart, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) +"pBI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/table/wood, +/obj/item/statuebust{ + desc = "Scribbled on its bottom there are the words 'FEARTHEVAPORWAVE'."; + pixel_y = 12 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "pBJ" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/camera/directional/east{ @@ -54244,12 +54383,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) -"pBL" = ( -/obj/structure/table/reinforced, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "pBP" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos/upper) @@ -54317,6 +54450,27 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"pDO" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) +"pDR" = ( +/obj/effect/landmark/firealarm_sanity, +/obj/structure/lattice/catwalk, +/obj/machinery/griddle, +/turf/open/openspace, +/area/station/service/kitchen) "pDT" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -54429,14 +54583,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/lesser) -"pFj" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydropony_shutters"; - name = "Hydroponics Shutters" - }, -/turf/open/floor/plating, -/area/station/service/hydroponics) "pFp" = ( /obj/machinery/sparker/directional/west{ id = "Xenobio" @@ -54450,6 +54596,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"pFR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "pFX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -54481,21 +54634,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine/hull/air, /area/station/engineering/atmos/project) -"pGr" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow{ - pixel_y = 6 +"pGn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) +/turf/open/floor/wood/large, +/area/station/medical/psychology) "pGs" = ( /obj/structure/table/reinforced, /obj/item/folder/red{ @@ -54587,14 +54731,6 @@ "pHf" = ( /turf/open/floor/carpet, /area/station/commons/storage/tools) -"pHi" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "pHl" = ( /obj/effect/turf_decal/trimline/purple/arrow_cw{ dir = 8 @@ -54628,10 +54764,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"pHz" = ( -/obj/effect/landmark/start/clown, -/turf/open/floor/carpet/black, -/area/station/service/theater) "pHC" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /turf/open/floor/iron/dark/textured_large, @@ -54641,6 +54773,15 @@ /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/station/maintenance/starboard/lesser) +"pHV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "pIf" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54817,11 +54958,6 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"pKc" = ( -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "pKd" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -54840,18 +54976,6 @@ }, /turf/open/floor/wood, /area/station/commons/dorms) -"pKw" = ( -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "pKA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55114,6 +55238,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"pMZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "pNg" = ( /obj/structure/railing{ dir = 1 @@ -55203,6 +55337,16 @@ /obj/effect/spawner/random/clothing/backpack, /turf/open/floor/iron, /area/station/commons/dorms) +"pOM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "pON" = ( /obj/structure/sign/poster/official/safety_report/directional/south, /obj/effect/decal/cleanable/dirt, @@ -55229,6 +55373,18 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) +"pPb" = ( +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark/arrow_cw{ + dir = 8 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "pPf" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/camera/autoname/directional/west, @@ -55438,17 +55594,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured_large, /area/station/medical/medbay/central) -"pQN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/obj/effect/turf_decal/tile/green/full, -/obj/machinery/door/airlock/hydroponics{ - name = "Hydroponics Lab" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) "pQQ" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55493,6 +55638,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"pRw" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/machinery/light/dim/directional/south, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "pRx" = ( /obj/structure/sign/poster/contraband/random/directional/west, /obj/machinery/power/port_gen/pacman/pre_loaded, @@ -55527,6 +55683,14 @@ "pRO" = ( /turf/closed/wall, /area/station/commons/dorms) +"pRQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/commons/lounge) "pRS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -55602,17 +55766,66 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) -"pSS" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/red, -/area/station/maintenance/hallway/abandoned_recreation) +"pSV" = ( +/obj/structure/table, +/obj/item/phone{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "pSY" = ( /obj/structure/railing/corner/end{ dir = 8 }, /turf/open/floor/iron/kitchen, /area/station/maintenance/port/aft) +"pTa" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/item/stack/rods{ + amount = 25 + }, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/item/stack/sheet/iron{ + amount = 30 + }, +/obj/structure/closet/crate, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/structure/sign/poster/contraband/grey_tide/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"pTi" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychologist's Office Curtains"; + id = "psychpriv" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) +"pTu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/janitor, +/obj/machinery/door/airlock{ + name = "Custodial Closet" + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "pTw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/flora/bush/jungle/a/style_2{ @@ -55621,10 +55834,6 @@ }, /turf/open/floor/grass, /area/station/science/genetics) -"pTz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "pTB" = ( /obj/structure/table, /obj/item/taperecorder{ @@ -55689,6 +55898,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"pUH" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice, +/obj/item/stack/spacecash/c20{ + pixel_x = -8; + pixel_y = 8 + }, +/turf/open/floor/carpet/black, +/area/station/commons/lounge) "pUV" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/machinery/light/cold/directional/south, @@ -55707,23 +55925,21 @@ }, /turf/open/floor/plating, /area/station/science/genetics) -"pVd" = ( -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "pVo" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ dir = 1 }, /turf/open/floor/iron/checker, /area/station/ai_monitored/turret_protected/aisat_interior) +"pVw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/mirror/directional/north, +/obj/structure/sink/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/maintenance/hallway/abandoned_recreation) "pVy" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/iron/large, @@ -55735,6 +55951,13 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"pVF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/item/stack/rods/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "pWh" = ( /obj/machinery/button/door/directional/west{ id = "Cabin6"; @@ -55762,6 +55985,23 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"pWr" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) +"pWC" = ( +/obj/structure/table, +/obj/item/stack/sheet/cardboard/fifty{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/stack/sheet/cardboard/fifty{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "pWF" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, @@ -55780,6 +56020,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/commons/toilet/auxiliary) +"pXb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "pXt" = ( /obj/machinery/door/airlock/public/glass{ name = "Crematorium Room" @@ -55790,18 +56039,30 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/service/chapel) +"pXE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "pXM" = ( /obj/structure/railing/corner, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"pYA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) +"pXO" = ( +/obj/structure/closet/crate, +/obj/item/gps, +/obj/item/assembly/timer, +/obj/item/gps, +/obj/item/assembly/signaler, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pYI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55892,6 +56153,12 @@ /obj/machinery/wall_healer/directional/south, /turf/open/floor/iron, /area/station/science/research) +"qaA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "qaI" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp, @@ -55922,6 +56189,10 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) +"qbl" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "qbm" = ( /obj/structure/closet/secure_closet/engineering_welding, /turf/open/floor/iron/smooth, @@ -55938,6 +56209,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"qbO" = ( +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, +/area/station/engineering/gravity_generator) "qbT" = ( /turf/closed/wall/r_wall, /area/station/security/prison/mess) @@ -55950,16 +56225,6 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) -"qbZ" = ( -/obj/structure/transport/linear{ - radial_travel = 0 - }, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "catwalk_engi"; - preset_destination_names = list("2"="Lower Engine","3"="Upper Atmos.") - }, -/turf/open/openspace, -/area/station/engineering/break_room) "qcb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -55994,13 +56259,6 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/engineering/break_room) -"qcX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "qdd" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -56052,10 +56310,6 @@ }, /turf/open/floor/iron/airless, /area/station/maintenance/starboard/aft) -"qdN" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "qdR" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/dirt, @@ -56108,29 +56362,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qem" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 10 - }, -/obj/structure/rack, -/obj/item/pai_card{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/integrated_circuit/loaded/speech_relay{ - pixel_x = 1; - pixel_y = -4 - }, -/obj/item/integrated_circuit/loaded/hello_world{ - pixel_x = 4 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/station/service/library) "qep" = ( /obj/structure/sink/directional/west, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -56142,6 +56373,11 @@ }, /turf/open/floor/iron/dark, /area/station/medical/cryo) +"qeq" = ( +/obj/effect/mapping_helpers/trapdoor_placer, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/plating, +/area/station/service/theater_dressing) "qez" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56201,14 +56437,6 @@ /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/iron, /area/station/construction/storage_wing) -"qfo" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/checker, -/area/station/service/bar) "qfr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56227,15 +56455,6 @@ }, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"qfT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "qgc" = ( /obj/item/radio{ pixel_x = 6; @@ -56342,6 +56561,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/main) +"qhn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "qhq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -56400,6 +56626,17 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/security/brig) +"qhH" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "qhP" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -56419,6 +56656,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) +"qhZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/lobby) "qid" = ( /obj/machinery/door/airlock/research{ name = "Research Division Backdoor" @@ -56507,6 +56750,15 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qjm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "qjn" = ( /obj/item/toy/plush/moth{ name = "Spanner"; @@ -56571,6 +56823,17 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/starboard/central) +"qjZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table/wood, +/obj/item/clothing/head/costume/sombrero{ + pixel_y = 8 + }, +/obj/item/gun/magic/wand/nothing, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/theater) "qki" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -56597,12 +56860,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"qko" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "qkv" = ( /obj/structure/railing{ dir = 4 @@ -56612,36 +56869,21 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) -"qkM" = ( -/obj/structure/sign/warning/radiation/rad_area{ +"qkF" = ( +/obj/structure/chair/office, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) +"qkG" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ dir = 1 }, -/turf/closed/wall, -/area/station/engineering/gravity_generator) -"qkO" = ( -/obj/structure/table/wood, -/obj/item/toy/crayon/spraycan/lubecan{ - charges = 5; - pixel_x = -6; - pixel_y = 13 - }, -/obj/item/toy/crayon/spraycan/mimecan{ - charges = 5; - pixel_x = 3; - pixel_y = 13 - }, -/obj/item/toy/figure/clown{ - pixel_x = 5 - }, -/obj/item/toy/figure/mime{ - pixel_x = -5 - }, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) +/obj/machinery/firealarm/directional/east, +/obj/structure/table, +/obj/item/folder, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "qkU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56649,10 +56891,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/library) -"qla" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "qle" = ( /obj/structure/table, /obj/item/clothing/head/cone{ @@ -56688,6 +56926,19 @@ /obj/structure/cable, /turf/open/openspace, /area/station/medical/storage) +"qln" = ( +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "N2 Multideck Adapter"; + dir = 8 + }, +/obj/machinery/meter{ + name = "N2 meter" + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "qlx" = ( /obj/structure/closet/crate/engineering{ name = "Basic Materials" @@ -56715,17 +56966,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/engine/hull/air, /area/station/security/courtroom) -"qlB" = ( -/obj/structure/sign/poster/official/walk/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/large, -/area/station/service/library) "qlF" = ( /obj/structure/railing{ dir = 8 @@ -56791,11 +57031,6 @@ /obj/effect/spawner/random/trash/box, /turf/open/floor/plating, /area/station/maintenance/port) -"qmq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "qmB" = ( /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark/textured_large, @@ -56829,28 +57064,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"qnp" = ( -/obj/structure/closet/crate/wooden{ - desc = "Used for storing props for a stage play!."; - name = "Space Station 27 Props" - }, -/obj/item/clothing/under/costume/lobster, -/obj/item/clothing/head/collectable/captain, -/obj/item/disk/nuclear/fake/obvious, -/obj/item/clothing/head/collectable/hos, -/obj/item/toy/gun, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/item/clothing/head/collectable/xenom, -/obj/item/clothing/head/collectable/hardhat, -/obj/item/clothing/head/collectable/police, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "qnt" = ( /obj/structure/table/wood, /obj/item/storage/photo_album{ @@ -56952,6 +57165,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) +"qoU" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/checker, +/area/station/service/bar) "qoX" = ( /obj/machinery/mineral/stacking_machine{ input_dir = 2; @@ -56994,6 +57222,16 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/wood/parquet, /area/station/medical/break_room) +"qpA" = ( +/obj/machinery/power/emitter{ + dir = 4 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/engine, +/area/station/engineering/break_room) "qpD" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57022,6 +57260,10 @@ "qpL" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos/upper) +"qpP" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "qpY" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -57062,6 +57304,14 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"qqz" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "qqC" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -57152,24 +57402,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"qsa" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/camera/autoname/directional/east, -/obj/structure/closet/crate/wooden, -/obj/item/tape, -/obj/item/taperecorder, -/obj/item/camera, -/obj/item/pai_card, -/obj/item/toy/plush/moth{ - name = "Spare Sani" - }, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychologist's Office Curtains"; - id = "psychpriv" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "qsb" = ( /obj/machinery/camera/autoname/directional/east, /obj/item/radio/intercom/directional/east, @@ -57199,18 +57431,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"qsm" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security E.V.A. Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/armory, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/eva) "qsv" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating/airless, @@ -57302,6 +57522,14 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"quB" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 8 + }, +/obj/effect/landmark/start/psychologist, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "quD" = ( /obj/item/kirbyplants/random, /obj/machinery/airalarm/directional/west, @@ -57331,17 +57559,6 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/port) -"qve" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/computer/security/telescreen/ce/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "qvg" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty{ @@ -57395,17 +57612,21 @@ /obj/machinery/firealarm/directional/south, /turf/open/openspace, /area/station/security/checkpoint/supply) -"qvw" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "qvL" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) +"qvM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 4; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/station/service/library) "qvU" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -57431,16 +57652,20 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qwb" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/item/airlock_painter, +/obj/item/storage/belt/utility, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/clothing/gloves/color/fyellow, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "qwn" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/openspace, /area/space/nearstation) -"qwo" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "qwy" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -57451,19 +57676,23 @@ }, /turf/open/space/openspace, /area/space/nearstation) -"qwL" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychologist's Office Curtains"; - id = "psychpriv" +"qwF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) -"qwT" = ( -/obj/machinery/holopad, /turf/open/floor/glass, /area/station/service/kitchen) +"qwJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/bar) "qwX" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -57479,18 +57708,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) -"qxz" = ( -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar/red, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "qxA" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -57661,6 +57878,19 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/abandoned) +"qzL" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"qzN" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit, +/area/station/maintenance/hallway/abandoned_recreation) "qzQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57800,22 +58030,6 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/hallway/secondary/service) -"qBj" = ( -/obj/structure/lattice/catwalk, -/obj/item/storage/box/syringes{ - pixel_x = -10; - pixel_y = 4 - }, -/obj/item/storage/box/syringes{ - pixel_x = -10; - pixel_y = -3 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/camera/autoname/directional/south{ - c_tag = "Medbay - Upper Medical Storage South" - }, -/turf/open/openspace, -/area/station/medical/storage) "qBm" = ( /obj/structure/disposalpipe/junction/flip, /obj/effect/turf_decal/tile/dark_blue{ @@ -57851,30 +58065,6 @@ /obj/item/tank/internals/anesthetic, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) -"qBK" = ( -/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/medical{ - name = "Psychology" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) -"qBY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/medical{ - name = "Psychology" - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "qCe" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -57961,10 +58151,6 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/commons/dorms) -"qDm" = ( -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "qDn" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -58002,6 +58188,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"qEy" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "qEE" = ( /obj/structure/chair{ dir = 8 @@ -58104,31 +58296,9 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark, /area/station/security/medical) -"qFL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "qFO" = ( /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"qFP" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"qGa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/warning/radiation/rad_area/directional/west, -/turf/open/openspace, -/area/station/hallway/primary/starboard) "qGi" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/carpet/black, @@ -58146,6 +58316,15 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/maintenance/starboard/lesser) +"qGF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "qGG" = ( /obj/structure/cable, /turf/open/floor/iron/smooth_half, @@ -58172,11 +58351,6 @@ "qHg" = ( /turf/open/floor/iron/stairs, /area/station/service/library) -"qHo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/wood/large, -/area/station/service/bar) "qHB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58184,17 +58358,6 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/plating, /area/station/maintenance/central) -"qHC" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp{ - pixel_y = 10 - }, -/obj/item/toy/figure/ce{ - pixel_y = 4 - }, -/obj/item/clothing/glasses/meson, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "qHH" = ( /obj/structure/table/wood, /obj/item/camera{ @@ -58249,32 +58412,12 @@ /obj/effect/mapping_helpers/mail_sorting/science/ordnance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qIj" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark/corner, -/obj/effect/turf_decal/siding/dark{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "qIp" = ( /obj/machinery/porta_turret/ai{ dir = 4 }, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) -"qIw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "qIz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -58315,11 +58458,13 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/dark, /area/station/commons/dorms) -"qJu" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) +"qJo" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "qJB" = ( /obj/effect/turf_decal/bot_white/right, /turf/open/floor/iron/dark/textured_large, @@ -58331,10 +58476,21 @@ }, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) +"qJK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "qJL" = ( /obj/effect/turf_decal/siding/blue, /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) +"qJN" = ( +/obj/machinery/photocopier/prebuilt, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "qJS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58361,18 +58517,6 @@ "qKq" = ( /turf/open/openspace, /area/station/science/zoo) -"qKs" = ( -/obj/machinery/vending/assist, -/obj/machinery/light_switch/directional/east, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"qKt" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "qKA" = ( /obj/structure/railing{ dir = 6 @@ -58455,6 +58599,24 @@ /obj/structure/ladder, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) +"qLF" = ( +/obj/structure/table, +/obj/item/storage/toolbox/artistic{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/trapdoor_remote/preloaded{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "qLZ" = ( /obj/structure/grille, /turf/open/openspace, @@ -58473,6 +58635,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qMm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "qMr" = ( /obj/structure/closet/secure_closet/courtroom, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -58495,6 +58665,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"qMI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "qMK" = ( /obj/structure/railing{ dir = 4 @@ -58572,6 +58748,12 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) +"qNw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "qNy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -58582,6 +58764,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"qNF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "qNK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, @@ -58601,6 +58790,18 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/security/brig) +"qNV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "qNW" = ( /obj/item/trash/ready_donk, /turf/open/floor/plating, @@ -58622,22 +58823,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"qOz" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydropony_shutters"; - name = "Hydroponics Shutters" - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/service/kitchen) -"qOB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/engineering/lobby) "qOS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -58685,12 +58870,6 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"qPH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/obj/effect/spawner/random/structure/musician/piano/random_piano, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) "qPM" = ( /obj/effect/turf_decal/tile/dark_blue{ dir = 1 @@ -58836,12 +59015,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/robotics) -"qRx" = ( -/obj/effect/landmark/firealarm_sanity, -/obj/structure/lattice/catwalk, -/obj/machinery/griddle, -/turf/open/openspace, -/area/station/service/kitchen) "qRy" = ( /obj/machinery/atmospherics/components/tank/oxygen{ dir = 4 @@ -58932,15 +59105,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured_edge, /area/station/science/ordnance/storage) -"qSK" = ( -/obj/effect/spawner/random/entertainment/deck{ - pixel_x = -7; - pixel_y = 13 - }, -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c10, -/turf/open/floor/carpet/black, -/area/station/commons/lounge) "qSP" = ( /obj/machinery/vending/coffee, /obj/machinery/light/directional/east, @@ -58970,6 +59134,13 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"qTl" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/lobby) "qTm" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -59063,6 +59234,12 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) +"qVj" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "qVm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59089,12 +59266,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) -"qVx" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "qVz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59171,10 +59342,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/openspace, /area/station/command/bridge) -"qWn" = ( -/obj/effect/landmark/start/mime, -/turf/open/floor/carpet/black, -/area/station/service/theater) "qWv" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck{ @@ -59193,15 +59360,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/textured, /area/station/medical/surgery) -"qWF" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/obj/effect/landmark/navigate_destination/tools, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "qWV" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -59209,6 +59367,15 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"qWW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "qXj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -59246,6 +59413,13 @@ /obj/effect/turf_decal/trimline/yellow, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"qXB" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "qXH" = ( /obj/structure/cable, /obj/effect/landmark/start/depsec/engineering, @@ -59279,13 +59453,6 @@ dir = 8 }, /area/station/service/chapel) -"qXU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "qYi" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/turf_decal/bot, @@ -59328,13 +59495,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"qYu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/public/glass{ - name = "Blue Base" - }, -/turf/open/floor/circuit, -/area/station/maintenance/hallway/abandoned_recreation) "qYB" = ( /obj/structure/chair/greyscale{ dir = 1 @@ -59356,6 +59516,17 @@ /obj/item/sticker/pslime, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"qYU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Bar Backroom" + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "qYW" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59372,13 +59543,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"qZl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "qZv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -59394,6 +59558,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"qZE" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "qZH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -59469,13 +59643,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/medbay/central) -"rak" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "ran" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -59550,14 +59717,6 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"rbs" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "rbx" = ( /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark/textured_large, @@ -59667,6 +59826,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay/central) +"rdk" = ( +/obj/structure/table, +/obj/item/food/chocolatebar{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/dry_ramen{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "rdl" = ( /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, @@ -59688,6 +59861,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) +"rdu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "rdx" = ( /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/large, @@ -59725,32 +59907,30 @@ /turf/open/floor/wood, /area/station/service/cafeteria) "reh" = ( -/obj/structure/stairs/east, -/turf/open/floor/iron/stairs/medium{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/glass, /area/station/service/kitchen) "rei" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) -"reu" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/dark/smooth_half, -/area/station/service/library) +"req" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "rey" = ( /obj/structure/lattice/catwalk, /obj/machinery/camera/autoname/directional/north, /turf/open/openspace, /area/station/hallway/secondary/construction) -"reF" = ( -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/engine, -/area/station/service/hydroponics) -"reI" = ( -/obj/structure/cable, -/turf/open/floor/iron/stairs, -/area/station/service/library) "reN" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59796,11 +59976,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"rfw" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "rfE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/lattice/catwalk, @@ -59853,6 +60028,10 @@ }, /turf/open/floor/carpet, /area/station/command/meeting_room/council) +"rgH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "rhx" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -59898,19 +60077,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"rhI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Bar & Restaurant" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/lounge) "rhM" = ( /obj/effect/turf_decal/trimline/white/corner{ dir = 8 @@ -59923,34 +60089,18 @@ }, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) -"rhP" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/mid_joiner{ - dir = 1 - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "rih" = ( /turf/open/floor/plating, /area/station/maintenance/central) -"riq" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "44444" - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ +"rii" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "riv" = ( /obj/item/trash/shok_roks/berry, /obj/structure/cable, @@ -59962,23 +60112,27 @@ "riD" = ( /turf/closed/wall, /area/station/maintenance/port) +"riE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library) "riI" = ( /obj/structure/lattice/catwalk, /obj/machinery/light/directional/north, /turf/open/openspace, /area/station/engineering/break_room) -"riL" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 +"riR" = ( +/obj/structure/railing{ + dir = 6 }, -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ - dir = 1; - pixel_y = 3 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) +/turf/open/openspace, +/area/station/service/library) "riV" = ( /obj/structure/table, /obj/item/hfr_box/core{ @@ -60057,6 +60211,25 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) +"rjU" = ( +/obj/item/storage/crayons{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/structure/table, +/turf/open/floor/wood, +/area/station/service/library) +"rkf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"rkg" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "rki" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/engine, @@ -60072,6 +60245,11 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/glass/reinforced, /area/station/hallway/secondary/construction) +"rkD" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/stool/bar/directional/east, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "rkF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/item/radio/intercom/directional/west, @@ -60088,6 +60266,39 @@ /obj/structure/flora/bush/large/style_random, /turf/open/misc/asteroid, /area/station/science/xenobiology/hallway) +"rkK" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hydropony_shutters"; + name = "Hydropony's Shutters" + }, +/obj/item/paper{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) +"rkN" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/item/newspaper{ + pixel_y = 2 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "rkW" = ( /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/smooth_large, @@ -60114,6 +60325,17 @@ /obj/machinery/chem_master, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"rly" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/start/librarian, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"rlE" = ( +/obj/structure/hedge, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "rlR" = ( /obj/item/storage/box/snappops{ pixel_x = 6; @@ -60150,6 +60372,17 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) +"rmd" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/atmospherics, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/atmos/project) "rmg" = ( /obj/structure/stairs/north, /obj/machinery/airalarm/directional/east, @@ -60328,6 +60561,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"ror" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "N2O to Port" + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "rot" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -60416,6 +60660,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) +"rpz" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "rpB" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) @@ -60483,6 +60733,14 @@ "rqo" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/project) +"rqp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/lobby) "rqq" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/chapel, @@ -60542,9 +60800,6 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) -"rrm" = ( -/turf/open/floor/iron/dark/smooth_half, -/area/station/service/library) "rro" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -60850,13 +61105,15 @@ "rwh" = ( /turf/closed/wall/r_wall, /area/station/security/medical) -"rwt" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/machinery/door/airlock/wood{ - name = "Curator Office" +"rwy" = ( +/obj/structure/chair/office{ + dir = 8 }, -/turf/open/floor/wood/large, -/area/station/maintenance/hallway/abandoned_recreation) +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "rwG" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -60879,15 +61136,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"rwL" = ( -/obj/structure/chair/stool/bar/directional/north, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "rwO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -60903,6 +61151,14 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"rwU" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "rwW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/grass, @@ -60923,6 +61179,14 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/storage) +"rxm" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/lobby) "rxo" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -60946,13 +61210,14 @@ "rxH" = ( /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"rxL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"rxI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/dark/end{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/hallway/secondary/service) "rxM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/kitchen/directional/east{ @@ -61050,11 +61315,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"rzZ" = ( -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) "rAa" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -61070,6 +61330,13 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) +"rAg" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "rAl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -61079,14 +61346,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) -"rAy" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, -/obj/effect/landmark/start/assistant, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "rAD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -61098,17 +61357,6 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) -"rAF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/table/wood, -/obj/item/statuebust{ - desc = "Scribbled on its bottom there are the words 'FEARTHEVAPORWAVE'."; - pixel_y = 12 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "rAH" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/start/hangover, @@ -61165,40 +61413,12 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"rBo" = ( -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "rBs" = ( /obj/structure/table, /obj/structure/closet/mini_fridge/grimy, /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"rBx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) -"rBB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/space_heater, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "rBE" = ( /obj/effect/turf_decal/siding/blue{ dir = 1 @@ -61206,18 +61426,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/openspace, /area/station/command/bridge) -"rBF" = ( -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/break_room) "rBI" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/decal/cleanable/confetti, @@ -61345,13 +61553,6 @@ }, /turf/open/floor/eighties, /area/station/construction/storage_wing) -"rDj" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "rDm" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/stairs/right, @@ -61360,15 +61561,6 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rDu" = ( -/obj/structure/table, -/obj/item/instrument/eguitar{ - pixel_y = 5 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "rDv" = ( /turf/closed/wall, /area/station/construction/storage_wing) @@ -61478,14 +61670,12 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"rFl" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) +"rFm" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "rFq" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -61575,15 +61765,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"rGF" = ( -/obj/structure/table/wood/poker, -/obj/item/storage/dice, -/obj/item/stack/spacecash/c20{ - pixel_x = -8; - pixel_y = 8 - }, -/turf/open/floor/carpet/black, -/area/station/commons/lounge) "rGK" = ( /obj/structure/fake_stairs/directional/east, /turf/open/floor/plating, @@ -61644,27 +61825,20 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"rHK" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) -"rHM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "rHN" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"rHP" = ( +/obj/machinery/computer/atmos_control/carbon_tank, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "rHS" = ( /obj/structure/lattice/catwalk, /obj/machinery/door/window/left/directional/west{ @@ -61709,15 +61883,25 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/service/chapel) +"rIr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage" + }, +/obj/effect/landmark/navigate_destination/techstorage, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "rIw" = ( /obj/machinery/vending/tool, /turf/open/floor/iron, /area/station/commons/storage/primary) -"rIx" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/closet/emcloset, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "rIA" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/structure/window/reinforced/spawner/directional/south, @@ -61871,17 +62055,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/cryo) -"rKz" = ( -/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ - name = "N20 Multideck Adapter"; - dir = 8 - }, -/obj/machinery/meter{ - name = "N20 meter" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/project) "rKA" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) @@ -61900,13 +62073,6 @@ /obj/structure/fireaxecabinet/mechremoval/directional/east, /turf/open/floor/iron, /area/station/science/robotics) -"rKO" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "rKQ" = ( /obj/structure/sign/poster/official/walk, /turf/closed/wall, @@ -62094,12 +62260,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/construction/storage_wing) -"rOf" = ( -/obj/structure/sign/poster/contraband/eat/directional/north, -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/service/kitchen) "rOi" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -62160,18 +62320,17 @@ }, /turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) +"rOM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "rOQ" = ( /obj/machinery/skill_station, /turf/open/floor/engine/hull/air, /area/station/maintenance/port/aft) -"rOX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/airlock/public/glass{ - name = "Blue Base" - }, -/turf/open/floor/circuit, -/area/station/maintenance/hallway/abandoned_recreation) "rPd" = ( /obj/effect/turf_decal/siding/purple{ dir = 8 @@ -62181,19 +62340,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"rPh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "rPn" = ( /obj/structure/table, /obj/item/assembly/flash/handheld{ @@ -62229,13 +62375,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/port) -"rPI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) "rPK" = ( /obj/structure/table, /obj/item/paper/guides/jobs/engi/gravity_gen, @@ -62259,14 +62398,6 @@ /obj/effect/mapping_helpers/mail_sorting/service/chapel, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"rPT" = ( -/obj/machinery/door/airlock/wood{ - name = "Curator Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/library, -/obj/machinery/door/firedoor, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) "rPU" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -62433,21 +62564,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"rSh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/any/service/library, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/wood{ - name = "Curator Office" - }, -/turf/open/floor/wood, -/area/station/service/library/printer) -"rSi" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "rSj" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_edge{ @@ -62461,43 +62577,6 @@ /obj/machinery/washing_machine, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"rSC" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/food/pie/cream{ - pixel_y = 9 - }, -/obj/item/food/pie/cream{ - pixel_y = 9 - }, -/obj/item/bikehorn/rubberducky{ - pixel_x = -9; - pixel_y = 2 - }, -/obj/item/bikehorn/rubberducky{ - pixel_x = -14; - pixel_y = 6 - }, -/obj/item/bikehorn/airhorn{ - pixel_x = 9; - pixel_y = 2 - }, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) -"rSX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "rTa" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -62549,6 +62628,17 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) +"rTH" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "rTQ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, /turf/closed/wall/r_wall, @@ -62564,10 +62654,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/secondary/command) -"rTV" = ( -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "rUf" = ( /obj/machinery/door/airlock/virology/glass{ name = "Malpractice Tower" @@ -62577,6 +62663,16 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/dark/textured_large, /area/station/medical/virology) +"rUj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/checker, +/area/station/service/bar) "rUp" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -62605,6 +62701,35 @@ /obj/machinery/disposal/bin, /turf/open/openspace, /area/station/science/xenobiology) +"rUC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/table, +/obj/effect/landmark/event_spawn, +/obj/item/chisel{ + pixel_x = 7; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) +"rUE" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler{ + pixel_y = 11 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) +"rUH" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "rVc" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -62754,6 +62879,13 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) +"rXw" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - co2 Cell"; + name = "atmospherics camera" + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos/upper) "rXD" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, @@ -62770,25 +62902,6 @@ "rXS" = ( /turf/open/floor/plating, /area/station/maintenance/department/medical) -"rXW" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "rXY" = ( /obj/effect/turf_decal/siding/purple/corner, /obj/structure/cable, @@ -62810,15 +62923,6 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) -"rYn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/smartfridge/drying, -/obj/effect/turf_decal/siding/dark{ - dir = 6 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "rYu" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/status_display/evac/directional/west, @@ -62853,31 +62957,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"rYP" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 13 - }, -/obj/item/stamp/head/ce{ - pixel_y = 3 - }, -/obj/item/paper_bin{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/item/pen{ - pixel_x = 17 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "rYQ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/disposal) +"rYV" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/theatre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock{ + name = "Theater Backstage" + }, +/turf/open/floor/plating, +/area/station/service/theater) "rZl" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, @@ -62900,6 +62994,13 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white/textured_corner, /area/station/medical/surgery) +"rZR" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "rZU" = ( /turf/open/floor/engine/hull/reinforced, /area/station/maintenance/port/aft) @@ -62918,13 +63019,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"saQ" = ( -/obj/structure/table, -/obj/item/flashlight/lamp{ - pixel_y = 4 +"saE" = ( +/obj/structure/window/spawner/directional/north, +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) +/turf/open/floor/wood, +/area/station/service/library) "saR" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -62942,10 +63043,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"saY" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/service/library) "sbb" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 @@ -62958,6 +63055,22 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat_interior) +"sbd" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) +"sbh" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "sbn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63005,6 +63118,17 @@ /obj/structure/flora/bush/flowers_yw/style_3, /turf/open/floor/grass, /area/station/science/genetics) +"sbD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "sbF" = ( /obj/item/radio/intercom/directional/east, /obj/structure/rack, @@ -63068,6 +63192,38 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"scf" = ( +/obj/structure/table, +/obj/item/grenade/chem_grenade/teargas/moustache{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/grenade/chem_grenade/glitter/pink{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/grenade/smokebomb{ + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/service/theater_dressing) +"sch" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons{ + pixel_x = -2; + pixel_y = 1 + }, +/obj/item/paint_palette{ + pixel_y = 11 + }, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "scq" = ( /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating, @@ -63079,6 +63235,15 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"scE" = ( +/obj/machinery/light/directional/south, +/obj/machinery/light_switch/directional/south, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "scH" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -63114,6 +63279,15 @@ /obj/effect/spawner/random/trash/crushed_can, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"scT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "sdf" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) @@ -63355,6 +63529,9 @@ /obj/item/radio/intercom, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"sgN" = ( +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "sgQ" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/gambling, @@ -63362,22 +63539,6 @@ icon_state = "carpet-137" }, /area/station/service/abandoned_gambling_den) -"sgU" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/cell_charger{ - pixel_y = 9 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "sgV" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63392,14 +63553,6 @@ "sgX" = ( /turf/open/floor/glass/reinforced/plasma, /area/station/engineering/break_room) -"sgY" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 4 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) "shb" = ( /obj/effect/turf_decal/siding/red{ dir = 8 @@ -63412,6 +63565,23 @@ "shs" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) +"shv" = ( +/obj/structure/closet/crate, +/obj/item/book/manual/chef_recipes, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/storage/box/papersack{ + icon_state = "paperbag_NanotrasenStandard_closed" + }, +/obj/item/storage/box/papersack{ + icon_state = "paperbag_NanotrasenStandard_closed" + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "shx" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) @@ -63448,6 +63618,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"sik" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/hallway/abandoned_recreation) "siz" = ( /obj/machinery/light/directional/south, /obj/structure/lattice/catwalk, @@ -63480,6 +63661,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"siP" = ( +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "siX" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -63491,6 +63675,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"sjb" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "sjq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63510,6 +63702,9 @@ dir = 1 }, /area/station/hallway/secondary/command) +"sjE" = ( +/turf/open/floor/carpet/stellar, +/area/station/service/library) "sjI" = ( /obj/machinery/light/directional/west, /turf/open/openspace, @@ -63566,12 +63761,6 @@ /obj/effect/spawner/random/structure/shipping_container, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"sko" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "skq" = ( /obj/machinery/power/solar{ id = "starboardsolar"; @@ -63596,13 +63785,20 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"skO" = ( -/obj/structure/closet/lasertag/red, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/under/color/red, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/eighties/red, -/area/station/maintenance/hallway/abandoned_recreation) +"skR" = ( +/obj/structure/table/wood, +/obj/item/vending_refill/cigarette{ + pixel_y = 4 + }, +/obj/structure/sign/picture_frame/portrait/bar{ + pixel_y = -32 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "skS" = ( /obj/structure/table/glass, /obj/item/storage/box/monkeycubes{ @@ -63664,6 +63860,15 @@ /obj/effect/spawner/random/structure/grille, /turf/open/space/openspace, /area/space/nearstation) +"slN" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/full, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/obj/machinery/door/airlock/hydroponics{ + name = "Hydroponics" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "slP" = ( /obj/structure/railing{ dir = 4 @@ -63680,11 +63885,19 @@ }, /turf/open/openspace, /area/station/command/bridge) -"slZ" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/siding/thinplating/corner, -/turf/open/floor/iron/dark/smooth_half, -/area/station/service/library) +"smc" = ( +/obj/machinery/button/door/directional/west{ + name = "Kitchen Counter Shutters Control"; + id = "kitchen_counter"; + req_access = list("kitchen") + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "smk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63729,11 +63942,6 @@ }, /turf/closed/wall, /area/station/medical/pharmacy) -"snF" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "snQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -63787,6 +63995,16 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/openspace, /area/station/hallway/primary/central) +"sow" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "soH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -63861,23 +64079,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"sqf" = ( -/obj/machinery/light/warm/dim/directional/south, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 +"spO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 }, -/obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; - name = "HoochMaster Deluxe" - }, -/obj/machinery/requests_console/directional/south{ - department = "Bar"; - name = "Bar Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/checker, -/area/station/service/bar) +/turf/open/floor/wood/large, +/area/station/service/library) "sql" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, @@ -64013,13 +64220,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/construction/storage_wing) -"ssy" = ( -/obj/machinery/restaurant_portal/restaurant, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "ssz" = ( /obj/structure/lattice, /obj/structure/grille, @@ -64058,6 +64258,18 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/virology) +"ssT" = ( +/obj/structure/table/wood, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = -12 + }, +/obj/item/compact_remote{ + pixel_x = -9; + pixel_y = 11 + }, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "ssV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64137,11 +64349,14 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) -"sub" = ( +"suq" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) +/obj/structure/cable, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "sus" = ( /turf/open/floor/plating, /area/station/engineering/storage_shared) @@ -64215,12 +64430,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/engineering/lobby) -"svE" = ( -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) "svL" = ( /obj/machinery/door/poddoor/massdriver_ordnance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64232,6 +64441,14 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/lesser) +"svM" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/station/engineering/lobby) "svW" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -64251,6 +64468,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/maintenance/starboard/lesser) +"swH" = ( +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/structure/table/wood, +/obj/machinery/light/directional/north, +/obj/item/clothing/head/hats/tophat{ + pixel_y = 11 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "swJ" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/sink/directional/east, @@ -64279,6 +64509,34 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"sxd" = ( +/obj/structure/table, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = 3; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -2; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/item/clothing/gloves/color/orange{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "sxh" = ( /obj/machinery/door/firedoor, /turf/open/floor/engine/hull/air, @@ -64294,10 +64552,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"sxx" = ( -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/glass/reinforced, -/area/station/solars/starboard/fore) "sxT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64430,6 +64684,12 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"sAn" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/fyellow, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/carpet, +/area/station/commons/storage/tools) "sAp" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 8 @@ -64437,14 +64697,6 @@ /obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"sAu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "sAB" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -64467,12 +64719,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"sAM" = ( -/obj/machinery/keycard_auth/wall_mounted/directional/west{ - pixel_x = 26 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "sAT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -64486,11 +64732,10 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"sAZ" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) +"sBj" = ( +/obj/effect/landmark/start/clown, +/turf/open/floor/carpet/black, +/area/station/service/theater) "sBk" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -64518,12 +64763,17 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"sBP" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ - dir = 1 +"sBO" = ( +/obj/machinery/meter{ + name = "Plasma meter" }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos/upper) +/obj/machinery/atmospherics/pipe/multiz/yellow/visible{ + name = "Plasma Multideck Adapter"; + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "sCx" = ( /turf/open/openspace, /area/station/command/meeting_room/council) @@ -64559,20 +64809,17 @@ /obj/structure/table/wood/fancy/red, /turf/open/floor/wood/tile, /area/station/maintenance/port/aft) -"sDc" = ( -/obj/structure/chair/sofa/corner/brown, -/obj/structure/sign/clock/directional/east, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) -"sDd" = ( -/obj/structure/lattice/catwalk, -/obj/item/radio/intercom/directional/south, -/obj/structure/closet/secure_closet/security, -/turf/open/openspace, -/area/station/security/checkpoint/customs) "sDo" = ( /turf/open/floor/iron/freezer, /area/station/ai_monitored/turret_protected/aisat/foyer) +"sDu" = ( +/obj/effect/landmark/navigate_destination/library, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" + }, +/turf/open/floor/wood, +/area/station/service/library) "sDX" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -64727,6 +64974,16 @@ /obj/machinery/light/floor, /turf/open/floor/iron/textured_large, /area/station/security/prison/rec) +"sFR" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/oven{ + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "sFS" = ( /obj/effect/turf_decal/siding/yellow{ dir = 8 @@ -64780,17 +65037,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"sGg" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/item/stack/sheet/iron/five, -/obj/item/stack/cable_coil/five, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "sGj" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/railing, @@ -64818,6 +65064,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"sGS" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/cable, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "sGV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -64857,6 +65111,34 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"sHY" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp{ + pixel_y = 10 + }, +/obj/item/toy/figure/ce{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) +"sIf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "sIl" = ( /obj/structure/railing{ dir = 1 @@ -64907,6 +65189,12 @@ /obj/structure/closet/secure_closet/security/sec, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) +"sIv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) "sIB" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -65011,6 +65299,9 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"sJR" = ( +/turf/closed/wall, +/area/station/service/theater_dressing) "sJX" = ( /obj/structure/window/reinforced/plasma/spawner/directional/west, /obj/structure/window/reinforced/plasma/spawner/directional/south, @@ -65023,20 +65314,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) -"sKB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "sKC" = ( /obj/structure/railing{ dir = 1 @@ -65074,6 +65351,18 @@ }, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/lesser) +"sKL" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "sKM" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -65084,26 +65373,10 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"sKR" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "sKT" = ( /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, /area/station/commons/dorms) -"sKU" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/structure/closet/crate/wooden/toy, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "sLd" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, @@ -65180,13 +65453,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/hallway) -"sMo" = ( -/obj/effect/landmark/navigate_destination/library, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" +"sMp" = ( +/obj/item/paint/violet{ + pixel_x = -7; + pixel_y = -1 }, -/turf/open/floor/wood, +/obj/item/paint/yellow{ + pixel_x = 8; + pixel_y = 3 + }, +/turf/open/floor/glass/reinforced, /area/station/service/library) "sMt" = ( /obj/effect/decal/cleanable/dirt, @@ -65215,14 +65491,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/security/prison/mess) -"sMY" = ( -/obj/machinery/restaurant_portal/bar, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/obj/machinery/light/warm/dim/directional/west, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "sNa" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -65238,11 +65506,12 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/aisat/teleporter) -"sNA" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) +"sNv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "sNC" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -65285,24 +65554,9 @@ }, /turf/open/floor/engine/hull/air, /area/station/medical/medbay/central) -"sOl" = ( -/obj/effect/spawner/random/trash/mess, -/obj/item/stack/rods/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "sOn" = ( /turf/open/floor/engine, /area/station/science/auxlab/firing_range) -"sOt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/wood/large, -/area/station/service/library) "sOv" = ( /obj/effect/turf_decal/siding/dark/corner{ dir = 1 @@ -65323,6 +65577,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/breakroom) +"sOJ" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/warm/dim/directional/east, +/obj/structure/transport/linear/public, +/obj/machinery/smartfridge/food, +/turf/open/floor/plating/elevatorshaft, +/area/station/service/kitchen) "sON" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -65333,12 +65594,16 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/cafeteria) -"sOW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"sPg" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "sPj" = ( /obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/iron/dark, @@ -65380,6 +65645,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"sPy" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/modular_computer/preset/cargochat/service, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "sPC" = ( /obj/machinery/holopad, /turf/open/floor/iron/cafeteria, @@ -65389,12 +65670,6 @@ /obj/effect/spawner/random/food_or_drink, /turf/open/floor/plating, /area/station/maintenance/port) -"sPW" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "sQd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65452,6 +65727,15 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"sQI" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "sQJ" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -65463,11 +65747,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"sQZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/openspace, -/area/station/hallway/primary/starboard) +"sQY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "sRd" = ( /obj/machinery/power/turbine/turbine_outlet{ dir = 8 @@ -65518,16 +65805,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"sRs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "sRz" = ( /obj/effect/turf_decal/siding/green{ dir = 4 @@ -65572,18 +65849,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/command/bridge) -"sSn" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/general, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Service Hall" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "sSs" = ( /obj/structure/chair/office/light, /obj/effect/landmark/start/research_director, @@ -65677,10 +65942,6 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/port/aft) -"sTr" = ( -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "sTv" = ( /turf/closed/wall, /area/station/security/courtroom) @@ -65850,6 +66111,16 @@ }, /turf/open/floor/iron/dark, /area/station/construction/storage_wing) +"sWI" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "sWJ" = ( /obj/effect/spawner/structure/window/hollow/middle, /turf/open/floor/plating, @@ -65874,6 +66145,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal) +"sXd" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/wood, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychologist's Office Curtains"; + id = "psychpriv" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "sXj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65893,11 +66174,13 @@ "sXq" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/security/execution/transfer) -"sXH" = ( -/obj/structure/showcase/machinery/tv, -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) +"sXI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Blue Base" + }, +/turf/open/floor/circuit, +/area/station/maintenance/hallway/abandoned_recreation) "sXL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/flasher/directional/east{ @@ -66065,6 +66348,24 @@ "tas" = ( /turf/closed/wall, /area/station/command/heads_quarters/qm) +"taC" = ( +/obj/effect/spawner/random/structure/girder, +/obj/effect/spawner/structure/electrified_grille, +/obj/structure/sign/warning/radiation/rad_area/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"taF" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "taG" = ( /obj/structure/chair/sofa/corp/left, /obj/item/pai_card, @@ -66087,6 +66388,25 @@ dir = 1 }, /area/station/medical/pharmacy) +"taX" = ( +/obj/item/vending_refill/boozeomat{ + pixel_x = -4; + pixel_y = 14 + }, +/obj/item/vending_refill/cytopro{ + pixel_x = 11; + pixel_y = 11 + }, +/obj/item/vending_refill/hotdog{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/structure/railing/corner/end{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "tbd" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "SM_shutters"; @@ -66109,15 +66429,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"tbm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/sink/directional/west, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "tbu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -66128,6 +66439,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"tbw" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library) "tbz" = ( /obj/structure/closet/lasertag, /obj/effect/decal/cleanable/dirt, @@ -66139,13 +66457,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"tbV" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "tbY" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -66177,9 +66488,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/eighties/red, /area/station/maintenance/hallway/abandoned_recreation) +"tcd" = ( +/obj/effect/turf_decal/stripes/box, +/obj/structure/ladder, +/turf/open/floor/iron/smooth, +/area/station/engineering/main) "tce" = ( /turf/closed/wall, /area/station/service/kitchen/abandoned) +"tcf" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/primary/central) "tci" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66202,6 +66527,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"tcw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/openspace, +/area/station/engineering/atmos/project) "tcx" = ( /obj/structure/lattice/catwalk, /obj/structure/light_construct/directional/east, @@ -66223,6 +66555,16 @@ /obj/structure/closet, /turf/open/floor/plating/airless, /area/station/maintenance/port/aft) +"tdt" = ( +/obj/structure/chair/sofa/right/brown, +/obj/item/pillow, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/obj/structure/sign/poster/official/get_your_legs/directional/north, +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "tdx" = ( /obj/structure/cable, /obj/machinery/power/emitter/welded, @@ -66300,6 +66642,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"tev" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/station/service/library) "tey" = ( /obj/structure/cable, /turf/closed/wall/r_wall, @@ -66308,6 +66654,12 @@ /obj/structure/railing, /turf/open/openspace, /area/station/ai_monitored/turret_protected/ai) +"teC" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "teR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66334,10 +66686,27 @@ /obj/structure/cable, /turf/closed/wall, /area/station/security/courtroom) +"tff" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/engineering/glass{ + name = "Grav Gen & Tech Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tfp" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"tfr" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/water, +/area/station/maintenance/port/fore) "tfv" = ( /obj/machinery/door/airlock/silver{ aiControlDisabled = 1; @@ -66361,6 +66730,21 @@ "tfK" = ( /turf/open/floor/glass, /area/station/service/kitchen) +"tfP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/chief_engineer, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) +"tfR" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "tfT" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/random/entertainment/gambling, @@ -66448,26 +66832,20 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood/large, /area/station/service/library/private) -"thM" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/item/toy/crayon/spraycan{ - pixel_x = 15; - pixel_y = 18 - }, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/landmark/start/clown, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) "thW" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) +"tia" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Laser Tag" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/turf/open/floor/circuit/red, +/area/station/maintenance/hallway/abandoned_recreation) "tid" = ( /obj/structure/transit_tube/junction{ dir = 8 @@ -66500,22 +66878,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"tiU" = ( -/obj/structure/stairs/east, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/hallway/primary/central) "tja" = ( /obj/machinery/light/cold/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) +"tjg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "tji" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -66599,6 +66974,13 @@ }, /turf/open/openspace, /area/station/ai_monitored/turret_protected/ai) +"tkr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "tkz" = ( /obj/effect/decal/cleanable/blood/old, /obj/structure/railing/corner{ @@ -66672,18 +67054,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"tlh" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Primary Tool Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "tls" = ( /obj/structure/window/reinforced/plasma/spawner/directional/west, /obj/structure/window/reinforced/plasma/spawner/directional/south, @@ -66775,6 +67145,13 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"tnb" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "tnf" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -66796,22 +67173,29 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/port) +"tnu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "tnv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) -"tnF" = ( -/obj/structure/table, -/obj/item/storage/box/hug{ - pixel_y = 9 +"tnM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/item/bikehorn{ - pixel_y = -1 - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater_dressing) +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "tnS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66905,6 +67289,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"toV" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, +/area/station/engineering/atmos/upper) "tpe" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -66932,12 +67320,29 @@ dir = 1 }, /area/station/ai_monitored/turret_protected/ai) +"tpj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/poster/contraband/grey_tide/directional/west, +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "tpl" = ( /obj/machinery/light/directional/north, /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/elevatorshaft, /area/station/security/prison) +"tpt" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/broken_flooring/side/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "tpA" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -66951,23 +67356,25 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"tpU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/airlock/access/any/service/library, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/wood{ + name = "Curator Office" + }, +/turf/open/floor/wood, +/area/station/hallway/primary/central) +"tqN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "tqQ" = ( /turf/open/floor/iron/dark, /area/station/commons/dorms) -"tqU" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/atmospherics, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) -"trG" = ( -/obj/structure/table/wood/poker, -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/entertainment/deck{ - pixel_x = 6; - pixel_y = 5 - }, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "trH" = ( /obj/effect/landmark/event_spawn, /turf/open/openspace, @@ -66992,6 +67399,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tsd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/library) "tse" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -67008,14 +67425,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tsA" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) +"tsI" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "tsJ" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -67038,6 +67458,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"ttq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "ttr" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/dropper{ @@ -67093,17 +67519,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"tug" = ( -/obj/machinery/disposal/bin/tagger, -/obj/machinery/airalarm/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "tuj" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -67191,26 +67606,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/science/research) -"tvq" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Community Center" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/wood/large, -/area/station/service/library) -"tvz" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/warm/dim/directional/east, -/obj/structure/transport/linear/public, -/obj/machinery/smartfridge/food, -/turf/open/floor/plating/elevatorshaft, -/area/station/service/kitchen) "tvN" = ( /obj/structure/railing{ dir = 8 @@ -67228,11 +67623,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) -"tvT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "tvU" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/tile/dark_blue{ @@ -67277,11 +67667,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/science/xenobiology) -"twR" = ( -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "twX" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -67373,6 +67758,20 @@ /obj/structure/fluff/paper/corner, /turf/open/floor/wood, /area/station/maintenance/starboard/aft) +"typ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/item/toy/crayon/spraycan{ + pixel_x = 15; + pixel_y = 18 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/clown, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "tyw" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -67384,55 +67783,17 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/lockers) -"tyx" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 8 - }, -/obj/effect/landmark/firealarm_sanity, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "tyR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/closet_empty/crate, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/checker, /area/station/maintenance/hallway/abandoned_recreation) -"tyY" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/cable, -/obj/structure/sign/warning/radiation/rad_area/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "tza" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/dinner, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/lesser) -"tzb" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"tze" = ( -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "tzi" = ( /obj/effect/spawner/random/trash/grime, /obj/effect/decal/cleanable/dirt/dust, @@ -67543,6 +67904,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"tAT" = ( +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw{ + dir = 8 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/edge{ + dir = 8 + }, +/area/station/hallway/primary/fore) "tAU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -67598,10 +67971,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/security/prison) -"tBC" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/glass, -/area/station/service/kitchen) +"tBt" = ( +/obj/machinery/light/directional/east, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/glass/reinforced, +/area/station/service/library) "tBJ" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/photosynthetic, @@ -67656,6 +68032,15 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) +"tCh" = ( +/obj/structure/table, +/obj/machinery/status_display/ai/directional/north, +/obj/item/analyzer, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "tCs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -67669,29 +68054,14 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) -"tCu" = ( +"tCz" = ( +/obj/item/radio/intercom/directional/west, /obj/structure/table, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -6; - pixel_y = 5 +/obj/machinery/computer/records/medical/laptop{ + pixel_y = 4 }, -/obj/item/rag{ - pixel_x = 10; - pixel_y = 17 - }, -/obj/item/reagent_containers/cup/bowl{ - pixel_y = 17 - }, -/obj/item/reagent_containers/condiment/honey{ - pixel_x = 9; - pixel_y = -3 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) +/turf/open/floor/wood/large, +/area/station/medical/psychology) "tCE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -67715,12 +68085,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"tCI" = ( -/obj/machinery/computer/atmos_control{ - dir = 1 - }, -/turf/open/floor/glass/reinforced/plasma, -/area/station/engineering/atmos/project) "tCO" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -67822,6 +68186,16 @@ }, /turf/open/floor/iron/checker, /area/station/maintenance/port/aft) +"tDT" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/aisat/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) "tDY" = ( /turf/closed/wall, /area/station/science/lobby) @@ -67834,15 +68208,6 @@ /obj/structure/lattice/catwalk, /turf/open/floor/engine/hull/air, /area/station/cargo/storage) -"tEs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "tEt" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, @@ -67878,6 +68243,22 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"tER" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/warm/dim/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "tES" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -67925,6 +68306,13 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) +"tFq" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/project) "tFv" = ( /obj/structure/chair{ dir = 1 @@ -68101,13 +68489,15 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"tHK" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/wood{ +"tHG" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/office{ dir = 4 }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) "tHR" = ( /obj/structure/sign/warning/radiation/rad_area/directional/east, /turf/open/floor/iron/smooth, @@ -68153,29 +68543,11 @@ /obj/effect/spawner/random/trash/soap, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/aft) -"tIT" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 30 - }, -/obj/item/stack/sheet/glass{ - amount = 30 - }, -/obj/item/stack/rods{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/machinery/camera/autoname/directional/north, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"tIW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +"tIO" = ( +/obj/machinery/light/directional/south, +/obj/machinery/vending/clothing, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "tJk" = ( /obj/structure/chair{ dir = 1 @@ -68299,6 +68671,12 @@ /obj/effect/turf_decal/tile/dark_blue, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) +"tKJ" = ( +/obj/structure/transport/linear{ + radial_travel = 0 + }, +/turf/open/openspace, +/area/station/engineering/atmos/project) "tKK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68323,6 +68701,11 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/openspace, /area/station/hallway/primary/starboard) +"tLp" = ( +/obj/effect/turf_decal/siding/wood/end, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "tLq" = ( /obj/machinery/conveyor{ dir = 4; @@ -68352,15 +68735,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/maintenance/hallway/abandoned_recreation) -"tLO" = ( -/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) "tLQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -68529,6 +68903,26 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron/smooth, /area/station/engineering/hallway) +"tOj" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 + }, +/area/station/commons/lounge) +"tOr" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/machinery/button/door/directional/north{ + id = "hydropony_shutters"; + name = "hydroponics shutters control"; + pixel_x = 10; + pixel_y = 30; + req_access = list("hydroponics") + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "tOw" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/medium{ @@ -68611,6 +69005,15 @@ }, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"tPH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "tPI" = ( /obj/structure/table/glass, /obj/structure/railing/corner{ @@ -68629,6 +69032,23 @@ "tPU" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) +"tQa" = ( +/obj/structure/lattice/catwalk, +/obj/item/storage/box/syringes{ + pixel_x = -10; + pixel_y = 4 + }, +/obj/item/storage/box/syringes{ + pixel_x = -10; + pixel_y = -3 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/camera/autoname/directional/south{ + c_tag = "Medbay - Upper Medical Storage South" + }, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, +/turf/open/openspace, +/area/station/medical/storage) "tQf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -68641,17 +69061,16 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"tQx" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 +"tQw" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/hallway/abandoned_recreation) +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "tQI" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -68659,17 +69078,19 @@ }, /turf/open/floor/wood, /area/station/command/gateway) -"tQR" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +"tRc" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ + pixel_x = -5; + pixel_y = 16 }, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 1 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 4 + }, +/area/station/commons/lounge) "tRd" = ( /obj/structure/cable/layer3, /turf/open/floor/iron/dark/textured_large, @@ -68933,6 +69354,27 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"tUI" = ( +/obj/machinery/button/door/directional/south{ + id = "ceprivacy"; + name = "Privacy Shutters Control"; + pixel_y = -2; + pixel_x = -7 + }, +/obj/machinery/button/door/directional/west{ + id = "transitlockdown"; + name = "Transit Tube Lockdown"; + pixel_x = 7; + pixel_y = -2 + }, +/obj/machinery/button/door{ + id = "securestoragecw"; + name = "Secure Storage"; + pixel_y = 8 + }, +/obj/structure/table/reinforced/rglass, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "tUS" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 4 @@ -69039,6 +69481,18 @@ /obj/structure/closet/secure_closet/exile, /turf/open/openspace, /area/station/command/gateway) +"tWQ" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1; + pixel_y = 3 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "tWR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -69081,6 +69535,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"tXg" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/closed/wall, +/area/station/service/kitchen) "tXl" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/engine, @@ -69184,6 +69644,25 @@ }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/command/nuke_storage) +"tYt" = ( +/obj/item/cardboard_cutout{ + pixel_x = 14; + pixel_y = 9 + }, +/obj/item/cardboard_cutout{ + pixel_x = 14; + pixel_y = 4 + }, +/obj/item/cardboard_cutout{ + pixel_x = 14; + pixel_y = -1 + }, +/obj/effect/landmark/start/mime, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "tYz" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/siding/brown{ @@ -69272,20 +69751,6 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"tZT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/service/kitchen, -/obj/effect/turf_decal/tile/dark_blue, -/obj/effect/turf_decal/siding/dark/end{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/hallway/secondary/service) "tZV" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, @@ -69420,10 +69885,6 @@ dir = 8 }, /area/station/command/corporate_showroom) -"ucu" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "ucC" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -69457,6 +69918,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/openspace, /area/station/science/xenobiology) +"ucN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "ucO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69503,6 +69970,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"udE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/wood{ + name = "Event Storage" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/service/theater_dressing) "udF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance, @@ -69655,6 +70133,10 @@ /obj/effect/mapping_helpers/dead_body_placer, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"ugn" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "ugo" = ( /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/delivery/white{ @@ -69662,10 +70144,6 @@ }, /turf/open/floor/engine, /area/station/engineering/break_room) -"ugp" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/station/service/library) "ugq" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -69738,22 +70216,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"uhg" = ( -/obj/structure/table, -/obj/item/hfr_box/body/moderator_input{ - pixel_x = -8; - pixel_y = 8 +"uhd" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 }, -/obj/item/hfr_box/body/waste_output{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/hfr_box/body/interface, -/obj/item/hfr_box/body/waste_output{ - pixel_x = -15 - }, -/turf/open/floor/engine, -/area/station/engineering/atmos/hfr_room) +/turf/open/openspace, +/area/station/service/kitchen) "uhl" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -69784,6 +70252,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/engineering/lobby) +"uhV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/mail_sorting/engineering/ce_office, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "uhY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -69796,6 +70275,13 @@ }, /turf/open/openspace, /area/station/cargo/storage) +"uii" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Community Center" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood/large, +/area/station/service/library) "uik" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /obj/effect/decal/cleanable/dirt, @@ -69906,6 +70392,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/ai_monitored/command/nuke_storage) +"uki" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "ukk" = ( /obj/effect/turf_decal/bot_white, /obj/effect/decal/cleanable/dirt, @@ -69982,15 +70473,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) -"ukV" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "ukZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -70053,6 +70535,25 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ulx" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/window/spawner/directional/east, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/wood, +/area/station/service/library) +"ulM" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "ulP" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -70064,19 +70565,6 @@ /obj/machinery/vending/wardrobe/gene_wardrobe, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) -"ulQ" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Office" - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "ulU" = ( /obj/machinery/door/airlock/grunge, /obj/effect/mapping_helpers/airlock/access/any/command/general, @@ -70119,12 +70607,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"uml" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "umq" = ( /obj/machinery/light/directional/east, /obj/structure/filingcabinet/chestdrawer{ @@ -70182,13 +70664,12 @@ "umH" = ( /turf/closed/wall, /area/station/medical/psychology) -"unc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ +"umN" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 }, -/turf/open/floor/catwalk_floor, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) "ung" = ( /obj/effect/turf_decal/stripes/line{ @@ -70295,19 +70776,6 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/office) -"uoP" = ( -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/structure/table/wood, -/obj/machinery/light/directional/north, -/obj/item/clothing/head/hats/tophat{ - pixel_y = 11 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "uoU" = ( /obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ dir = 4 @@ -70325,18 +70793,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/service/lawoffice) -"uoW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "upl" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/eighties, @@ -70399,13 +70855,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage) -"uqf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/filingcabinet/chestdrawer, -/mob/living/basic/parrot/poly, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "uqi" = ( /obj/effect/turf_decal/siding/green{ dir = 4 @@ -70459,6 +70908,11 @@ /obj/effect/landmark/start/depsec/supply, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"uqL" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "uqR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/confetti, @@ -70537,14 +70991,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/science/explab) -"urL" = ( -/obj/structure/sink/directional/east, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/effect/mapping_helpers/mail_sorting/service/bar, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "urV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70567,15 +71013,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine/hull/air, /area/station/construction/storage_wing) -"usq" = ( -/obj/item/cigarette/cigar{ - pixel_x = 4 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/effect/turf_decal/siding/thinplating_new/dark/end, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "usr" = ( /obj/structure/cable, /obj/machinery/power/apc/worn_out/directional/north, @@ -70586,15 +71023,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/small, /area/station/security/mechbay) -"uss" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "ust" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70661,17 +71089,25 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/security/processing) -"utk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/wood, -/obj/item/clothing/head/costume/sombrero{ - pixel_y = 8 +"utq" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/table, +/obj/item/stock_parts/power_store/cell/high, +/obj/machinery/cell_charger, +/obj/item/multitool/circuit{ + pixel_x = 7; + pixel_y = 16 }, -/obj/item/gun/magic/wand/nothing, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) +/obj/item/multitool/circuit{ + pixel_x = 10; + pixel_y = 14 + }, +/obj/item/multitool/circuit{ + pixel_x = 2; + pixel_y = 15 + }, +/turf/open/floor/iron/dark/smooth_edge, +/area/station/service/library) "uts" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -70748,11 +71184,32 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/hallway) +"uuj" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/hallway/secondary/service) "uuk" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/turret_protected/ai_upload) +"uum" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Theater Stage"; + req_access = list("theatre") + }, +/turf/open/floor/wood, +/area/station/service/library) "uuo" = ( /obj/machinery/airalarm/directional/south, /obj/structure/broken_flooring/side/directional/north, @@ -70834,12 +71291,6 @@ /obj/structure/table/wood, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) -"uvt" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/closed/wall, -/area/station/service/theater_dressing) "uvu" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/structure/cable, @@ -70901,6 +71352,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) +"uwj" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/fax{ + fax_name = "Service"; + name = "Service Fax Machine" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "uwn" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -70986,21 +71453,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uxe" = ( -/obj/structure/closet/l3closet/janitor, -/obj/machinery/requests_console/directional/north{ - department = "Janitorial"; - name = "Janitorial Requests Console"; - pixel_x = -30; - pixel_y = 0 +"uxl" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "uxo" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71135,6 +71598,14 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/central) +"uyq" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "uyr" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71150,6 +71621,15 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"uyw" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/flashlight{ + pixel_y = 8 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/eighties/red, +/area/station/maintenance/hallway/abandoned_recreation) "uyD" = ( /obj/effect/turf_decal/siding/brown{ dir = 10 @@ -71223,6 +71703,12 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) +"uzI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/station/hallway/secondary/service) "uzM" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -71240,6 +71726,16 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) +"uzQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/weldingtool, +/obj/item/wrench, +/obj/item/clothing/head/utility/welding, +/obj/structure/rack, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "uAl" = ( /turf/closed/wall, /area/station/engineering/lobby) @@ -71459,18 +71955,6 @@ /obj/effect/landmark/firealarm_sanity, /turf/open/openspace, /area/station/command/meeting_room/council) -"uDu" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "uDv" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron, @@ -71635,6 +72119,13 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark, /area/station/security/office) +"uGf" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "uGj" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/start/hangover, @@ -71649,17 +72140,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"uGq" = ( -/obj/item/paint/violet{ - pixel_x = -7; - pixel_y = -1 - }, -/obj/item/paint/yellow{ - pixel_x = 8; - pixel_y = 3 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "uGt" = ( /obj/structure/tank_holder/extinguisher, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -71707,6 +72187,32 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) +"uGT" = ( +/obj/structure/railing, +/obj/machinery/door/firedoor/border_only, +/obj/structure/closet/crate/medical, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/effect/spawner/random/maintenance, +/obj/item/pen/red{ + pixel_y = 10 + }, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychologist's Office Curtains"; + id = "psychpriv" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "uGV" = ( /obj/effect/turf_decal/box/corners{ dir = 1 @@ -71746,6 +72252,20 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"uHo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/station/commons/lounge) "uHy" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71759,17 +72279,6 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"uHA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/yjunction, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9-Bridge"; - location = "8-Kitchen" - }, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "uHD" = ( /obj/structure/chair{ dir = 4 @@ -71781,6 +72290,16 @@ /obj/machinery/washing_machine, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"uHK" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/engineering_all, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "uHL" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71795,6 +72314,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"uHV" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "uHY" = ( /obj/machinery/recharge_station, /turf/open/floor/iron/dark, @@ -71827,6 +72357,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"uIA" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/service/library) "uIG" = ( /obj/item/poster/random_official, /obj/effect/decal/cleanable/blood/old, @@ -71891,16 +72427,17 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"uJX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/eighties, +/area/station/maintenance/hallway/abandoned_recreation) "uKa" = ( /turf/closed/wall, /area/station/security/warden) -"uKf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/engineering/atmos/upper) "uKh" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -71908,6 +72445,11 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"uKj" = ( +/obj/effect/turf_decal/stripes/box, +/obj/structure/ladder, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "uKm" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -71920,6 +72462,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/port) +"uKp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/commons/lounge) "uKt" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -71939,6 +72495,19 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) +"uKN" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_y = 8 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "uKP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -71955,11 +72524,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"uKY" = ( -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "uLb" = ( /obj/structure/closet/crate/secure/trashcart, /obj/item/sord, @@ -71974,6 +72538,16 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/maintenance/port/aft) +"uLf" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/psychologist, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/black, +/area/station/medical/psychology) "uLi" = ( /obj/structure/table, /obj/item/clothing/head/costume/tv_head{ @@ -72139,13 +72713,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"uOw" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "uOx" = ( /obj/structure/table/glass, /obj/machinery/wall_healer/directional/west, @@ -72167,6 +72734,12 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/security/interrogation) +"uOR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/hallway/secondary/service) "uOS" = ( /obj/structure/table/glass, /obj/item/storage/fancy/candle_box, @@ -72261,48 +72834,11 @@ "uRd" = ( /turf/open/openspace, /area/station/maintenance/port/fore) -"uRj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "uRk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/construction/storage_wing) -"uRp" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/railing/corner/end, -/obj/effect/turf_decal/siding/dark/corner{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"uRq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail, -/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, -/obj/effect/mapping_helpers/mail_sorting/service/janitor_closet, -/obj/effect/mapping_helpers/mail_sorting/service/kitchen, -/obj/effect/mapping_helpers/mail_sorting/service/bar, -/obj/effect/mapping_helpers/mail_sorting/service/theater, -/obj/structure/cable, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "uRs" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -72316,25 +72852,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/openspace, /area/station/hallway/secondary/exit/departure_lounge) -"uRu" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "uRx" = ( /obj/effect/decal/cleanable/dirt, /obj/item/trash/boritos, /turf/open/floor/iron, /area/station/maintenance/starboard/lesser) +"uRy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar) "uRz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/north, @@ -72346,24 +72880,6 @@ }, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) -"uRK" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/black, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "uRM" = ( /obj/structure/table, /obj/effect/spawner/random/trash/janitor_supplies{ @@ -72372,6 +72888,57 @@ }, /turf/open/floor/plating, /area/station/security/interrogation) +"uRU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = -4; + pixel_y = 14 + }, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/cooking_to_serve_man{ + pixel_x = -6; + pixel_y = 14 + }, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = 3; + pixel_y = 10 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 12 + }, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_y = 9 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/station/service/library) +"uRV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/obj/effect/turf_decal/tile/green/full, +/obj/machinery/door/airlock/hydroponics{ + name = "Hydroponics Lab" + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) +"uSa" = ( +/obj/structure/sign/clock/directional/west, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "uSg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/freezer, @@ -72409,6 +72976,39 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"uSV" = ( +/mob/living/basic/lizard/wags_his_tail, +/obj/structure/bed, +/obj/item/storage/box/lights/mixed{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/item/storage/box/mousetraps{ + pixel_x = -9; + pixel_y = 14 + }, +/obj/item/storage/box/mousetraps{ + pixel_x = 5; + pixel_y = 27 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -11; + pixel_y = 27 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -11; + pixel_y = 27 + }, +/obj/effect/landmark/start/janitor, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "uTc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -72430,21 +73030,19 @@ }, /turf/open/space/basic, /area/space) -"uTi" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/turf/open/floor/wood/large, -/area/station/service/bar) -"uTq" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen" +"uTl" = ( +/obj/structure/transport/linear{ + radial_travel = 0 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "catwalk_atmos"; + preset_destination_names = list("2"="Lower Atmos","3"="Upper Atmos") + }, +/obj/effect/landmark/transport/transport_id{ + specific_transport_id = "catwalk_atmos" + }, +/turf/open/openspace, +/area/station/engineering/atmos/project) "uTy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, @@ -72453,10 +73051,6 @@ /obj/effect/turf_decal/tile/dark/full, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"uTI" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/upper) "uTJ" = ( /obj/machinery/light/directional/west, /turf/open/openspace, @@ -72475,13 +73069,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_large, /area/station/ai_monitored/turret_protected/aisat_interior) -"uTU" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/atmos/project) "uTY" = ( /obj/structure/fake_stairs/directional/north, /obj/machinery/door/firedoor, @@ -72591,16 +73178,6 @@ }, /turf/open/floor/carpet, /area/station/security/courtroom) -"uVO" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/reagent_containers/spray/pepper, -/obj/structure/closet/secure_closet/psychology, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "uVP" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -72650,6 +73227,15 @@ /obj/item/clothing/head/costume/mailman, /turf/open/floor/iron, /area/station/cargo/sorting) +"uWM" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "uWO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -72702,22 +73288,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/storage) -"uXG" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar{ - pixel_y = 12 - }, -/obj/item/instrument/eguitar{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar) "uXI" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -72741,14 +73311,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) -"uXW" = ( -/obj/structure/railing, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "uXZ" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/three, @@ -72768,15 +73330,6 @@ /obj/effect/spawner/random/medical/surgery_tool, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"uYr" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "uYu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -72792,16 +73345,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"uYD" = ( -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 - }, -/obj/machinery/door/window/right/directional/east{ - name = "Theater Stage"; - req_access = list("theatre") - }, -/turf/open/floor/wood, -/area/station/service/library) "uYL" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -72819,19 +73362,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uYX" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/engineering/lobby) -"uZg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "uZn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/light/cold/directional/south, @@ -72900,6 +73430,10 @@ dir = 8 }, /area/station/hallway/primary/starboard) +"vas" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "vav" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/stairs/medium, @@ -72934,6 +73468,14 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"vaO" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron/checker, +/area/station/service/bar) "vbe" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -72961,6 +73503,22 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"vbx" = ( +/obj/structure/table, +/obj/item/t_scanner{ + pixel_y = 8 + }, +/obj/item/multitool{ + pixel_x = -5 + }, +/obj/item/multitool{ + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "vbB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -73022,6 +73580,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/service/abandoned_gambling_den) +"vcR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "vcT" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -73141,9 +73704,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) -"vel" = ( -/turf/open/floor/catwalk_floor, -/area/station/engineering/lobby) "vem" = ( /obj/structure/lattice, /obj/machinery/camera/autoname/directional/south, @@ -73230,6 +73790,16 @@ "vfe" = ( /turf/open/floor/iron, /area/station/commons/dorms) +"vfo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/clothing/glasses/welding{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "vfp" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -73265,6 +73835,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/chapel) +"vgh" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/griddle, +/turf/open/openspace, +/area/station/service/kitchen) "vgo" = ( /obj/structure/table/glass, /obj/item/storage/box/gloves{ @@ -73319,12 +73894,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"vgG" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "vgJ" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -73352,6 +73921,27 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/construction/storage_wing) +"vhl" = ( +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/table/wood, +/obj/item/stack/package_wrap{ + pixel_x = -2; + pixel_y = -13 + }, +/obj/item/stack/package_wrap{ + pixel_x = -2; + pixel_y = -13 + }, +/obj/item/holosign_creator/robot_seat/bar{ + pixel_y = -20 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/turf/open/floor/iron/checker, +/area/station/service/bar/backroom) "vht" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/fluff/paper/corner{ @@ -73400,11 +73990,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"vii" = ( -/obj/structure/table/wood/poker, -/obj/item/storage/dice, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "vij" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -73487,20 +74072,6 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vjo" = ( -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/arrow_cw{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/edge{ - dir = 8 - }, -/area/station/hallway/primary/fore) "vjC" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -73684,11 +74255,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/primary/central) -"vlX" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/oven/range, -/turf/open/openspace, -/area/station/service/kitchen) "vma" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -73887,6 +74453,19 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"voY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_green/end{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/checker, +/area/station/hallway/secondary/service) "vpd" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -74067,6 +74646,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"vrA" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "vrC" = ( /obj/machinery/light/directional/east, /turf/open/openspace, @@ -74078,6 +74664,21 @@ }, /turf/open/openspace, /area/station/maintenance/starboard/lesser) +"vsf" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/structure/desk_bell{ + pixel_x = 6; + pixel_y = 15 + }, +/turf/open/floor/wood/large, +/area/station/service/bar) +"vsh" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "vsm" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -74108,15 +74709,11 @@ dir = 1 }, /area/station/service/chapel) -"vsw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) +"vsz" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "vsC" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/photocopier/prebuilt, @@ -74172,6 +74769,15 @@ /obj/structure/sign/poster/contraband/gorlex_recruitment, /turf/closed/wall/r_wall, /area/station/maintenance/port) +"vsQ" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "vsT" = ( /obj/machinery/holopad, /turf/open/floor/glass/reinforced, @@ -74231,13 +74837,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/maintenance/starboard/lesser) -"vtM" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/commons/lounge) "vtT" = ( /turf/open/floor/glass, /area/station/science/zoo) +"vua" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "vuc" = ( /obj/item/banner/cargo/mundane, /obj/structure/disposalpipe/segment{ @@ -74245,6 +74853,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"vuo" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "vuu" = ( /obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, @@ -74272,19 +74889,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/wood, /area/station/security/detectives_office) -"vuV" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/aisat/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) "vvb" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -74348,15 +74952,6 @@ /obj/structure/stairs/west, /turf/open/floor/iron, /area/station/science/zoo) -"vvU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "vvY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/loading_area{ @@ -74405,14 +75000,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/eighties, /area/station/maintenance/hallway/abandoned_recreation) -"vwo" = ( -/obj/structure/easel, -/obj/item/canvas/twentythree_nineteen{ - pixel_x = 3; - pixel_y = 10 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "vwr" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) @@ -74475,20 +75062,15 @@ }, /turf/open/floor/glass, /area/station/tcommsat/server) -"vxk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/computer/atmos_control/plasma_tank{ - dir = 1 +"vxh" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) -"vxm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/banner/red{ - inspiration_available = 0 +/obj/structure/railing/corner{ + dir = 8 }, -/turf/open/floor/circuit/red, -/area/station/maintenance/hallway/abandoned_recreation) +/turf/open/floor/iron/dark/smooth_half, +/area/station/service/library) "vxJ" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ @@ -74496,6 +75078,19 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"vxV" = ( +/obj/machinery/computer/atmos_control/nitrous_tank, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "vyp" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/modular_computer/preset/engineering{ @@ -74536,6 +75131,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/ai_monitored/turret_protected/ai_upload) +"vza" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "vzf" = ( /obj/structure/railing{ dir = 1 @@ -74804,6 +75404,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/xenobiology/hallway) +"vBU" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "vBX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -74871,6 +75480,13 @@ "vCE" = ( /turf/closed/wall, /area/station/ai_monitored/command/nuke_storage) +"vCN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + name = "Red Base" + }, +/turf/open/floor/circuit/red, +/area/station/maintenance/hallway/abandoned_recreation) "vCP" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/openspace, @@ -74950,15 +75566,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"vEh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "vEi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -74979,14 +75586,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vEI" = ( -/obj/effect/turf_decal/box/red, -/obj/item/vending_refill/games{ - pixel_x = 6; - pixel_y = -4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "vEU" = ( /obj/machinery/skill_station, /obj/machinery/airalarm/directional/north, @@ -75023,13 +75622,6 @@ }, /turf/open/floor/engine/hull/air, /area/station/science/research) -"vFG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/lattice/catwalk, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/water, -/area/station/maintenance/starboard/fore) "vFP" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -75217,14 +75809,6 @@ }, /turf/open/floor/iron/white/textured_half, /area/station/ai_monitored/turret_protected/aisat_interior) -"vIt" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/bar) "vIw" = ( /obj/structure/railing, /turf/open/openspace, @@ -75244,10 +75828,11 @@ }, /turf/open/floor/iron, /area/station/science/research) -"vIB" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) +"vIL" = ( +/obj/structure/chair/office, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "vIX" = ( /obj/machinery/camera/autoname/directional/east, /obj/effect/decal/cleanable/dirt, @@ -75281,13 +75866,6 @@ /obj/structure/disposalpipe/junction, /turf/open/floor/iron/large, /area/station/hallway/primary/central) -"vJM" = ( -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/obj/structure/chair/sofa/middle/brown{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "vJP" = ( /obj/structure/table, /obj/item/storage/box/hug/plushes{ @@ -75339,24 +75917,6 @@ "vKt" = ( /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"vKw" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/vodka{ - pixel_y = 15; - pixel_x = 6 - }, -/obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice{ - pixel_x = -5; - pixel_y = 15 - }, -/obj/item/reagent_containers/cup/glass/flask{ - pixel_x = -6 - }, -/obj/item/reagent_containers/cup/glass/flask{ - pixel_x = 11 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "vKL" = ( /obj/structure/railing{ dir = 4 @@ -75478,20 +76038,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/upper) -"vLZ" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/broadcaster{ - pixel_y = 2 - }, -/obj/item/circuitboard/machine/telecomms/bus{ - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "vMn" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -75565,9 +76111,21 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lab) +"vMU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "vNc" = ( -/turf/open/floor/wood/large, -/area/station/medical/psychology) +/obj/structure/railing{ + dir = 10 + }, +/turf/open/openspace, +/area/station/hallway/primary/central) "vNf" = ( /obj/machinery/processor/slime, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -75664,6 +76222,13 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"vOu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/computer/atmos_alert, +/turf/open/floor/engine/hull/reinforced/air, +/area/station/engineering/atmos/project) "vOy" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -75699,17 +76264,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"vPK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Port to Engine"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown, -/turf/open/floor/engine/hull/reinforced/air, -/area/station/engineering/atmos/project) "vPN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75723,6 +76277,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/maintenance/starboard/lesser) +"vPX" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "vQd" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -75822,6 +76384,15 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/cargo/bitrunning/den) +"vRc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "vRd" = ( /obj/effect/decal/cleanable/dirt, /obj/item/circuitboard/computer/operating, @@ -75853,17 +76424,6 @@ /obj/structure/sign/poster/contraband/lizard/directional/west, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"vRt" = ( -/turf/open/floor/carpet/black, -/area/station/service/theater) -"vRu" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/kirbyplants/random, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "vRz" = ( /obj/machinery/light/small/directional/south, /obj/structure/closet/firecloset, @@ -75914,15 +76474,6 @@ /obj/structure/broken_flooring/singular/always_floorplane/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vSa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/banner/blue{ - inspiration_available = 0 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/maintenance/hallway/abandoned_recreation) "vSc" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line, @@ -76062,6 +76613,13 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/large, /area/station/maintenance/starboard/lesser) +"vTu" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "vTv" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -76099,26 +76657,16 @@ /obj/effect/turf_decal/trimline/dark/corner, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"vTY" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Kitchen" +"vUd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 8; + pixel_y = -2 }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/disposal/bin/tagger, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/siding/dark{ - dir = 6 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"vUb" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Quarters" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/ce, /turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/area/station/service/library) "vUi" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -76154,31 +76702,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lobby) -"vUU" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/machinery/coffeemaker/impressa, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 13; - pixel_y = -1 - }, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/mug{ - pixel_x = 13; - pixel_y = 10 - }, -/obj/item/storage/box/coffeepack{ - pixel_y = 10; - pixel_x = -5 - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/checker, -/area/station/service/bar) "vVb" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/firealarm/directional/west, @@ -76191,21 +76714,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"vVr" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/wood, -/obj/item/soap{ - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/bowl/soup/stew{ - desc = "Exactly what it says on the tin."; - initial_reagent = /datum/reagent/consumable/condensedcapsaicin; - name = "6 seconds blinding stew"; - pixel_y = 12 - }, -/turf/open/floor/iron/dark/diagonal, -/area/station/service/theater) "vVv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, @@ -76227,6 +76735,17 @@ /obj/structure/broken_flooring/pile/directional/north, /turf/open/floor/plating, /area/station/engineering/storage_shared) +"vWa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/effect/mapping_helpers/mail_sorting/service/library, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "vWe" = ( /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) @@ -76270,15 +76789,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/medical/medbay/central) -"vWJ" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_half, -/area/station/service/library) +"vXh" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/carpet/black, +/area/station/service/library/private) +"vXl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/space/openspace, +/area/space/nearstation) "vXt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -76294,11 +76814,6 @@ /obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) -"vXF" = ( -/obj/effect/turf_decal/siding/wood/end, -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "vXQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -76385,33 +76900,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) -"vZc" = ( -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = -13 - }, -/obj/structure/sign/poster/contraband/grey_tide/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "vZd" = ( /obj/effect/turf_decal/tile/dark_green/fourcorners, /obj/structure/railing/corner/end/flip{ @@ -76423,6 +76911,13 @@ "vZG" = ( /turf/open/openspace/coldroom, /area/station/medical/coldroom) +"vZI" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/checker, +/area/station/service/bar) "vZM" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/artistic{ @@ -76432,6 +76927,13 @@ /obj/item/storage/belt/utility, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"vZN" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "vZQ" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -76494,6 +76996,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/ai_monitored/command/storage/satellite) +"waU" = ( +/obj/effect/landmark/firealarm_sanity, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"wbc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/sink/directional/west, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/service/janitor) "wbk" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 @@ -76504,15 +77021,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/port) -"wbB" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "wbH" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -76549,24 +77057,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"wca" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/clothing/suit/apron/chef, -/obj/item/knife{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/item/clothing/head/utility/chefhat{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "wce" = ( /obj/structure/railing/corner{ dir = 4 @@ -76586,6 +77076,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/office) +"wcy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) "wcJ" = ( /obj/machinery/atmospherics/components/binary/pump/off/general/visible{ dir = 4; @@ -76604,6 +77100,10 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/science/explab) +"wcQ" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "wcT" = ( /obj/machinery/vending/cigarette, /obj/machinery/camera/autoname/directional/west, @@ -76646,6 +77146,19 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"wdf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/commons/lounge) +"wdh" = ( +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "wdn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/botanical_waste, @@ -76873,6 +77386,15 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"wfV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "wfY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/structure/tank_dispenser, @@ -76903,6 +77425,12 @@ }, /turf/open/floor/carpet, /area/station/maintenance/starboard/aft) +"wgl" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "wgp" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 4 @@ -76937,19 +77465,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/engineering/break_room) -"wgH" = ( -/obj/structure/transport/linear/public, -/obj/structure/table, -/obj/item/plate{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/plate{ - pixel_x = -11; - pixel_y = -2 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/service/kitchen) "wgM" = ( /obj/structure/statue/sandstone/venus{ dir = 1 @@ -76973,6 +77488,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"wgU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "wha" = ( /obj/structure/cable, /obj/machinery/fax{ @@ -77012,12 +77531,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"whv" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/openspace, -/area/station/hallway/primary/central) "whw" = ( /obj/machinery/teleport/hub, /turf/open/floor/iron/dark/textured_large, @@ -77077,6 +77590,13 @@ /obj/structure/reagent_dispensers/wall/peppertank/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) +"wik" = ( +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "wiq" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -77108,6 +77628,15 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"wiF" = ( +/obj/effect/spawner/random/structure/crate_abandoned, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"wiK" = ( +/turf/open/floor/carpet/black, +/area/station/service/library/private) "wiO" = ( /obj/machinery/door/airlock/maintenance{ name = "CE's Maintenance Access" @@ -77116,29 +77645,17 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/lobby) -"wiP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/checker, -/area/station/service/bar) "wiZ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, /obj/effect/landmark/start/hangover, /turf/open/openspace, /area/station/commons/dorms) -"wjf" = ( -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/checker, -/area/station/service/bar) +"wji" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/landmark/start/assistant, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "wju" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -77158,11 +77675,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"wjz" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/smooth, -/area/station/engineering/hallway) "wjH" = ( /obj/structure/stairs/west, /obj/structure/railing{ @@ -77187,6 +77699,13 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/construction/storage_wing) +"wjW" = ( +/obj/machinery/light/warm/dim/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "wjX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -77199,14 +77718,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"wkd" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/spawner/random/entertainment/cigarette{ - pixel_x = -5 - }, -/turf/open/floor/wood/large, -/area/station/service/bar) "wko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77260,12 +77771,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/security/detectives_office/private_investigators_office) -"wlg" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "wlq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -77294,11 +77799,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"wlV" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "wlY" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -77336,15 +77836,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"wmr" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/chief_engineer, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) "wmt" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/item/clothing/head/fedora/white, @@ -77403,28 +77894,18 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"wnn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +"wny" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/turf/open/floor/iron/dark/smooth_corner, +/area/station/commons/lounge) "wnA" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/ai) -"wnC" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "wnD" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/three, @@ -77444,6 +77925,9 @@ }, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"wnO" = ( +/turf/open/floor/wood/large, +/area/station/medical/psychology) "wnY" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77456,6 +77940,20 @@ /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"wog" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/structure/sign/departments/psychology/directional/east, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/hallway/primary/central) +"woh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/sign/poster/official/work_for_a_future/directional/west, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/carpet/black, +/area/station/service/library/private) "wom" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/internals, @@ -77465,6 +77963,14 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) +"wor" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 1; + name = "Unfiltered" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "wot" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/all/engineering/external, @@ -77510,6 +78016,14 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"woT" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "woV" = ( /obj/structure/broken_flooring/pile/directional/south, /turf/open/floor/plating, @@ -77540,13 +78054,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"wpT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/commons/lounge) "wpW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/red/dim/directional/north, @@ -77557,12 +78064,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/maintenance/starboard/lesser) -"wqg" = ( -/obj/structure/chair/sofa/right/brown, -/obj/machinery/newscaster/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "wqi" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -77577,15 +78078,6 @@ /obj/effect/turf_decal/trimline/green/filled/mid_joiner, /turf/open/floor/iron/dark/smooth_large, /area/station/service/hydroponics) -"wqs" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "wqB" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -77599,6 +78091,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"wqI" = ( +/obj/item/cigarette/cigar{ + pixel_x = 4 + }, +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark/end, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "wqN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -77629,11 +78130,6 @@ dir = 1 }, /area/station/science/ordnance/storage) -"wrB" = ( -/obj/effect/landmark/start/assistant, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/carpet/orange, -/area/station/commons/lounge) "wrE" = ( /turf/open/floor/glass, /area/station/hallway/secondary/entry) @@ -77682,6 +78178,12 @@ }, /turf/open/floor/iron, /area/station/service/cafeteria) +"wsw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "wsR" = ( /obj/structure/table, /obj/item/wrench, @@ -77754,16 +78256,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/solars/starboard/aft) -"wtE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"wtD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Engine"; dir = 8 }, -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood/large, -/area/station/hallway/secondary/service) +/obj/effect/turf_decal/trimline/brown, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/project) "wtI" = ( /obj/structure/table, /obj/item/pipe_dispenser, @@ -77789,6 +78289,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"wtK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/starboard/fore) "wtO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -77797,12 +78303,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space/openspace, /area/space/nearstation) -"wuh" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "wul" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77888,12 +78388,42 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"wvc" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice, +/turf/open/floor/carpet/stellar, +/area/station/service/library) "wve" = ( /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/smooth, /area/station/engineering/hallway) +"wvi" = ( +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/coffeemaker/impressa, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 13; + pixel_y = 10 + }, +/obj/item/storage/box/coffeepack{ + pixel_y = 10; + pixel_x = -5 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/checker, +/area/station/service/bar) "wvw" = ( /obj/machinery/conveyor{ dir = 8; @@ -77910,6 +78440,10 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/cargo/storage) +"wvx" = ( +/obj/structure/cable, +/turf/open/floor/iron/stairs, +/area/station/service/library) "wvy" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77939,25 +78473,6 @@ }, /turf/open/openspace, /area/station/commons/fitness/recreation) -"wwa" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/table, -/obj/item/stock_parts/power_store/cell/high, -/obj/machinery/cell_charger, -/obj/item/multitool/circuit{ - pixel_x = 7; - pixel_y = 16 - }, -/obj/item/multitool/circuit{ - pixel_x = 10; - pixel_y = 14 - }, -/obj/item/multitool/circuit{ - pixel_x = 2; - pixel_y = 15 - }, -/turf/open/floor/iron/dark/smooth_edge, -/area/station/service/library) "wwf" = ( /obj/machinery/computer/communications, /obj/effect/turf_decal/siding/blue{ @@ -77969,6 +78484,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"wwg" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "wwj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, @@ -78040,6 +78564,20 @@ /obj/item/surgical_drapes, /turf/open/floor/iron/white, /area/station/maintenance/hallway/abandoned_recreation) +"wwR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "wwV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood, @@ -78066,13 +78604,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/vacant_room/office) -"wxG" = ( -/obj/structure/window/spawner/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) "wxH" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78088,21 +78619,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/brig) -"wxU" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/power_store/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "wyc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78159,26 +78675,11 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"wzr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "wzs" = ( /obj/structure/rack, /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wzu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "wzy" = ( /obj/effect/turf_decal/tile/dark_blue/half{ dir = 8 @@ -78188,15 +78689,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"wzz" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "wzB" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron, @@ -78257,6 +78749,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"wAB" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "wAO" = ( /obj/effect/decal/cleanable/cobweb, /obj/item/storage/toolbox/mechanical/old, @@ -78306,12 +78806,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"wBj" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/openspace, -/area/station/service/library) "wBu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78353,6 +78847,19 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"wBR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "wCa" = ( /obj/effect/turf_decal/arrows/white{ color = "#F7F707"; @@ -78372,14 +78879,6 @@ /obj/structure/fluff/paper/stack, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"wCm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "wCn" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -78392,18 +78891,6 @@ }, /turf/open/openspace, /area/station/engineering/break_room) -"wCr" = ( -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/landmark/navigate_destination/techstorage, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "wCv" = ( /obj/structure/table, /obj/item/storage/box{ @@ -78453,6 +78940,19 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"wDu" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/closet/crate/medical, +/obj/item/hemostat, +/obj/item/cautery, +/obj/item/scalpel{ + pixel_y = 12 + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "wDQ" = ( /obj/structure/chair/office{ dir = 8 @@ -78494,14 +78994,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/construction/storage_wing) -"wEB" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/structure/window/spawner/directional/east, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "wEJ" = ( /obj/machinery/computer/security{ dir = 8 @@ -78519,6 +79011,10 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/wood/parquet, /area/station/medical/break_room) +"wEX" = ( +/obj/structure/sign/poster/contraband/hacking_guide/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "wFf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -78557,11 +79053,6 @@ /obj/structure/showcase/mecha/marauder, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"wFw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/poster/contraband/eat/directional/west, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "wFC" = ( /obj/structure/chair/sofa/corp/right{ desc = "Looks like someone threw it out. Covered in donut crumbs."; @@ -78613,6 +79104,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wGk" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/space/basic, +/area/station/solars/port/aft) "wGD" = ( /obj/effect/turf_decal/trimline/purple/arrow_cw{ dir = 8 @@ -78628,6 +79125,15 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai) +"wGN" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/item/kirbyplants/potty, +/obj/effect/turf_decal/siding/thinplating_new/dark/end{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "wGS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -78635,15 +79141,6 @@ /obj/structure/ladder, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"wGU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "wGV" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -78657,12 +79154,25 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/construction/mining/aux_base) +"wHi" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/vending/assist, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "wHp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"wHu" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Primary Tool Storage" + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "wHx" = ( /obj/machinery/camera/directional/east, /turf/open/openspace, @@ -78788,6 +79298,14 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"wJO" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/carpet/orange, +/area/station/command/heads_quarters/ce) "wJU" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/camera/autoname/directional/east, @@ -78823,15 +79341,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/range) -"wKH" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/station/commons/lounge) "wKI" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -78933,6 +79442,15 @@ /obj/effect/turf_decal/trimline/red/filled/warning, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wMk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "wMn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -78972,23 +79490,6 @@ /obj/machinery/vending/snack/blue, /turf/open/floor/iron, /area/station/construction/storage_wing) -"wMP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) -"wMQ" = ( -/obj/structure/railing, -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/skill_station, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 - }, -/area/station/service/library) "wMS" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/east, @@ -79049,6 +79550,15 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark, /area/station/science/server) +"wNI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "wNL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -79118,24 +79628,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/science/lab) -"wOR" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/rack, -/obj/item/encryptionkey/headset_sci{ - pixel_x = -6; - pixel_y = 1 - }, -/obj/item/encryptionkey/headset_med, -/obj/item/encryptionkey/headset_eng{ - pixel_x = 6; - pixel_y = -1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +"wOU" = ( +/obj/machinery/computer/apc_control{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/command/heads_quarters/ce) "wPf" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/landmark/event_spawn, @@ -79145,6 +79646,9 @@ /obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/port) +"wPG" = ( +/turf/open/floor/carpet/black, +/area/station/service/theater) "wPI" = ( /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/textured_large, @@ -79156,15 +79660,6 @@ "wPV" = ( /turf/closed/wall, /area/station/security/detectives_office/private_investigators_office) -"wPW" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/full, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/obj/machinery/door/airlock/hydroponics{ - name = "Hydroponics" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/hydroponics) "wPX" = ( /obj/structure/cable, /turf/closed/wall, @@ -79223,6 +79718,14 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) +"wQz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos/project) "wQD" = ( /obj/machinery/light/small/directional/east, /obj/item/solar_assembly, @@ -79251,6 +79754,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) +"wQS" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/bookbinder, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/service/library) "wRa" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -79284,6 +79795,22 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"wRr" = ( +/obj/structure/sign/poster/contraband/grey_tide/directional/north, +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_y = -2 + }, +/obj/item/storage/box/shipping{ + pixel_x = -11; + pixel_y = 6 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = -13 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "wRt" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -79313,18 +79840,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/interrogation) -"wRN" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "wSa" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -79372,6 +79887,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/storage) +"wTj" = ( +/obj/structure/lattice/catwalk, +/obj/item/radio/intercom/directional/south, +/obj/structure/closet/secure_closet/security, +/turf/open/openspace, +/area/station/security/checkpoint/customs) "wTk" = ( /turf/open/floor/plating, /area/station/maintenance/port) @@ -79410,6 +79931,13 @@ }, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"wTA" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "wTJ" = ( /obj/structure/railing, /obj/structure/lattice, @@ -79431,6 +79959,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"wUb" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/large, +/area/station/hallway/primary/central) "wUk" = ( /obj/structure/ladder, /turf/open/floor/engine/hull, @@ -79459,6 +79996,14 @@ "wVf" = ( /turf/closed/wall, /area/station/security/prison/rec) +"wVn" = ( +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "wVx" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -79664,16 +80209,6 @@ /obj/effect/landmark/start/captain, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"wXW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "wYk" = ( /obj/effect/turf_decal/siding/dark/end{ dir = 8 @@ -79686,29 +80221,10 @@ dir = 8 }, /area/station/tcommsat/server) -"wYu" = ( -/obj/item/canvas/twentythree_nineteen, -/obj/item/canvas/nineteen_nineteen, -/obj/item/canvas/nineteen_nineteen, -/obj/item/canvas/nineteen_nineteen, -/obj/item/canvas/twentythree_twentythree{ - pixel_x = 0; - pixel_y = 0 - }, -/obj/structure/closet/crate, -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) -"wYv" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/photocopier/prebuilt, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs) +"wYo" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/orange, +/area/station/commons/lounge) "wYw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -79717,15 +80233,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/engine/hull/air, /area/station/hallway/secondary/entry) -"wYB" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/flashlight{ - pixel_y = 8 - }, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/carpet/stellar, -/area/station/maintenance/hallway/abandoned_recreation) "wYC" = ( /obj/structure/lattice/catwalk, /obj/effect/spawner/random/maintenance/three, @@ -79757,12 +80264,27 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/command/corporate_showroom) +"wYP" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "wYS" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"wYU" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "wZb" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -79814,13 +80336,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"wZB" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/lobby) "wZE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -79828,6 +80343,16 @@ /obj/effect/decal/cleanable/blood/oil/slippery, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"wZN" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/medical{ + name = "Psychology" + }, +/turf/open/floor/wood/large, +/area/station/medical/psychology) "wZW" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -79884,6 +80409,14 @@ }, /turf/open/floor/wood, /area/station/medical/medbay/central) +"xaJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/elevator/directional/east{ + id = "catwalk_atmos"; + name = "Elevator Button" + }, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "xaP" = ( /obj/item/paper_bin{ pixel_x = 5; @@ -79909,11 +80442,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/carpet/stellar, /area/station/maintenance/hallway/abandoned_recreation) -"xaT" = ( -/obj/structure/lattice, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) "xaU" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/glass/reinforced, @@ -79998,22 +80526,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"xcE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/contraband/grey_tide/directional/west, -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_random_offset = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"xcR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/computer/atmos_control/nitrogen_tank, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "xcT" = ( /obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -80108,11 +80620,10 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"xdZ" = ( -/obj/structure/bed, -/obj/item/bedsheet/ce, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +"xdV" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/lounge) "xeb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -80211,13 +80722,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xfq" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "xfr" = ( /obj/structure/showcase/machinery/oldpod{ desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; @@ -80235,17 +80739,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xfC" = ( -/obj/structure/railing/corner, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"xfU" = ( -/obj/machinery/light/warm/dim/directional/east, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/commons/lounge) "xfV" = ( /obj/structure/railing/corner{ dir = 8 @@ -80271,6 +80764,22 @@ /obj/item/reagent_containers/cup/soda_cans/monkey_energy, /turf/open/floor/engine/hull/air, /area/station/maintenance/starboard/lesser) +"xgA" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/meson{ + pixel_y = 8 + }, +/obj/structure/sign/warning/radiation/rad_area/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "xgC" = ( /obj/machinery/light_switch{ pixel_x = -9; @@ -80303,6 +80812,15 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"xho" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "xhr" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/blood/old, @@ -80314,18 +80832,28 @@ dir = 4 }, /area/station/science/ordnance/storage) -"xhK" = ( -/obj/effect/mapping_helpers/trapdoor_placer, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/plating, -/area/station/service/theater_dressing) -"xhP" = ( -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/east, -/obj/structure/chair/sofa/middle/brown{ - dir = 8 +"xhO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "hydropony_shutters"; + name = "Hydroponics Shutters" }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + req_access = list("hydroponics"); + name = "Hydroponics Desk" + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/hydroponics) "xhX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -80351,29 +80879,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"xiA" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/gambling{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/effect/spawner/random/entertainment/deck{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/machinery/light/warm/dim/directional/south, -/turf/open/floor/carpet/black, -/area/station/commons/lounge) -"xiJ" = ( -/obj/machinery/wall_healer/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) "xiQ" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, @@ -80398,17 +80903,33 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port) +"xiX" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit/red, +/area/station/maintenance/hallway/abandoned_recreation) "xjc" = ( /obj/effect/landmark/event_spawn, /turf/open/openspace, /area/station/science/explab) -"xjq" = ( -/obj/structure/table/reinforced, -/obj/item/rcl/pre_loaded{ +"xjm" = ( +/obj/item/vending_refill/donksnackvendor{ + pixel_y = 15 + }, +/obj/item/vending_refill/sovietsoda{ + pixel_x = -4; pixel_y = 5 }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/ce) +/obj/structure/railing{ + dir = 6 + }, +/obj/item/vending_refill/coffee{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "xjr" = ( /obj/machinery/modular_computer/preset/id{ dir = 8 @@ -80425,16 +80946,6 @@ "xjz" = ( /turf/open/floor/plating/elevatorshaft, /area/station/science/robotics) -"xjG" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/library) "xjK" = ( /obj/structure/lattice/catwalk, /obj/structure/filingcabinet, @@ -80455,6 +80966,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/chapel) +"xjT" = ( +/obj/structure/sign/poster/contraband/robust_softdrinks/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "xka" = ( /obj/structure/table, /obj/item/cultivator{ @@ -80481,12 +80997,6 @@ /obj/structure/chair, /turf/open/floor/engine/hull, /area/space/nearstation) -"xkG" = ( -/obj/effect/turf_decal/tile/dark_blue, -/obj/structure/cable, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "xkL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -80519,6 +81029,15 @@ }, /turf/closed/wall, /area/station/commons/storage/art) +"xlm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/library) "xln" = ( /obj/structure/lattice/catwalk, /obj/machinery/light/warm/dim/directional/west, @@ -80529,34 +81048,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/central) -"xls" = ( -/obj/structure/table, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = 3; - pixel_y = 12 - }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -2; - pixel_y = 12 - }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -9; - pixel_y = 4 - }, -/obj/item/clothing/gloves/color/orange{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/service/janitor) "xlw" = ( /obj/structure/bed/dogbed{ name = "spider bed" @@ -80603,6 +81094,21 @@ }, /turf/open/floor/wood, /area/station/maintenance/starboard/central) +"xmh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/engineering/atmos/upper) +"xmk" = ( +/obj/machinery/atmospherics/pipe/multiz/cyan/visible{ + dir = 8; + name = "Air Mix Multideck Adapter" + }, +/obj/machinery/meter{ + name = "Mix Meter" + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "xml" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -80680,6 +81186,16 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison) +"xns" = ( +/obj/machinery/light/warm/dim/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "xnt" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -80687,11 +81203,6 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) -"xnC" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light/directional/north, -/turf/open/openspace, -/area/station/service/kitchen) "xnF" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -80734,6 +81245,13 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/engine, /area/station/engineering/break_room) +"xol" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light_switch/directional/east, +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/station/service/hydroponics) "xor" = ( /obj/structure/chair{ dir = 1 @@ -80741,13 +81259,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/security/courtroom) -"xos" = ( -/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, -/obj/structure/chair/sofa/left/brown{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/service/library) "xot" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/table/glass, @@ -80834,6 +81345,31 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"xpV" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/dark_green{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/checker, +/area/station/service/bar) +"xqa" = ( +/obj/structure/sign/poster/random/directional/north, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/hand_labeler{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "xqd" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -80973,6 +81509,14 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"xrl" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "xrx" = ( /obj/structure/lattice/catwalk, /turf/open/space/openspace, @@ -81050,35 +81594,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/hallway/secondary/entry) -"xsk" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 7; - pixel_y = 13 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/machinery/camera/autoname/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/button/door/directional/south{ - id = "kitchen_service"; - name = "Kitchen Window Shutters"; - pixel_x = 6; - req_access = list("kitchen") - }, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) "xsp" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 @@ -81153,11 +81668,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"xtt" = ( -/obj/machinery/photocopier/prebuilt, -/obj/structure/sign/clock/directional/east, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "xtC" = ( /obj/structure/chair{ dir = 4 @@ -81167,10 +81677,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"xtE" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/service/library) "xtG" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -81183,17 +81689,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/supermatter/room) -"xus" = ( -/obj/structure/table/wood, -/obj/item/hand_labeler{ - pixel_y = -12 - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/dark_green{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/station/service/bar/backroom) "xut" = ( /turf/closed/wall, /area/station/service/abandoned_gambling_den) @@ -81279,6 +81774,15 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"xvy" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "xvA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -81299,10 +81803,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/carpet, /area/station/ai_monitored/command/storage/eva) -"xvQ" = ( -/obj/structure/chair/office, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) "xwg" = ( /obj/structure/railing/corner/end, /obj/machinery/light/cold/directional/north, @@ -81312,17 +81812,6 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/engine/hull, /area/space/nearstation) -"xwq" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/filled/mid_joiner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/large, -/area/station/hallway/primary/central) "xwu" = ( /obj/structure/cable/multilayer/multiz, /obj/structure/lattice/catwalk, @@ -81364,13 +81853,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"xwR" = ( -/obj/structure/chair/sofa/left/brown{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/carpet/black, -/area/station/medical/psychology) "xwT" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/start/hangover, @@ -81398,6 +81880,22 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"xxM" = ( +/obj/machinery/computer/atmos_control/air_tank, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) +"xxZ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Curator Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/library, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/service/library/printer) "xya" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -81432,13 +81930,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"xyX" = ( -/obj/structure/table, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xzm" = ( /obj/effect/spawner/random/maintenance, /obj/structure/table, @@ -81454,6 +81945,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"xzq" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/station/engineering/atmos/upper) "xzy" = ( /turf/closed/wall, /area/station/science/genetics) @@ -81502,6 +81999,16 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"xAt" = ( +/obj/machinery/wall_healer/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) "xAu" = ( /turf/closed/wall, /area/station/medical/chemistry) @@ -81588,12 +82095,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/openspace, /area/station/engineering/atmos/project) -"xBR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) "xBZ" = ( /obj/effect/turf_decal/siding/dark{ dir = 8 @@ -81728,6 +82229,12 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xCX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/space/basic, +/area/station/maintenance/solars/port/aft) "xDp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81791,12 +82298,6 @@ /obj/effect/landmark/start/bitrunner, /turf/open/floor/iron/dark/textured_half, /area/station/cargo/bitrunning/den) -"xEl" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) "xEm" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -81856,10 +82357,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/heads_quarters/cmo) -"xFd" = ( -/obj/structure/chair/office, -/turf/open/floor/carpet/stellar, -/area/station/service/library) "xFj" = ( /obj/effect/turf_decal/tile/blue/full, /obj/effect/turf_decal/tile/dark/full, @@ -81985,6 +82482,11 @@ }, /turf/open/floor/iron, /area/station/science/explab) +"xGS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/engine, +/area/station/engineering/atmos/upper) "xGU" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/oxygen, @@ -82161,13 +82663,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner, /turf/open/floor/iron, /area/station/engineering/lobby) -"xKz" = ( -/obj/structure/rack, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/spawner/random/techstorage/engineering_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) "xKB" = ( /obj/structure/rack, /obj/item/toy/basketball, @@ -82185,36 +82680,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"xLj" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Telecomms - Storage" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"xLp" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 6 - }, -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_x = 9; - pixel_y = 1 - }, -/obj/item/compact_remote{ - pixel_x = -7; - pixel_y = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 1 +"xLf" = ( +/obj/structure/window/reinforced/tinted/frosted/spawner/directional/west, +/obj/structure/chair/sofa/middle/brown{ + dir = 4 }, +/turf/open/floor/glass/reinforced, /area/station/service/library) "xLy" = ( /obj/structure/cable, @@ -82260,11 +82731,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/security/execution/education) -"xLZ" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) "xMq" = ( /obj/effect/decal/cleanable/dirt, /obj/item/food/pizzaslice/moldy/bacteria, @@ -82301,13 +82767,11 @@ }, /turf/open/floor/iron/textured_large, /area/station/medical/virology) -"xMS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron/smooth, -/area/station/engineering/atmos/upper) +"xML" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/hallway/primary/central) "xMV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82368,6 +82832,11 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/courtroom) +"xNA" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/cable_coil, +/turf/open/space/basic, +/area/station/solars/starboard/fore) "xNB" = ( /obj/structure/table/wood, /obj/structure/sign/painting/library{ @@ -82409,6 +82878,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden/abandoned) +"xNT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "xNV" = ( /obj/structure/railing{ dir = 1 @@ -82416,23 +82895,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_white, /area/station/ai_monitored/turret_protected/aisat_interior) -"xOc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/table, -/obj/item/storage/toolbox/artistic{ - pixel_x = 1; - pixel_y = 10 - }, -/turf/open/floor/wood, -/area/station/service/library) "xOh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"xOl" = ( +/obj/item/restraints/handcuffs/fake, +/obj/structure/table/wood, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "xOm" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -82498,23 +82971,16 @@ }, /turf/open/floor/plating, /area/station/commons/toilet/restrooms) +"xPU" = ( +/obj/structure/sign/poster/contraband/space_cube/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "xQf" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"xQv" = ( -/obj/effect/decal/cleanable/confetti, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xQy" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/landmark/start/librarian, -/turf/open/floor/carpet/black, -/area/station/service/library/private) "xQB" = ( /obj/machinery/camera/directional/north{ c_tag = "Atmospherics - co2 Cell"; @@ -82585,6 +83051,37 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/large, /area/station/hallway/primary/central) +"xQX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/weldingtool/empty{ + pixel_x = -5; + pixel_y = -6 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"xQY" = ( +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_y = 9 + }, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/power_store/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "xRg" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/south, @@ -82597,15 +83094,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"xRk" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/filingcabinet/chestdrawer{ - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/customs) "xRn" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -82657,6 +83145,14 @@ }, /turf/open/openspace, /area/station/maintenance/port/aft) +"xRU" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/rnd/production/techfab/department/service, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "xRZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/greenglow, @@ -82702,6 +83198,15 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/science/breakroom) +"xSO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) "xSR" = ( /obj/machinery/firealarm/directional/south, /obj/structure/rack, @@ -82723,6 +83228,14 @@ /obj/structure/cable, /turf/open/openspace, /area/station/hallway/primary/port) +"xTc" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + id = "kitchen_service" + }, +/turf/open/floor/plating, +/area/station/service/kitchen) "xTd" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -82743,17 +83256,6 @@ /obj/effect/spawner/random/trash/crushed_can, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical) -"xTr" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/item/storage/toolbox/fishing, -/obj/item/storage/box/lights/mixed{ - pixel_x = -8; - pixel_y = 1 - }, -/obj/structure/lattice/catwalk, -/turf/open/water, -/area/station/maintenance/port/fore) "xTt" = ( /obj/structure/table/wood, /obj/item/radio/intercom/directional/west{ @@ -82772,6 +83274,15 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"xTD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "xTT" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/disposal/bin, @@ -82788,19 +83299,16 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/engine/hull, /area/space/nearstation) -"xTY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) "xUa" = ( /obj/effect/mapping_helpers/iannewyear, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"xUb" = ( +/obj/effect/turf_decal/tile/purple/half{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/engineering/atmos/upper) "xUj" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -82821,6 +83329,14 @@ /obj/structure/sign/poster/contraband/communist_state/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xUu" = ( +/obj/effect/turf_decal/box/red, +/obj/item/vending_refill/games{ + pixel_x = 6; + pixel_y = -4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "xUv" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -82840,13 +83356,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) -"xUB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/wood, -/area/station/service/library) "xUD" = ( /obj/effect/turf_decal/caution{ dir = 4 @@ -82946,6 +83455,14 @@ }, /turf/open/openspace, /area/station/engineering/break_room) +"xVJ" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/commons/lounge) "xVL" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -83026,14 +83543,14 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/commons/storage/art) -"xXq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/wood/large, -/area/station/service/bar) +"xXa" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/glass/reinforced, +/area/station/service/library) +"xXe" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/dark/smooth_half, +/area/station/service/library) "xXr" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/cobweb, @@ -83159,6 +83676,11 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) +"xYm" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/siding/thinplating/corner, +/turf/open/floor/iron/dark/smooth_half, +/area/station/service/library) "xYn" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -83179,13 +83701,6 @@ luminosity = 2 }, /area/station/ai_monitored/command/nuke_storage) -"xYD" = ( -/obj/item/key/janitor, -/obj/vehicle/ridden/janicart, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "xYL" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, @@ -83198,12 +83713,6 @@ /obj/effect/turf_decal/tile/purple/half, /turf/open/floor/iron/white/textured_half, /area/station/science/robotics) -"xYT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/hallway/primary/central) "xZd" = ( /turf/open/floor/iron/smooth, /area/station/engineering/atmos/upper) @@ -83264,28 +83773,6 @@ /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood, /area/station/maintenance/hallway/abandoned_recreation) -"yaJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/dark{ - dir = 6 - }, -/obj/effect/turf_decal/tile/dark_blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/service/kitchen) -"yaK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/library) "yaM" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /obj/structure/extinguisher_cabinet/directional/north, @@ -83492,12 +83979,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"ydy" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "ydH" = ( /obj/effect/landmark/firealarm_sanity, /turf/open/floor/catwalk_floor, @@ -83525,6 +84006,13 @@ }, /turf/open/openspace, /area/station/construction/storage_wing) +"ydV" = ( +/obj/machinery/keycard_auth/wall_mounted/directional/west{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/small, +/area/station/command/heads_quarters/ce) "ydX" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -83596,15 +84084,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/office) -"yeH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/item/clothing/glasses/welding{ - pixel_x = 6; - pixel_y = 7 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) "yeJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -83671,17 +84150,21 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood, /area/station/security/courtroom) +"yfR" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) "yge" = ( /obj/effect/spawner/random/maintenance, /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"ygl" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/glass, -/area/station/service/kitchen) "ygn" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/yellow/opposingcorners{ @@ -83806,36 +84289,6 @@ /obj/structure/chair, /turf/open/floor/iron/dark/smooth_large, /area/station/security/interrogation) -"yio" = ( -/obj/effect/turf_decal/siding/white, -/obj/item/kirbyplants/organic/plant21{ - pixel_x = -7; - pixel_y = 15 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/smooth_large, -/area/station/hallway/primary/central) -"yis" = ( -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/folder/white{ - pixel_x = 8; - pixel_y = 3 - }, -/obj/item/pen/fountain{ - pixel_x = 14 - }, -/obj/structure/table, -/obj/machinery/button/curtain{ - pixel_x = -6; - name = "Privacy Curtains"; - id = "psychpriv"; - pixel_y = 30 - }, -/turf/open/floor/wood/large, -/area/station/medical/psychology) "yiy" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance/two, @@ -83853,6 +84306,31 @@ /obj/machinery/washing_machine, /turf/open/floor/iron/white/textured_half, /area/station/ai_monitored/turret_protected/aisat_interior) +"yiQ" = ( +/obj/structure/safe/floor{ + name = "Critical Supplies Safe" + }, +/obj/item/reagent_containers/cup/glass/bottle/wine_voltaic{ + pixel_y = 5; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 6; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/bottle/vodka{ + pixel_y = 15; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/glass/bottle/juice/orangejuice{ + pixel_x = -5; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/flask{ + pixel_x = -6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) "yiW" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -83874,12 +84352,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/safe) -"yjo" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "yjD" = ( /obj/machinery/atmospherics/pipe/multiz/general/visible, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -83989,12 +84461,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/gravity_generator) -"ylt" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/hallway/primary/central) "ylu" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/contraband/prison, @@ -101148,7 +101614,7 @@ bWY dcE dcE dcE -kpJ +wGk dcE dcE dcE @@ -101918,9 +102384,9 @@ bWY azt azt azt -azt -azt -azt +twz +twz +twz azt vNz azt @@ -102176,7 +102642,7 @@ azt vNz dcE dcE -azt +rNc dcE bWY bWY @@ -102433,7 +102899,7 @@ azt vNz dcE dcE -azt +twz dcE heR dcE @@ -102685,14 +103151,14 @@ bWY bWY xbF bWY +twz +azt +twz +bWY bWY azt -bWY -bWY -bWY -rNc -bWY -bWY +twz +twz vNz azt dcE @@ -102945,7 +103411,7 @@ dcE vNz azt vNz -iFM +fVD nTA nxa crs @@ -103456,10 +103922,10 @@ bWY bWY xbF bWY -bWY +twz azt -bWY -fVD +twz +xCX nTA jgu okc @@ -105974,7 +106440,7 @@ gPW lry tDy bNt -hSZ +taX ssg siX ssg @@ -106226,12 +106692,12 @@ ipm jBd ldZ tkY -haK +uJX gPW oNA lXf bNt -joH +xjm ssg ssg nDt @@ -107512,15 +107978,15 @@ jBd jJQ pMT pMT -uxe -xls -lKB +bCi +sxd +lBh pMT tAM mUR -jGa -xus -cIR +vhl +imL +skR mUR mUR tDy @@ -107768,17 +108234,17 @@ jcn mHN jJQ pMT -kve -csU -ozC -hgS +aIO +gpv +mNn +gqa pMT tAM mUR -uoP -kaG -rHK -avd +swH +ljt +fqL +mXV mUR ykG tTO @@ -108025,17 +108491,17 @@ gtk bba jJQ pMT -bBe -tbm -bgY -tug +uSV +wbc +sIf +hHF pMT tAM mUR -kAY -obX -gLe -qxz +cvY +hTJ +mBW +bKL mUR tTO xER @@ -108279,18 +108745,18 @@ vwl ilE chu wNu -gnF +sQY aHS pMT pMT pMT -bBE +pTu pMT pMT -qFP +rwU mUR mUR -aGL +qYU mUR mUR mUR @@ -108537,24 +109003,24 @@ ilE jBd jBd vma -pSS +xiX gPW -xYD -hyZ -jxZ -iiN -urL -gDK +pBH +dYI +pmS +dSJ +lMf +aep fWY -uXG -orh -qfo -exC +dMK +mwn +bXy +vaO fWY xHv kfO xya -mWP +oZO ykG cJz bNt @@ -108793,27 +109259,27 @@ nHy vGC jOh jOh -cqm +hxc lYe gPW -bHd -mOv -dcs -bUk -nAX -mNK -bOy -fxO -esV -fwE -sqf +rFm +tnM +ars +fUv +nDm +voY +qoU +rUj +uRy +sQI +lAF fWY vGi iLe tAM ssg nQd -vEI +xUu bNt iCe qWk @@ -109053,24 +109519,24 @@ uCk gPW gPW gPW -gLk -mXT +xqa +wfV own own own -lGc +uzI fWY -vUU -uoW -oYa -jUh +wvi +drR +pFR +bQU fWY bNt czs wAx sRY jhu -eyS +lxn bNt qrQ tOw @@ -109308,19 +109774,19 @@ dho jxg dol gPW -kjK +xRU gse gse -xiJ +xAt own -css -sMY -xXq -hzP -wjf -uRj -jrX -fIs +wik +ire +ofE +hjL +vZI +bXn +uGf +tWQ fWY uXZ aDO @@ -109562,22 +110028,22 @@ jBd lOd nKj jIX -vSa +heb vYH cFL xAj rPC -kRS -isi +eeW +xns own -jUg -lyQ -qHo -lZc -wiP -orh -qKt -riL +bmH +sKL +hDk +xpV +jpy +mwn +apu +bsW fWY bNt aHO @@ -109825,16 +110291,16 @@ gPW drC peX gse -dLp +sWI own -tbV -eWv -uTi -qKt -qKt -qKt -psc -fjr +vTu +uxl +moE +apu +apu +apu +hkq +dpr fWY bNt bNt @@ -110076,28 +110542,28 @@ jOh lYe gPW gPW -qYu +sXI gPW gPW atD dso -egB -djM +ceb +pXb own -mCo -eWv -qHo -wkd -oiF -ihy -qHo -vIt +apf +uxl +hDk +nHo +vsf +fXf +hDk +qwJ mSd bNt -xcE -fdH +tpj +aOX tDy -eIS +gfc bNt bNt fhO @@ -110328,33 +110794,33 @@ gPW gPW gPW gPW -nha +iIJ gPW gPW gPW lbw oNa -nux +jQe gPW own own -feh -vvU -sSn -edX -fuv -ghC -nXH -nHI -mmn -kOh -vXF -hoQ +rxI +cYJ +csm +jDO +fWV +mCw +fVC +geO +uHV +gyL +tLp +wGN bNt -sXH +gnp nuw ssg -eze +teC bNt xrM bOC @@ -110595,21 +111061,21 @@ oNa xaQ own hRX -uTq +cQF own own -lup -min -riq -fLi -lrG -qVx -qVx -qVx -oXI -yjo -cvn -kUm +tER +ozL +bbY +sbh +fGj +qMI +qMI +qMI +vrA +fYd +xPU +wEX gBE icO bNt @@ -110851,19 +111317,19 @@ oNa oNa cGK hRX -lHs -nVd -iLr -kOZ -phC -lRB -jRK -jRK -aDj -mwl -vgG -ucu -lmJ +dEq +vBU +smc +fob +wYP +wny +nyI +nyI +uKp +tRc +lJM +pWr +qVj iGB iGB iGB @@ -111096,31 +111562,31 @@ lrp gPW pOt rqR -pmu +xxZ lFK lFK bRv bxT wIa gPW -wYB +hZx oNa oNa cGK hRX -rOf -kOf -drZ -bHA -ppw -wKH -wrB -sNA -lLg -mJJ -oXm -mEh -rFl +hgu +abF +hwW +oiW +jDn +wdf +rkD +uki +pOM +nUE +xOl +siP +wYU iGB pxv bRa @@ -111361,25 +111827,25 @@ kpS uME gPW gPW -bts +lxS oNa cGK hRX -reh -lvs -drZ -aQW -gid -wKH -hmt -cou -bWf -mJJ -dIh -mEh -ctH +hnt +oCX +hwW +bcc +sjb +wdf +jBU +wYo +csk +nUE +nyB +siP +itr iGB -bJO +hSA nwo ocj oiM @@ -111618,25 +112084,25 @@ gtO gtO ycf gPW -rOX +egU gPW gPW hRX -alE -aeO -oaD -jLV -jQb -wKH -twR -pkl -kul -hhx -dUK -mEh -lWy +neF +lAW +pbk +mTx +nWN +wdf +dXP +wji +iSW +iVA +mfA +siP +aKY iGB -cUM +sAn wWm pHf pHf @@ -111874,24 +112340,24 @@ cBj uOW bxT kMq -cbE -qmq -qZl -nXM +tpU +nny +kjF +nLl hRX -eNk -dJk -pyj -aQW -rwL -hej -eiG -eiG -fWk -lBW -aFc -pHi -nMW +pef +iuO +hkv +bcc +vsQ +cWt +pRQ +pRQ +uHo +tOj +aIL +uyq +xVJ iGB mpt wWm @@ -112124,7 +112590,7 @@ ixF eQj rAc gPW -ncs +kSP anm aQc anm @@ -112133,22 +112599,22 @@ anm anm anm byY -gfC -iIr +aKV +jmZ hRX -iLq -wgH -pyj -jLV -gid -cRj -cVU -gpW -jDt -lrF -qSK -rGF -xiA +mrp +leB +hkv +mTx +sjb +mqU +vsz +eKz +qGF +ioC +fBd +pUH +mWQ iGB lcO ndo @@ -112383,29 +112849,29 @@ lrp oLO pOt anm -rSh +fqc anm kwm ouW jJl gNr -nKU -gfC +goW +aKV byY hRX -tvz -sKB -yaJ -jLV -ssy -xfU -hCH -hCH -lCJ -ukV -nzv -gKB -usq +sOJ +wwR +qNV +mTx +nbC +wjW +djA +djA +dpV +joE +sPg +kAY +wqI mSd dBm dBm @@ -112640,31 +113106,31 @@ rAc nHS gPW anm -nrs -bJC +bDu +iWD haB qkU uPu gNr gNr -kOc -iBl -avb +rdu +hcC +tXg hRX -ecY +jAh hRX hRX -vtM +xdV mSd -mMW -mMW -rhI -wpT -vtM +crB +crB +gfC +jVI +xdV mSd -vtM +xdV mSd -hoO +iMH eha dBm vBM @@ -112896,26 +113362,26 @@ lrp gPW gPW gPW -oVu +gfH qHg svW -kgZ -nNb +kzC +qvM uPu -ugp -sMo -hSq +tev +sDu +kIy bIi bIi -cpr +xML bIi -eqg -wFw +xjT +puJ bIi -uml +gtZ mBb nPW -bID +akU fLr fLr rfU @@ -113152,35 +113618,35 @@ pES gzs oLO gPW -kdh -vWJ -qem +ndl +vxh +jjC svW -eYa -xOc -eAc +rjU +fHR +hWb uPu dCp byY byY -jCa +wcQ byY byY -sTr -ylt -ylt -uOw -oyU -uHA -uRq -qIw -qIw -qIw -qIw -qIw -qIw -aVo -qIw +qpP +qNw +qNw +mDZ +jrz +fyz +bmD +fUb +fUb +fUb +fUb +fUb +fUb +hDW +fUb sXj sXj sXj @@ -113409,24 +113875,24 @@ ixF iUx gPW gPW -wwa -rrm -aQw +utq +nyq +wQS svW -eaJ -bgz +mHJ +rUC fFe uPu -pnX +fEc byY -rTV +lNg byY byY byY -kXe -opt -aHm -eWz +oSI +hGP +fzV +xrl fLr pzy gxP @@ -113666,24 +114132,24 @@ ixF sHT bGF gPW -dWr -reu -wMQ +kQn +xXe +aYw svW -lfX -kFh -xtE -dec +gUx +vUd +mth +hSd gNr bOk bOk -bsT +fQL bOk -hyw -rIx -tiU -lgj -nPu +hwV +aEG +kEn +gnA +dJV fLr pzy fLr @@ -113923,9 +114389,9 @@ ixF pOt von gPW -fUV -slZ -xLp +cRN +xYm +iQw svW lSP haB @@ -114181,9 +114647,9 @@ gPW xKQ gPW gPW -itW -reI -ppY +cGO +wvx +fPb vRM haB uPu @@ -114193,13 +114659,13 @@ gNr xTd tUX lDE -sGg -msh -mvL -lMN +ptt +rUE +pxZ +pRw lDE -kIH -ikp +cKg +vMU fLr jwI dwf @@ -114267,10 +114733,10 @@ jfi mvq pLG fQp -xRk +phP kyq hSh -wYv +dwi ceG lIr lIr @@ -114439,24 +114905,24 @@ cZo oLO gPW gPW -wEB -uYD -dKR -cpT -lFz -lFz +ulx +uum +nmn +ikq +kHv +kHv ktd gNr -mDq +kns uCF lDE -mPi -imH -muV -qXU -mAY -xwq -lRn +rkN +dhq +sbD +iTM +eEV +gSG +mEk fLr fOe qTG @@ -114692,27 +115158,27 @@ jHV qcx ixF xKQ -auf +kho pOt nHS aXe -qkO -jxs -vRt -jxs -xUB -lFz -lnL +iyA +dZA +wPG +dZA +fvk +kHv +aUU gNr eAT llv lDE -daX +uKN lio -tvT -jXz +vcR +qkF eVl -rhP +hZD iLm fLr dWp @@ -114953,24 +115419,24 @@ gPW gPW vKt aXe -utk -vRt -qWn -vRt -pxJ -lFz +qjZ +wPG +mSt +wPG +bfw +kHv uPu ojU llv llv lDE -wzu +tjg pJD kSo oHw eVl -dAp -ikp +wUb +vMU fLr vuO vuO @@ -114994,9 +115460,9 @@ gmE bYe ltW qDM -ola -tzb -yio +rdk +mrj +ddz ckZ iLm fLr @@ -115203,31 +115669,31 @@ nhR dEY oQO jMr -aAC +nJl pPf gqp nmO gPW -fdM -pyy -rxL -vRt -vRt -vRt -pxJ -kMF -iSA +dIW +rYV +pXE +wPG +wPG +wPG +bfw +tbw +scE gNr -apr +edl llv lDE -gkq -kkH +hdX +hni uIt -kQx +cfp lDE -dSq -ikp +req +vMU jMi vuO ugN @@ -115465,26 +115931,26 @@ hPY qiz pje gPW -cju +pVw aXe -qPH -vRt -mPT -vRt -pxJ -lFz -vRu +dBd +wPG +gyd +wPG +bfw +kHv +woT gNr -xTr +jYE llv lDE lDE -pBA +hAm lDE lDE lDE -qla -ikp +kTW +vMU fLr hRd bUO @@ -115722,26 +116188,26 @@ pfu gqp pUr gPW -tsA +nvR aXe -vVr -vRt -pHz -vRt -pxJ -lFz -jPb +ghz +wPG +sBj +wPG +bfw +kHv +izF gNr -cAy +tfr llv llv llv ayD -ckk -ckk -dCK +lkj +lkj +caF ckZ -ikp +vMU fLr hRd jCt @@ -115979,21 +116445,21 @@ hMw mrM jMr gPW -tQx +sik aXe -rSC -cHN -dcQ -cHN -wxG -wMP -wbB +cCj +hNy +giz +hNy +saE +xSO +vuo gNr bOk bOk weF weF -gFO +qqz bOk bOk bOk @@ -116236,21 +116702,21 @@ fpr uyN flH pwT -tze -lcb -pKw -iGK -pKw -iGK -pVd -dlO -vjo -kus +cte +nYp +tAT +pPb +tAT +pPb +rTH +gQA +dVh +bUf lRP ofi ujr aHp -pfO +kCP ofi rHD hAi @@ -116501,7 +116967,7 @@ yeA qWj qWj qWj -mWn +vWa qWj qWj oxa @@ -117057,7 +117523,7 @@ vnV vlK lkC fXP -oaq +iXg wGD tep wGD @@ -117865,7 +118331,7 @@ nLp nLp eap eap -tQR +qhH nZF qPM nZF @@ -119113,7 +119579,7 @@ fLr aZs fLr tDY -wZB +qTl ghV msx waA @@ -119816,10 +120282,10 @@ dcE dcE dcE dcE -eHF +fRO dcE dcE -eHF +fRO heR bPW nIH @@ -120073,10 +120539,10 @@ dcE dcE dcE dcE -eHF +gMc heR heR -eHF +gMc heR bPW ixf @@ -120330,22 +120796,22 @@ dcE dcE dcE heR -eHF +fRO heR -eHF -eHF +gMc +fRO heR ixf -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO +osO +osO ixf jcz bIS @@ -120584,25 +121050,25 @@ dcE dcE dcE dcE +fRO +gMc +gMc +gMc dcE -dcE -eHF -eHF -dcE -eHF +fRO cOu cOu ixf -rzZ -rzZ -rzZ -rzZ -svE -rzZ -rzZ +osO +osO +osO +osO +waU +osO +osO kEx -rzZ -rzZ +osO +osO ixf jcz bIS @@ -120623,12 +121089,12 @@ xbZ rfE ugX oKg -oJx +kAv bZx kJF kCE ftk -pqW +cPi oKg tQt xan @@ -120841,25 +121307,25 @@ dcE dcE dcE dcE -dcE +gMc heR -eHF +fRO cOu cOu -eHF +gMc heR heR ixf -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO +osO +osO ixf lOh bIS @@ -120880,12 +121346,12 @@ bNY bNY sCP oKg -xLj -nGp -nGp -xEl -xEl -xfq +fmW +ixe +nCr +mHY +tHG +nMr oKg oTr bfc @@ -121096,27 +121562,27 @@ dcE dcE dcE dcE -dcE -eHF -eHF heR -eHF -dcE -dcE -dcE +heR +fRO +heR +miW +cOu +fRO +fRO heR dcE ixf -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO +osO +osO ixf jcz bIS @@ -121137,12 +121603,12 @@ voi bNY xGU oKg -wOR -wnn +nIR +qkG wma -dPu -dIB -enh +mLZ +qZE +iYG oKg tPU rJi @@ -121352,28 +121818,28 @@ dcE dcE dcE dcE -aWc +lLu +qir cOu cOu cOu -cOu -cOu -miW +qir +xNA cOu cOu cOu cOu bPW -tLO -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -jdV +mmi +osO +osO +osO +osO +osO +osO +osO +osO +mPB bPW jkR bIS @@ -121394,12 +121860,12 @@ lKb bNY rCP oKg -vLZ -aWT -wma -bqS -gii -uss +oKg +oKg +clr +oKg +oKg +oKg oKg tPU wZg @@ -121610,27 +122076,27 @@ dcE dcE dcE dcE -dcE -eHF -eHF heR -eHF -dcE -dcE -dcE +heR +fRO +heR +nQV +cOu +fRO +fRO heR dcE ixf -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO kEx -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO ixf lOh uVY @@ -121642,7 +122108,7 @@ qNn nym clF pRO -azX +ntw qAd emE iOp @@ -121651,16 +122117,16 @@ wzs bNY hTt udl -udl -udl -kAx +vbx +mYk +xho +sFR +uHK +kUD +udl udl udl udl -nnH -nnH -nnH -nnH nnH nnH nnH @@ -121697,7 +122163,7 @@ kTL wps arT lqK -fei +egT lqK arT oYd @@ -121869,25 +122335,25 @@ dcE dcE dcE dcE -dcE +gMc heR -eHF +fRO cOu cOu -eHF +gMc heR heR ixf -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO +osO +osO ixf jcz bIS @@ -121905,24 +122371,24 @@ vfe beb dCm bNY -vFG +kmr khn udl -hiS -hpB -iRx -jNT -xKz -kXy +xQY +lro +xho +lro +gvn +lro +cIu +jvb +orH +udl +epc +lTB +pXO nnH -rIw -ijH -gbd -vZc -hlG -bTl -nnH -iaE +gqc vPN aCa vjc @@ -122126,25 +122592,25 @@ dcE dcE dcE dcE +fRO +gMc +gMc +gMc dcE -dcE -eHF -eHF -dcE -eHF +fRO cOu cOu ixf -rzZ +osO kEx -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO ixf jcz bIS @@ -122165,19 +122631,19 @@ crG idM idM idM -uRu -bDZ -iRx -iRx -iRx -eOD -nnH -gWA -jmT -jmT +qXB +rOM +xho +xho +xho +bOt +fCM +lro +jhS +udl +qwb eQF vzO -ePm sKM xtG vPN @@ -122386,22 +122852,22 @@ dcE dcE dcE heR -eHF +fRO heR -eHF -eHF +gMc +fRO heR ixf -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ -rzZ +osO +osO +osO +osO +osO +osO +osO +osO +osO +osO ixf lOh bIS @@ -122418,23 +122884,23 @@ ccZ qMN pOF dCm -tMZ +mtJ idM qsC cTX -bDZ -bDZ -nMu -cqp -gwg -eRR -nnH -wqg -jVp -kBx -kaM +lro +wTA +mrQ +lro +mVa +aVO +cXc +oNU +niq +udl +wRr +vzO eQF -aKj sKM xtG vPN @@ -122643,10 +123109,10 @@ dcE dcE dcE dcE -eHF +gMc heR heR -eHF +gMc heR bPW ixf @@ -122679,20 +123145,20 @@ cNO idM idM idM -jUp -bDZ -bDZ -klp -jCk -nxs -nnH -dEg -hCe -cOf -qWF +tCh +doY +udl +udl +rIr +udl +udl +udl +udl +udl +rZR +rUH eQF -eQF -bHa +wHu fLb btE aCa @@ -122900,10 +123366,10 @@ dcE dcE dcE dcE -eHF +fRO dcE dcE -eHF +fRO heR bPW vEU @@ -122936,18 +123402,18 @@ ade rdl oMd udl -cew -xyX -dVM -bDZ -jCk -fmx +dJI +yfR +udl +elu +mZZ +jol nnH -cmR -evj -evj -gaL -jnk +pTa +dFs +gpg +ttq +eQF rCO sKM xtG @@ -123196,16 +123662,16 @@ dCm dCm dCm udl -iwp -jCk -pGr +lro +mZZ +bHd nnH -tIT +wHi eQF lgb -nwC -eQF -aim +gzE +vzO +ooL sKM xtG vPN @@ -123453,16 +123919,16 @@ pfx kKy fIg udl -qKs -jCk -sgU +wgl +mZZ +iVI nnH -bxl +rIw eTZ cJE eQl -iyI -pBL +jIO +inX nnH xtG vPN @@ -123711,13 +124177,13 @@ dCm uBD udl udl -wCr +tff udl nnH sKM nnH sKM -tlh +eOf sKM nnH nnH @@ -123967,10 +124433,10 @@ dCm tFd tCF gex -itP -imq -wHp -arw +cXC +msH +dzY +nQi nQi nQi nQi @@ -124054,7 +124520,7 @@ xEB jbW pko wKb -oyx +xTD heC heR bWY @@ -124230,7 +124696,7 @@ qDe qDe rHk qDe -mIR +qDe iPT qDe qDe @@ -125223,7 +125689,7 @@ lNm oTE bTW iqs -mId +kZl nfM bCb mId @@ -125760,10 +126226,10 @@ nNY ocF jSf jSf -jSf -jSf -jSf -kOk +njk +njk +njk +uAl dGS bAW idm @@ -125988,7 +126454,7 @@ mXN dcE dcE gOE -nmx +aJt nAN uhl rZl @@ -126004,16 +126470,16 @@ jSf hmX wrQ xYb -hns -jvZ +wrQ +wrQ wrQ uvN wrQ wrQ wrQ -wrQ +hns xgZ -iUJ +wrQ rOB jSf jDl @@ -126245,18 +126711,18 @@ mXN heR heR heR -mTz +crV naa -mUN +vZN rZl nyz fgx vLU oKx -tCX -jGm -oPd -oPd +oqb +jTD +wsw +wsw jSf fvu lpj @@ -126496,12 +126962,12 @@ dcE dcE dcE dcE -dcE -dcE -unl -unl -unl -unl +toV +toV +toV +toV +toV +heR unl fgx fgx @@ -126509,25 +126975,25 @@ rZl bmO fgx vdm -kXt -ppL -jrq -jrq -jrq +ncB +vas +xGS +dEZ +dEZ fOM noI wrQ nKD +wrQ +tcd dYy wrQ -wrQ -wrQ tST uBp wrQ wrQ wrQ -dfI +wrQ tFC fTF dnb @@ -126753,24 +127219,24 @@ dcE dcE dcE dcE -dcE -dcE -unl +toV wFl wFl wWO +gVq +kUU sZu muW -xBR +gas qEZ esk vMn rND cMW -ppL -cep -wMu -wMu +vas +xaJ +dEZ +dEZ jSf anB wrQ @@ -127010,20 +127476,20 @@ dcE dcE dcE dcE -dcE -dcE -unl -wFl +toV +gPj ftG kGD pQS +heR +crV aKq -xcR +aaM jBb mOo nBs dDV -rPh +aTj unl unl unl @@ -127148,7 +127614,7 @@ cOu qir cOu qir -fUi +cOu qir cOu qir @@ -127267,24 +127733,24 @@ dcE dcE dcE dcE -dcE -dcE -unl -gPj +toV +wFl wFl iqj -uTI +fwI +naJ +ilC nPS -wXW +xNT acU -rBB -cTL -juh -unc -uTI -ldL -bxx -bxx +dmN +xZd +dDV +alk +tCX +kFg +bKp +bKp jSf dHC lqH @@ -127306,7 +127772,7 @@ pbB aMw hYj uAl -qOB +svM fjy aVD aUD @@ -127524,26 +127990,26 @@ dcE dcE dcE dcE -dcE -dcE +toV +toV +toV +toV +toV +heR unl -unl -unl -unl -unl -aKq -eJw +bZm +qln krK -ntE +dWg xZd -aFQ -fii -pQS -isX -gZO -jjj +dDV +alk +ppL +cZK +cZK +cZK fOM -dzg +hiB rxH mDD goU @@ -127665,7 +128131,7 @@ dcE cOu cOu dcE -cOu +fUi cOu dcE qir @@ -127781,26 +128247,26 @@ dcE dcE dcE dcE -dcE -dcE -unl +toV kYf kYf fbu +gVq +kUU aNf gOL -frJ +hto krK -ntE +dWg xZd dDV -oAJ -mSE -lwT -bxx -bxx +alk +mwF +wMu +wMu +wMu jSf -uRK +uzQ rxH umy goU @@ -128038,15 +128504,15 @@ dcE dcE dcE dcE -dcE -dcE -unl -kYf +toV +xbI sFb kil pQS +heR +crV aKq -bHC +jeM krK dWg xZd @@ -128072,7 +128538,7 @@ yma iCq lFW pCb -iUj +fYe glJ rvR tTz @@ -128295,24 +128761,24 @@ dcE dcE dcE dcE -dcE -dcE -unl -xbI +toV +kYf kYf fPA -uTI +fwI +naJ +ilC wfp -wXW +bRU evv dqo -lDh -juh -unc -uTI -cgE -sbp -sbp +xZd +dDV +alk +tCX +xzq +gRA +gRA jSf kWx rxH @@ -128552,24 +129018,24 @@ dcE dcE dcE dcE -dcE -dcE -unl -unl -unl -unl +toV +toV +toV +toV +toV +heR unl daE -oeV +dJi qLm mOo nBs -vxk +dDV alk -pQS -gmm -hMt -cDI +ppL +jRW +jRW +jRW fOM edY iMP @@ -128809,24 +129275,24 @@ dcE dcE dcE dcE -dcE -dcE -unl +toV pBP pBP bFn -pwb +rTQ +hhO +hcn xrJ -lhX +hnO drW -fzP +juj xZd dDV -uKf -mSE -sBP -sbp -sbp +alk +ppL +lbx +lbx +lbx jSf pbt rQb @@ -129066,20 +129532,20 @@ dcE dcE dcE dcE -dcE -dcE -unl -pBP +toV +hng gIn aUW pQS +heR +crV aKq -lIm +xxM xZd -xMS +dWg xZd dDV -alk +hwu unl unl unl @@ -129202,19 +129668,19 @@ qir qir qir qir -cOu -cOu fUi +cOu +cOu qir qir cOu qir cOu cOu -cOu -cOu -cOu -nem +qir +qir +qir +sNv cbc dcE dcE @@ -129323,18 +129789,18 @@ dcE dcE dcE dcE -dcE -dcE -unl -hng +toV +pBP pBP mVM -rTQ +mJQ +nNO +arD faw -muE +qNF wid -qcX -xZd +kmb +bmq dDV alk unl @@ -129574,24 +130040,24 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE uCR dcE dcE -unl -unl -unl -unl +dcE +dcE +dcE +toV +toV +toV +toV +toV +heR unl hVH -frJ +nwR xZd -rSi xZd +xmk vRE fcT chc @@ -129837,23 +130303,23 @@ dcE dcE dcE dcE -dcE -dcE -unl -xQB +toV +qpL qpL uEQ +gVq +kUU mSE vqH -apA +mpz +xZd xZd -rSi xZd upL fcT unl uua -wjz +ast iTx ydi maS @@ -130094,17 +130560,17 @@ dcE dcE dcE dcE -dcE -dcE -unl -qpL +toV +xQB jRb oBp pQS +heR +crV aKq -eed +rHP xZd -jjh +umN xZd wOG sxT @@ -130351,20 +130817,20 @@ dcE dcE dcE dcE -dcE -dcE -unl +toV qpL qpL ovq -uTI +fwI +naJ +ilC iLC -eaX +pHV jBb omc nQs dDV -alk +aKq unl kdZ bZR @@ -130608,20 +131074,20 @@ dcE dcE dcE dcE -dcE -dcE +toV +toV +toV +toV +toV +heR unl -unl -unl -unl -unl -aKq -dXY -mil -bEK -mil -mUN -ska +hVO +xUb +xZd +rii +xZd +dDV +jAW unl gjb gjb @@ -130746,7 +131212,7 @@ dcE cOu dcE dcE -bWY +fUi dcE dcE cOu @@ -130865,20 +131331,20 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -unl -gCa -rnR -fPi -fPi -fPi -egC -lTX +toV +sbp +sbp +fsb +gVq +kUU +mSE +qEy +fas +xZd +xZd +xZd +dDV +aKq unl dcE dcE @@ -131122,21 +131588,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -unl -unl -unl -mTz -mTz -mTz -unl -unl -unl +toV +lTE +hMt +mFU +pQS +heR +crV +aKq +dns +xZd +xZd +xZd +dDV +aKq +crV dcE dcE heR @@ -131379,21 +131845,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -heR +toV +sbp +sbp +hUK +fwI +naJ +ilC +iLC +qjm +xZd +xZd +xZd +dDV +aKq +crV heR heR heR @@ -131636,22 +132102,22 @@ dcE dcE dcE dcE +toV +toV +toV +toV +toV +heR +unl +aKq +wNI +xZd +tkr +gUV +wor +rgH +unl dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -mXN -mXN mXN mXN xXv @@ -131893,21 +132359,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +toV +bxx +bxx +cCP +gVq +kUU +mSE +bLZ +pni +jBb +omc +nQs +dDV +aKq +crV dcE dcE dcE @@ -132150,21 +132616,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +toV +rXw +gZO +iYC +pQS +heR +crV +aKq +vxV +xZd +wMk +dmz +dDV +aKq +unl dcE dcE dcE @@ -132287,7 +132753,7 @@ bWY bWY bWY bWY -jyP +bWY bWY bWY bWY @@ -132407,21 +132873,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +toV +bxx +bxx +hBA +fwI +naJ +ilC +iLC +tQw +mil +mil +mil +mUN +aKq +crV dcE dcE dcE @@ -132664,21 +133130,21 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +toV +toV +toV +toV +toV +heR +unl +gCa +fPi +xmh +iiU +fPi +rnR +sIv +crV dcE dcE dcE @@ -132927,15 +133393,15 @@ dcE dcE dcE dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE -dcE +unl +crV +unl +unl +crV +unl +unl +crV +unl dcE dcE dcE @@ -168224,7 +168690,7 @@ nlm nlm nlm qCR -qwn +qCR qwn qwn qwn @@ -168438,7 +168904,7 @@ uCF eBw kkZ kkZ -qsm +jEy kkZ gRG gRG @@ -168480,11 +168946,11 @@ nlm nlm nlm nlm -hxa -eMh -guF -dSG -nmF +xrx +cgK +jBW +hJP +noH wua nlm nlm @@ -168737,10 +169203,10 @@ nlm nlm nlm nlm -dod +xrx cgK kfT -xvQ +vIL lAP xAQ nlm @@ -168994,11 +169460,11 @@ nlm nlm nlm nlm -dod -cgK -jBW +kHK +csG +fHv cHv -wlg +mev xAQ dDL nlm @@ -169251,8 +169717,8 @@ nlm nlm nlm nlm -dod -jMU +xrx +vXl qhs qhs qhs @@ -170475,9 +170941,9 @@ nlm nlm nlm bOk -wuh +wiF uCF -xQv +jML tUX eAV bOk @@ -170733,7 +171199,7 @@ nlm gPW gPW gPW -pfb +tia gPW gPW xIN @@ -170991,7 +171457,7 @@ gPW tbz tcb tcb -skO +oNc gPW jWk uRd @@ -171245,7 +171711,7 @@ gPW gPW gPW gPW -fQG +uyw tcb tcb ban @@ -171759,9 +172225,9 @@ gPW adC adC gPW -aLE +piR toI -iGL +efv gPW gPW lVb @@ -172017,7 +172483,7 @@ adC gPW gPW gPW -eJp +vCN gPW gPW gyT @@ -172531,7 +172997,7 @@ eIJ eIJ nKj ipm -vxm +mkd lOd gPW wKg @@ -173058,7 +173524,7 @@ hGg aad hDt sYo -reF +lys pEK raP aad @@ -173313,9 +173779,9 @@ bOk nfS hYF aad -gvi +xol csF -pgd +jqO dJJ raP aad @@ -174074,7 +174540,7 @@ adC gaP dex cKs -oCi +qzN gPW dpo bOk @@ -174600,14 +175066,14 @@ bOk eOS aad aad -pQN +uRV aad aad -mDy +tOr iqw gkO nZJ -iKl +oqi cba cba ohy @@ -174864,7 +175330,7 @@ pLT mPw icw hmo -iKl +oqi cba cba xSS @@ -175103,7 +175569,7 @@ lQe gPW trH gjH -dBK +uwj wMn own cdc @@ -175121,7 +175587,7 @@ uOC iqw bLL eFs -iKl +oqi cba cba xSS @@ -175358,18 +175824,18 @@ lOd ohU tLK gPW -nCl +fFq gjH -lXr +aBR qJS kXH eGt -mIE -tZT -rPI -fnd -emO -jXl +jEr +ouE +fhm +jCW +dNk +rkK ayA aVI aVI @@ -175378,7 +175844,7 @@ jAy sVG uEz aPW -iKl +oqi cba cba xSS @@ -175613,20 +176079,20 @@ jOh jOh yeJ gPW -juM +cQu gPW gPL gjH -czg +sPy wMn -bJH +uOR nPN -oMV -jOl +iYJ +hJz cce -wtE -dEa -lTy +oky +uuj +nOt tCH iKC wfq @@ -175864,14 +176330,14 @@ gPW gPW gPW gPW -rwt +hsh gPW gPW gPW gPW gPW qOS -vsw +jak dax dax yaw @@ -175879,8 +176345,8 @@ wMn hRX hRX hRX -uDu -rDj +czK +tnb hRX hRX hRX @@ -176120,26 +176586,26 @@ uRd uRd bOk aBl -hiA -lNY -lOi -oxf -etQ -nWF -rPT +vXh +wiK +inG +woh +eqp +oIk +gqj nPN qBh qYM rft -feh +rxI ouK hRX -cCZ -vTY -qwo +dEH +pjd +glj tfK -leN -wca +gHJ +ajG hRX wJs mKZ @@ -176149,7 +176615,7 @@ xyF mKZ xyF qrJ -iKl +oqi xSS bwi cba @@ -176377,27 +176843,27 @@ anY pev bOk qtM -jjZ +nbo nli crj xaP oxg -nWF +oIk bOk bOk iRH hRX hRX -eRa +iEH hRX hRX -hcs -ncj -lLl -lLl -ygl -fby -qOz +lxh +ask +aQu +aQu +pfd +ckp +naC taJ mKZ pME @@ -176406,7 +176872,7 @@ xyF mKZ xyF hFf -iKl +oqi aBp cba cba @@ -176634,25 +177100,25 @@ uRd uRd bOk pLO -xQy +rly wTr mjc mjc yhK -ffF +ibw bOk bTF jBk hRX cFa -qIj -wnC -tEs -rYn -ixW -qRx -vlX -fJY +cTc +eGs +kUI +fyp +pag +pDR +ldN +fqC tfK cKX ofL @@ -176663,7 +177129,7 @@ hPV xyF xyF gpI -iKl +oqi aBp cba cba @@ -176891,25 +177357,25 @@ uRd uRd bOk gyc -ctQ +ssT sjQ mjc mjc jkq -oAq +rkf bOk uLb jBk hRX -jyg -ddT +cmf +pDO tfK tfK -tBC -ixW -bWr -vlX -fJY +por +pag +vgh +ldN +fqC tfK rtd taJ @@ -176920,7 +177386,7 @@ xyF mKZ xyF utP -iKl +oqi aBp cba xci @@ -177148,25 +177614,25 @@ uRd uRd bOk thB -bQu -wzz -rak -rak -rak -nWF +oZX +iym +cxL +cxL +cxL +oIk bOk uJI jBk hRX -cwE -lfk +hBY +taF tfK tfK tfK -sPW -hQj -fEl -nAG +jLY +reh +qwF +ktL tfK mek ofL @@ -177177,7 +177643,7 @@ xyF mKZ xyF lqI -iKl +oqi aBp cba cba @@ -177416,21 +177882,21 @@ fkX wko hRX sLd -aBK -lSC -pbL -hAW -qwT -nXz -tCu -kaH -xsk +uhd +mUY +mKO +shv +lHE +xvy +cYo +hQk +jui hRX -dIu +wBR lFj ptT lFj -hWP +pMZ fPy oiz cAk @@ -177669,24 +178135,24 @@ iWo myx bOk opB -qDm +fEW laD hRX -xnC +imo cFa -pfi +sGS hRX -egy -egy -egy -egy -egy -egy +xTc +xTc +xTc +xTc +xTc +xTc hRX -pFj -wPW -mqD -pFj +gMI +slN +xhO +gMI aad aad aad @@ -177919,32 +178385,32 @@ cQP uRd uRd bOk -rAF +pBI rIi -mdZ -wBj -qlB +uIA +riR +oBH bOk bOk bOk -lZh +frM hRX cFa -hIj -uKY +aqg +nHt hRX -xLZ +jFI cqj qeX qeX qeX qeX -jzj -gpK -tyx +qJo +pmg +iBZ oDC upV -rXW +fJK egw ogF ogF @@ -178176,29 +178642,29 @@ cQP uRd bOk bOk -dNb -kbU +gxl +lEG qrz qrz rBm -cyW +hsG bOk -vEh -pwU -bMs -ePd -xkG -hMG +jYS +juq +hqD +vPX +dVj +kle hRX -vIB -xfC -eoU -eoU -eoU -eoU -wRN -wqs -uYr +jEv +cor +oLo +oLo +oLo +oLo +pmN +tcf +mGh axr jOe jOe @@ -178432,23 +178898,23 @@ pev aVT bOk bOk -fRs +gfG oZJ -peO +riE hoj luw hoj uZu bOk -itu +aLa bOk hRX -lsu +wAB hRX hRX hRX -biB -kkQ +dEN +kSZ dUb dUb dUb @@ -178688,24 +179154,24 @@ bOk pev cQP bOk -dJo +sch oZJ -qdN -yaK -eUm -eUm -eUm +cdy +tsd +xXa +xXa +xXa ige -sOt -oBf +haE +dnE dCp -biB -biB -jCN -sAZ -tHK -bwZ -nZX +dEN +dEN +gSq +ikR +klJ +kvF +lhE dUb dUb dUb @@ -178757,7 +179223,7 @@ jIJ jIJ jIJ ptC -qBj +tQa xUJ kCp kCp @@ -178945,24 +179411,24 @@ bOk pev aVT bOk -wYu -dUp +oIU +aLu oZJ -yaK -xos -vJM -aSz +tsd +aWa +xLf +ito qRA -auQ -xjG -era -lLL -cSe -biB -rfw -whv -azD -kHg +spO +hvX +uii +dYi +vua +dEN +sbd +pzb +vNc +cox dUb dUb fDE @@ -179200,26 +179666,26 @@ sUx sUx bOk pev -flM +mmU bOk -hDv -uGq +nTw +sMp oZJ -yaK -cgZ -cgZ -cgZ +tsd +hOO +hOO +hOO qRA -hij -bfu -tvq -rHM -qFL -qko -rfw +oVO +cBc +gDQ +tPH +tnu +wcy +sbd ukT vIw -kHg +cox dUb dUb fDE @@ -179459,24 +179925,24 @@ bOk pev cQP bOk -vwo -mCJ +oYP +bSu oZJ -yaK -prb -xhP -rAy +tsd +oNi +kLF +eXx qRA aTt -saY +hyS dCp -biB -wGU -biB -bKV -xYT -xYT -uXW +dEN +scT +dEN +wog +qaA +qaA +eqZ dUb dUb fDE @@ -179717,19 +180183,19 @@ bOk cQP bOk bOk -dUx +tBt oZJ -dwG -eoP -eoP -eoP +kll +rlE +rlE +rlE qRA -oVR -saY +mvH +hyS umH -ptD -qBY -ptD +hTr +eVF +hTr umH umH umH @@ -179806,7 +180272,7 @@ fQp rVM aXW fIl -sDd +wTj ceG lIr edf @@ -179974,23 +180440,23 @@ bOk cQP cQP bOk -iaf -iaf -mHz -iaf -iaf -ihG +sJR +sJR +udE +sJR +sJR +uRU nmS -hij -hKO +oVO +aum umH ipQ -osg -mUF +qWW +grJ umH -iiX -abv -hQr +kPH +tCz +sXd dUb dUb fDE @@ -180228,26 +180694,26 @@ kJO sUx kdl bOk -aJM +baL cQP cQP -iaf -jtS -rBx -obI -iaf -feq +sJR +erM +qJK +tIO +sJR +ikG hoj hoj -gYr +dVn umH ipQ -sRs -bJc +cjv +hsL umH -yis -pjI -hQr +dfC +quB +sXd dUb dUb fDE @@ -180488,23 +180954,23 @@ bOk bOk bOk cQP -bjA -dav -pYA -qnp -iaf -saY -aJj -mgj -mgj +aJg +tYt +qMm +lTx +sJR +hyS +sjE +vsh +vsh umH -rbs -fEL -kKS +onj +vRc +tsI umH -saQ -vNc -qwL +oIv +wnO +pTi dUb dUb fDE @@ -180745,23 +181211,23 @@ uRt tGM bOk cQP -iaf -sKU -chj -xhK -iaf -saY -xFd -vii -trG +sJR +dZH +ggN +qeq +sJR +hyS +lgi +wvc +koM umH -sgY -pAI -fIF +llY +uLf +ulM umH -epX -sOW -cqH +wDu +pGn +uGT sRG dUb fDE @@ -181002,23 +181468,23 @@ xqd cHp bOk cQP -iaf -gxW -thM -hhf -iaf -saY -xFd -gYR -bpS +sJR +qLF +typ +scf +sJR +hyS +lgi +ugn +tfR umH -bqs -sub -bHk -qBK +tdt +dgD +hcD +wZN flY xuQ -qsa +dEo dUb dUb fDE @@ -181259,22 +181725,22 @@ xqd oNs hFT cQP -iaf -tnF -eXP -rDu -uvt -opT -mcr -mcr -edB +sJR +iib +pWC +jXC +eZt +sow +xlm +xlm +mqJ umH -sDc -xwR -uVO +cLi +hwT +efD umH -xtt -gfM +fBU +lVv umH dUb dUb @@ -181516,11 +181982,11 @@ xqd fua bOk bOk -iaf -iaf -iaf -iaf -iaf +sJR +sJR +sJR +sJR +sJR dCp dCp dCp @@ -182822,7 +183288,7 @@ dUb dUb dUb drX -hwe +pdr gOK vzx aZo @@ -186636,10 +187102,10 @@ nlm nlm nlm gMO -vEX +lki wux nNC -wua +xBd nlm dDL ixf @@ -186893,12 +187359,12 @@ nlm nlm nlm gMO -sxx -dDO +dyk +vEX nRP xBd tSA -nhh +tSA bPW rNe rNe @@ -187150,10 +187616,10 @@ nlm nlm nlm gMO -dSy -fLD -lrW -wua +boa +bIh +myC +jcN nlm tSA ixf @@ -187409,7 +187875,7 @@ nlm nlm vlH vlH -vlH +qCR nlm nlm tSA @@ -187708,14 +188174,14 @@ roj dCm aMz jVB -dul +kVj kVj tSw eZC gZu -imd +eZC jVB -sQZ +jPa paf paf shs @@ -187970,7 +188436,7 @@ kVj qJB eZC ylo -eZC +imd jVB jPa paf @@ -188224,10 +188690,10 @@ dJR jVB lgF lgF -jVB +qbO lgF pKJ -jVB +qbO jVB jPa paf @@ -188477,14 +188943,14 @@ dCm dCm rGw dCm -dJR -qkM +taC +cdi nSp nSp xmQ mDk twC -gpJ +pSV cdi jPa paf @@ -188729,12 +189195,12 @@ ecP lai fNG dCm +pVF sgG -sgG -sgG -sgG -dVe -sgG +wtK +wtK +kcu +qhn sMw lYT twC @@ -188743,7 +189209,7 @@ twC tzO rPK cdi -sQZ +jPa paf jPa shs @@ -188986,13 +189452,13 @@ gYY dCm dCm dCm -sgG -dXy -dXy -oce -dXy -fIg -qkM +avb +yem +sgN +ptH +sgN +iPI +cdi rnh miE wIl @@ -189207,10 +189673,10 @@ qeQ qeQ wJJ shx -pPu -pPu -pPu -pPu +uIx +uIx +uIx +uIx shx hRj hRj @@ -189244,11 +189710,11 @@ sgG sgG xmx exM -fqz -sOl slP -fqz -rBo +sgN +rpz +rpz +mDm cdi cdi cdi @@ -189465,7 +189931,7 @@ rOG wJJ shx tlf -wCm +jJE lqv ejA shx @@ -189495,7 +189961,7 @@ dCm dCm dCm dCm -gGB +dCm dCm dCm dCm @@ -189510,7 +189976,7 @@ uGj jPa jPa jPa -qGa +jPa tLo paf paf @@ -189722,8 +190188,8 @@ eBf wJJ shx pJf -jBB -yeH +aSb +vfo evH shx hRj @@ -189967,20 +190433,20 @@ dDL dDL dDL shx -pPu +uIx shx -xaT +uIx shx -pKc -aMs +mKK aMs +hil peo -mmM -qJu +tpt +lwX shx ncT -ewx -jBB +xQX +lgq iUo shx kOk @@ -190009,7 +190475,7 @@ hdi hdi hdi kOk -uYX +kOk kOk lUM kOk @@ -190234,7 +190700,7 @@ chG chG chG wdu -qvw +uqL iPL sGR sGR @@ -190255,7 +190721,7 @@ oOs oOs oOs oOs -oOs +iTB oOs oOs oOs @@ -190265,8 +190731,8 @@ oOs oOs oOs oOs -hUw -ppX +rxm +mQT mGO rLz xfj @@ -190498,32 +190964,32 @@ hja uuo shx eSh -vel -vel -vel -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -fkR -gSY -iov -iov -kFS -iov +bAW +bAW +bAW +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +smk +qhZ +iPH +iPH +pbs +bAW hWk cCM cCM @@ -190769,7 +191235,7 @@ fMu fMu fMu fMu -bCP +fMu fMu fMu fMu @@ -190779,7 +191245,7 @@ fMu auP fMu cfT -bMD +rqp fMu agz cCM @@ -191033,7 +191499,7 @@ hYV ngH ngH hYV -rBF +eOz hYV ngH ngH @@ -191254,7 +191720,7 @@ nlm shx vvb foH -jhg +xpF fVM fVM pPu @@ -191280,25 +191746,25 @@ xpr ijs ggW ngH -wxU +xgA jEV fzl rWs -aRW -xAI -oDg -aFk +bQO +wVn +wdh +uSa xBt -btj +kFr tLs -tLs -mkV +xAI +nYq hsd ujX -eYS -aQL -qve -gph +hFI +lRM +osQ +uhV uAO uhO uhO @@ -191531,32 +191997,32 @@ ijs xBQ sRP bWQ -eZV -bGR -sAu -fKD -sAu -oCU +cBv +vza +vza +vza +vza +aIV njY ntA eVy xAI -snF +lGF +wdh +bzK +wwg xAI -vKw +btj +tqN xAI xAI -src -xAI -ggU -wzr tkV ujX -obp -tIW -uqf -mVu -gGb +nIT +gEX +fRH +atW +wOU ljh cCM bXp @@ -191788,32 +192254,32 @@ rhD dwq nhU bmc +hAW ijs -qfT -qRp -qRp -tCI +tFq +paV +paV ngH -tyY +rkg xAI iux xAI +nEH +rwy +rwy +loW xAI -xAI -iJs -xAI -xAI -nDM -xAI -xAI -tLs -dgm -ulQ -pxw -wmr -rYP -sKR -gRI +src +tqN +bIo +bIo +jvd +ndT +suq +ovz +eus +tfP +uWM ljh cCM bXp @@ -192026,7 +192492,7 @@ uIx hcf hbS hbS -nkE +qzL wpd shx ewK @@ -192045,32 +192511,32 @@ ijs lEy nhU vPa +wtD ijs -vPK -tqU -qRp -mLk +wQz +hsZ +tKJ ngH kbS -tLQ -rSX -vQf -tLQ -eVu -sLx -nRk -eVu -vQf -qpY -guy -cIM -nav -apI -hLS -sko -jLH -mVu -rKO +xAI +iux +xAI +uKj +xAI +xAI +xAI +xAI +xAI +nwO +xAI +jnQ +xAI +llS +hVx +abW +tUI +ucN +lrA ljh cCM bXp @@ -192289,7 +192755,7 @@ shx vHa aZQ hHE -oTq +cyq iGC goM qij @@ -192303,30 +192769,30 @@ ijs ijs ijs ijs -jcP -qRp -qRp -eGp +qbl +lXU +tKJ +uTl ngH kbS -sLx -pdM -sLx -eVu +tLQ +lHo +vQf +tLQ eVu sLx -xTY +nTZ eVu -sLx -sLx +vQf +qpY +guy +vQf xAI -sLx -jnQ ujX -oNP -sAM -mVu -wlV +qJN +ydV +fcE +lrJ cbT ljh cCM @@ -192548,7 +193014,7 @@ fJc shx tHE shx -pTz +kKr qNX mHZ bpZ @@ -192557,32 +193023,32 @@ vjC ijs ijs ijs -csf ijs ijs -jcP -gtw -gtw -jIj +ijs +wgU +rqo +hsD +hsD ngH wIS -xAI -iux +sLx +oWp +lmN +eVu +eVu +sLx +dcB +eVu +sLx +sLx fXp -xAI -xAI -xAI -fXp -xAI -xAI -xAI -fXp -xAI -xAI +sLx +yiQ hql cbT sRE -vUb +jyk sRE cbT cCM @@ -192813,14 +193279,14 @@ rqo eEW bDn ijs -ijs -rKz +gEx ijs ijs -jcP +ijs +cym +qRp +qRp qRp -oys -iLH ngH nsN xAI @@ -192838,9 +193304,9 @@ xAI xAI jBh cbT -eKL -mVu -orn +wJO +iCt +ivX cbT cCM cCM @@ -193061,11 +193527,11 @@ dcE dcE dcE dcE -myt gaf mDG mDG mDG +mDG efZ xbP pxN @@ -193074,10 +193540,10 @@ ijs ijs ijs ijs -jcP -lnf -fVU -fVU +vOu +qRp +qRp +bMt ngH lse xAI @@ -193095,9 +193561,9 @@ okO xAI qYY cbT -iMq -mVu -xjq +dlF +dMv +jgz cbT kOk kOk @@ -193111,7 +193577,7 @@ kOk mKk qVD lia -arL +rAg jzz xwu oeF @@ -193318,11 +193784,11 @@ nlm nlm nlm nlm -rAT gaf mDG mDG mDG +mDG efZ xbP ijs @@ -193331,10 +193797,10 @@ ijs ijs ijs ijs -jcP +kcn qRp -hOZ -lEj +qRp +guL ngH hFA hFA @@ -193352,15 +193818,15 @@ wVX qcT mNC cbT -qHC -xdZ -cbT +sHY +pfF +fMh cbT omx iwq vVR fVn -iOc +plS ddM vRf cfI @@ -193580,18 +194046,18 @@ bxd mDG mDG mDG -efZ -xbP +rqo +gNE +ijs ijs ijs ijs -lpw ijs ijs jcP gtw gtw -bQt +rmd ngH hFA hFA @@ -193837,18 +194303,18 @@ bxd mDG mDG mDG -rqo +efZ xbP aEr ijs ijs -lIw +ijs ijs ijs jcP +dai qRp -qRp -smD +iyF ngH hFA qcT @@ -193879,7 +194345,7 @@ uaw bzL fmO sus -cck +gRR jzz jzz jzz @@ -194094,7 +194560,7 @@ bxd mDG mDG mDG -rqo +efZ xbP lrl ijs @@ -194102,10 +194568,10 @@ ijs ijs ijs ijs -dFY +jcP qRp qRp -smD +exz ngH riI qcT @@ -194359,8 +194825,8 @@ ijs pID ijs ijs -iuu -gix +jcP +nek cAI smD ngH @@ -194377,12 +194843,12 @@ tPe aSB mLS vFP -itm -itm +qcT +qcT shi -mIg -vuV -uRp +hvw +tDT +eEp uxI jkz spb @@ -194634,10 +195100,10 @@ tPe aSB mLS vFP -itm -itm +qcT +qcT xsS -jYG +eeR xsS tse iXH @@ -194869,13 +195335,13 @@ eWq nsx ijs ijs -fBh -fBh +gEx +kRv ijs -kpc +efZ mUS -jkI -kBG +kjQ +orD ydi vti qcT @@ -195109,7 +195575,7 @@ slL dcE nlm ydS -uhg +hBc bNX eIz tHd @@ -195120,16 +195586,16 @@ bNX fmV bra eOY -uZg +niF byA gMP eTt gkP ijs -oBM -oBM +ijs +ehf alG -kpc +efZ akK onh tCd @@ -195381,10 +195847,10 @@ bxd vGE rqo nhU -cwo -jQQ +ffK +ijs +ijs ijs -vbB ddh hYu sMa @@ -195411,7 +195877,7 @@ twY ulh sNW hnh -gwx +gGT fbk shi sus @@ -195636,14 +196102,14 @@ bxd mDG mDG mDG -rqo -nmk -jbD -jbD -llg -nMV -aor -uTU +efZ +brf +ijs +ijs +ijs +ijs +tcw +mza mVw vIX ggX @@ -195678,7 +196144,7 @@ sus gzm sus lIA -sus +eur wKb sZh sZh @@ -195893,13 +196359,13 @@ bxd mDG mDG mDG -rqo -rqo -efZ -efZ -rqo -efZ efZ +sRP +ijs +ijs +ijs +ijs +sRP rqo gjb gjb @@ -195926,7 +196392,7 @@ iLL cYB cYB xsS -gwx +gGT shi gzm sus @@ -196147,17 +196613,17 @@ ydS ydS bxd bxd +mDG +mDG rYB -rYB -rYB -mDG -mDG -mDG -mDG -mDG -mDG -mDG -mDG +rqo +fYW +euH +ijs +ijs +ijs +sRP +rqo mDG rYB rYB @@ -196401,20 +196867,20 @@ nlm dDL nlm nlm -nlm -nlm -dDL -nlm -nlm -slL gaf mDG mDG mDG -mDG -mDG -mDG -mDG +xmq +dDL +efZ +sRP +sBO +ijs +ijs +ijs +brf +efZ xmq nlm nlm @@ -196658,28 +197124,28 @@ dcE heR dcE dcE -dcE -dcE +gaf +mDG +mDG +mDG +xmq dDL -nlm -nlm -slL -hDS -rYB -rYB -rYB -rYB -rYB -rYB -rYB -ydy +efZ +sRP +ijs +ijs +ijs +ijs +sRP +efZ +xmq nlm nlm qCR hYV aBv nzG -qbZ +gYB ngH ngH fhd @@ -196913,23 +197379,23 @@ mXN mXN mXN mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -mXN -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +kOx +kOx +gaf +mDG +mDG +mDG +xmq +heR +rqo +mVX +ijs +ijs +gEx +eYY +sRP +rqo +xmq nlm slL slL @@ -196943,7 +197409,7 @@ xoh fhd hCg hCg -joI +qpA ngH heR nlm @@ -197172,21 +197638,21 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +gaf +mDG +mDG +mDG +xmq +dDL +efZ +sRP +ror +ijs +ijs +hGM +sRP +efZ +xmq nlm nlm slL @@ -197429,21 +197895,21 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +gaf +mDG +mDG +mDG +xmq +dDL +efZ +sRP +enC +ijs +ijs +ijs +sRP +efZ +xmq nlm nlm nlm @@ -197686,21 +198152,21 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +gaf +mDG +mDG +mDG +xmq +dDL +rqo +sRP +ijs +ijs +ijs +pwP +sRP +rqo +xmq nlm nlm nlm @@ -197943,21 +198409,21 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +gaf +mDG +mDG +mDG +xmq +dDL +efZ +sRP +ijs +jQQ +vbB +ijs +sRP +efZ +xmq nlm nlm nlm @@ -198200,21 +198666,21 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +rYB +rYB +rYB +rYB +rYB +dDL +efZ +sRP +sRP +kLs +ooE +sRP +sRP +efZ +xmq nlm nlm nlm @@ -198462,16 +198928,16 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +dDL +rqo +efZ +efZ +rqo +rqo +efZ +efZ +rqo +xmq nlm nlm nlm @@ -198719,16 +199185,16 @@ nlm nlm nlm nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm -nlm +dDL +dDL +dDL +dDL +dDL +dDL +dDL +dDL +dDL +dDL nlm nlm nlm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 463b9295710..39422058960 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -12584,6 +12584,7 @@ }, /obj/machinery/digital_clock/directional/south, /obj/item/mod/module/signlang_radio, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, /turf/open/floor/iron, /area/station/medical/storage) "dds" = ( @@ -39632,6 +39633,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron, /area/station/security/evidence) "jLo" = ( diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index a1453ec230f..3edeff950c8 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -129,27 +129,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"abV" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Drone Bay" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor{ - dir = 8 - }, -/obj/effect/turf_decal/siding/brown/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Lockdown Shutters"; - id = "cargolockdown"; - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) "abZ" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks, @@ -2112,6 +2091,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"aCC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "aCH" = ( /obj/item/toy/plush/lizard_plushie/space/green{ name = "Ruins-The-Analog" @@ -3270,23 +3258,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"aTJ" = ( -/obj/machinery/mineral/ore_redemption{ - input_dir = 8; - output_dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Ore Redemtion Window"; - req_access = list("mineral_storeroom") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/iron/dark, -/area/station/cargo/office) "aTT" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -3662,12 +3633,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"aYI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron/white/textured, -/area/station/security/medical) "aYJ" = ( /turf/open/floor/iron/white, /area/station/science/research) @@ -4382,6 +4347,15 @@ /obj/machinery/power/port_gen/pacman, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"biK" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lobby Lockdown Shutters"; + id = "cargolobbylockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) "biR" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -6226,6 +6200,14 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"bGm" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "bGn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6448,16 +6430,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/smooth, /area/mine/eva) -"bJd" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "bJi" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/landmark/generic_maintenance_landmark, @@ -6702,14 +6674,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"bML" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/wall_healer/directional/south, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/exit/departure_lounge) "bMY" = ( /turf/open/floor/glass/reinforced, /area/station/hallway/primary/starboard) @@ -10049,14 +10013,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/storage) -"cIY" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security EVA" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/armory, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/smooth, -/area/station/security/brig/upper) "cJb" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, @@ -10594,6 +10550,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"cQp" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "cQw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -11223,12 +11183,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"daw" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron, -/area/station/command/bridge) "daE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, @@ -13220,6 +13174,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness) +"dCI" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) "dCR" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/tcomms_all, @@ -14428,13 +14393,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"dVe" = ( -/obj/item/kirbyplants/random, -/obj/machinery/wall_healer/directional/west, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "dVj" = ( /obj/effect/spawner/structure/window, /turf/open/floor/iron/dark, @@ -14953,15 +14911,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"edu" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "edw" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -14972,13 +14921,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"edI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/wall_healer/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "edN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -15510,6 +15452,19 @@ dir = 8 }, /area/station/science/explab) +"ell" = ( +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "elw" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/upper) @@ -16284,30 +16239,6 @@ "exw" = ( /turf/closed/wall, /area/station/service/hydroponics) -"exy" = ( -/obj/machinery/door/firedoor{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lobby Lockdown Shutters"; - id = "cargolobbylockdown" - }, -/turf/open/floor/iron/dark/textured, -/area/station/cargo/lobby) "exC" = ( /obj/structure/fence/corner{ dir = 8 @@ -17541,6 +17472,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"eRk" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "eRp" = ( /obj/structure/bed{ dir = 1; @@ -19070,13 +19006,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"fmn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/wall_healer/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "fmq" = ( /obj/docking_port/stationary{ dir = 4; @@ -19939,11 +19868,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/mechbay) -"fAO" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron, -/area/station/command/bridge) "fAV" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -20091,15 +20015,6 @@ }, /turf/open/floor/wood/parquet, /area/station/service/bar/atrium) -"fDg" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Lockdown Shutters"; - id = "cargolockdown"; - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) "fDl" = ( /obj/machinery/light/small/built/directional/west, /turf/open/floor/iron, @@ -20784,15 +20699,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"fNF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Lockdown Shutters"; - id = "cargolockdown"; - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "fNK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21095,6 +21001,16 @@ }, /turf/open/floor/iron, /area/station/security/prison/mess) +"fTc" = ( +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/camera/directional/south{ + c_tag = "Starboard Primary Hallway Center" + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "fTi" = ( /obj/effect/turf_decal/trimline/neutral/end{ dir = 4 @@ -21855,6 +21771,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"gdG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "gdN" = ( /obj/structure/railing/corner{ dir = 1 @@ -24946,12 +24872,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/evidence) -"gXi" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "gXk" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -25839,6 +25759,24 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"hlu" = ( +/obj/machinery/door/firedoor{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lobby Lockdown Shutters"; + id = "cargolobbylockdown" + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/lobby) "hlv" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/shower/directional/west, @@ -27377,6 +27315,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) +"hIT" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet1"; + name = "Unit 1" + }, +/obj/machinery/duct, +/turf/open/floor/iron/textured, +/area/station/commons/toilet) "hIU" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, @@ -29511,24 +29457,6 @@ dir = 4 }, /area/station/engineering/lobby) -"inC" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - name = "Cargo Desk"; - req_access = list("cargo") - }, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/item/papercutter, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/iron, -/area/station/cargo/office) "inE" = ( /turf/open/floor/iron/corner, /area/station/engineering/lobby) @@ -30088,6 +30016,15 @@ }, /turf/open/floor/wood, /area/station/service/library) +"iwa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "iwd" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -30100,24 +30037,6 @@ "iwf" = ( /turf/closed/wall/r_wall, /area/mine/mechbay) -"iwt" = ( -/obj/machinery/door/firedoor{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lobby Lockdown Shutters"; - id = "cargolobbylockdown" - }, -/turf/open/floor/iron/dark/textured, -/area/station/cargo/lobby) "iwz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30221,15 +30140,6 @@ /obj/structure/bookcase/random, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"iyf" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/wall_healer/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "iyg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -30697,6 +30607,15 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics) +"iGV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "iHc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -31698,6 +31617,10 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"iWL" = ( +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "iWM" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -31726,6 +31649,18 @@ }, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) +"iWU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security EVA" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, +/turf/open/floor/iron/smooth, +/area/station/security/processing) "iWZ" = ( /obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32468,10 +32403,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark/smooth_half, /area/station/medical/morgue) -"jhb" = ( -/obj/machinery/wall_healer/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) "jhf" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, @@ -32597,6 +32528,15 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"jjF" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lobby Lockdown Shutters"; + id = "cargolobbylockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/lobby) "jjI" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/trimline/green/filled/line, @@ -33179,15 +33119,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"jtu" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/camera/directional/east{ - c_tag = "Engineering Lobby" - }, -/obj/structure/window/spawner/directional/north, -/obj/machinery/wall_healer/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/lobby) "jtx" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/red, @@ -33464,22 +33395,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jwD" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Base" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/iron/dark/textured_half, -/area/station/cargo/storage) "jwF" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/iron, @@ -33662,6 +33577,26 @@ }, /turf/open/floor/iron/smooth_corner, /area/station/command/heads_quarters/rd) +"jzL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + id_tag = "cargooffice"; + name = "Cargo Office" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "jzY" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -35355,6 +35290,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/mining) +"jYG" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/filingcabinet/white, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/sorting) "jYH" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -37736,6 +37680,14 @@ /obj/item/stamp/head/qm, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) +"kGW" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "kHb" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -37743,6 +37695,19 @@ /obj/item/clothing/head/costume/pirate/bandana, /turf/open/floor/iron, /area/station/maintenance/starboard/fore) +"kHg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/east, +/obj/machinery/light_switch/directional/east{ + pixel_x = 23 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kHj" = ( /obj/effect/turf_decal/siding/wood, /obj/item/kirbyplants/random/fullysynthetic{ @@ -37784,6 +37749,14 @@ /obj/machinery/firealarm/directional/north, /turf/open/openspace, /area/station/science/xenobiology) +"kHO" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet2"; + name = "Unit 2" + }, +/obj/machinery/duct, +/turf/open/floor/iron/textured, +/area/station/commons/toilet) "kHP" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -38778,6 +38751,13 @@ /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon, /area/icemoon/underground/explored) +"kWn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "kWr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -39151,6 +39131,30 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"laI" = ( +/obj/machinery/door/firedoor{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lobby Lockdown Shutters"; + id = "cargolobbylockdown" + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/lobby) "laM" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -41754,6 +41758,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lNs" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "lNy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41872,6 +41882,13 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) +"lOT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "lOU" = ( /obj/machinery/recharge_station, /obj/effect/decal/cleanable/dirt, @@ -41993,6 +42010,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/office) +"lQd" = ( +/obj/machinery/wall_healer/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) "lQe" = ( /obj/machinery/vending/wardrobe/engi_wardrobe, /obj/machinery/status_display/ai/directional/north, @@ -42274,11 +42295,6 @@ dir = 10 }, /area/station/science/research) -"lUp" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "lUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43299,6 +43315,10 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"mmg" = ( +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "mmh" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -43553,6 +43573,15 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"mqp" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) "mqq" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -43696,14 +43725,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"msG" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet2"; - name = "Unit 2" - }, -/obj/machinery/duct, -/turf/open/floor/iron/textured, -/area/station/commons/toilet) "msN" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, @@ -44279,14 +44300,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/explab) -"mBm" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet1"; - name = "Unit 1" - }, -/obj/machinery/duct, -/turf/open/floor/iron/textured, -/area/station/commons/toilet) "mBr" = ( /obj/item/toy/plush/lizard_plushie{ name = "Wines-And-Dines"; @@ -45245,6 +45258,11 @@ dir = 4 }, /area/station/command/gateway) +"mQi" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "mQk" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 @@ -46897,14 +46915,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"npe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/miningdock) "npn" = ( /obj/structure/cable, /turf/open/floor/iron/showroomfloor, @@ -47608,15 +47618,6 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"nyU" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "nyX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -47900,6 +47901,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"nBT" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron, +/area/station/command/bridge) "nCb" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/lithium{ @@ -49332,6 +49339,15 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) +"nUS" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/camera/directional/east{ + c_tag = "Engineering Lobby" + }, +/obj/structure/window/spawner/directional/north, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/lobby) "nVc" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -50157,19 +50173,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/large, /area/station/medical/treatment_center) -"oit" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/machinery/wall_healer/directional/east, -/obj/machinery/light_switch/directional/east{ - pixel_x = 23 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "oiy" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/service) @@ -50452,17 +50455,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/black, /area/station/security/prison/safe) -"olY" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security EVA" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/armory, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/smooth, -/area/station/security/processing) "omg" = ( /obj/effect/spawner/random/clothing/wardrobe_closet_colored, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -51177,15 +51169,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"ovl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lobby Lockdown Shutters"; - id = "cargolobbylockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) "ovm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51389,16 +51372,6 @@ /obj/structure/table, /turf/open/floor/wood, /area/station/command/meeting_room) -"oyt" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Starboard Primary Hallway Center" - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "oyv" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -51436,26 +51409,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/aft/lesser) -"oyE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - id_tag = "cargooffice"; - name = "Cargo Office" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/shipping, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "oyH" = ( /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, @@ -52082,6 +52035,27 @@ /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"oFG" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Drone Bay" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor{ + dir = 8 + }, +/obj/effect/turf_decal/siding/brown/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/drone_bay) "oFI" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 6 @@ -52361,6 +52335,15 @@ }, /turf/open/floor/iron, /area/station/security/brig/upper) +"oID" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/wall_healer/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "oIH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining{ @@ -54504,10 +54487,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"poY" = ( -/obj/machinery/wall_healer/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) "ppc" = ( /obj/item/trash/syndi_cakes, /obj/effect/turf_decal/stripes/red/line{ @@ -55355,15 +55334,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"pzP" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/office) "pzV" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -56982,6 +56952,15 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) +"pZl" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/drone_bay) "pZm" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, @@ -56995,15 +56974,6 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) -"pZp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "pZB" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Chemistry Access" @@ -57049,17 +57019,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"pZW" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "pZY" = ( /mob/living/simple_animal/hostile/asteroid/polarbear{ move_force = 999; @@ -57488,6 +57447,20 @@ dir = 8 }, /area/station/commons/storage/mining) +"qfb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/closet/secure_closet/medical3, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/machinery/light/cold/directional/north, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "qfh" = ( /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) @@ -58393,13 +58366,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) -"qsP" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) "qsQ" = ( /obj/machinery/stasis, /obj/machinery/defibrillator_mount/directional/north, @@ -58984,6 +58950,15 @@ /obj/machinery/meter/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"qDn" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) "qDA" = ( /obj/structure/bed{ dir = 4 @@ -59707,15 +59682,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"qMA" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - location = "QM #4" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) "qMF" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer, @@ -60638,18 +60604,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) -"qYE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/duct, -/obj/machinery/wall_healer/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness) "qYF" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -60660,6 +60614,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"qYN" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "qYO" = ( /obj/item/reagent_containers/spray/plantbgone, /obj/item/reagent_containers/spray/pestspray{ @@ -61549,10 +61510,6 @@ /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"rlA" = ( -/obj/machinery/wall_healer/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "rlB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -62137,6 +62094,24 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) +"rtO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + name = "Delivery Desk"; + req_access = list("shipping") + }, +/obj/effect/turf_decal/bot, +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lobby Lockdown Shutters"; + id = "cargolobbylockdown" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) "rtR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -63126,16 +63101,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/maintenance/fore/lesser) -"rKi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/button/door/directional/east{ - name = "Cargo Lockdown"; - id = "cargolockdown"; - req_access = list("cargo") - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "rKs" = ( /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/dirt, @@ -63740,6 +63705,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/processing) +"rTY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown"; + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) "rTZ" = ( /obj/machinery/light/floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66564,19 +66539,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/dark, /area/station/service/hydroponics/garden) -"sGs" = ( -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "sGw" = ( /obj/structure/sign/warning/secure_area/directional/north, /turf/open/genturf/blue, @@ -66731,15 +66693,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/mine/mechbay) -"sIf" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lobby Lockdown Shutters"; - id = "cargolobbylockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/lobby) "sIl" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/fullgrass/style_random, @@ -66961,23 +66914,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/less_spawns) -"sMK" = ( -/obj/machinery/light_switch/directional/south{ - pixel_y = -24; - pixel_x = -2 - }, -/obj/structure/closet/secure_closet/security/cargo, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - req_access = list("cargo"); - name = "Cargo Lockdown"; - id = "cargolockdown"; - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "sML" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67146,6 +67082,15 @@ }, /turf/open/floor/plating, /area/station/science/ordnance/office) +"sPs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/office) "sPA" = ( /obj/structure/rack, /obj/item/storage/bag/ore, @@ -68578,6 +68523,24 @@ dir = 8 }, /area/station/science/ordnance/office) +"tku" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + name = "Cargo Desk"; + req_access = list("cargo") + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/item/papercutter, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/iron, +/area/station/cargo/office) "tkP" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -68824,6 +68787,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"tnK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/east{ + name = "Cargo Lockdown"; + id = "cargolockdown"; + req_access = list("cargo") + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "tnO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -70044,6 +70017,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/laborcamp) +"tHa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/wall_healer/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/security/medical) "tHb" = ( /obj/effect/spawner/random/structure/musician/piano/random_piano, /obj/machinery/button/curtain{ @@ -70923,15 +70902,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/ordnance) -"tUq" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) "tUx" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -71502,24 +71472,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ucL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - name = "Delivery Desk"; - req_access = list("shipping") - }, -/obj/effect/turf_decal/bot, -/obj/structure/table/reinforced, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lobby Lockdown Shutters"; - id = "cargolobbylockdown" - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) "ucN" = ( /turf/closed/wall/r_wall, /area/station/security/detectives_office) @@ -71903,6 +71855,23 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"uiM" = ( +/obj/machinery/mineral/ore_redemption{ + input_dir = 8; + output_dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Ore Redemtion Window"; + req_access = list("mineral_storeroom") + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/iron/dark, +/area/station/cargo/office) "uja" = ( /turf/closed/wall, /area/station/commons/toilet) @@ -72267,6 +72236,14 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/cargo/office) +"unP" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/miningdock) "uog" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -72746,6 +72723,15 @@ }, /turf/open/floor/plating, /area/station/service/hydroponics) +"uvB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security EVA" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/red_alert_access, +/turf/open/floor/iron/smooth, +/area/station/security/brig/upper) "uvC" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -77756,6 +77742,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vXm" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + location = "QM #4" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) "vXn" = ( /obj/structure/table, /obj/item/food/pie/cream, @@ -78530,19 +78525,6 @@ /obj/structure/sign/warning/directional/north, /turf/closed/mineral/random/snow/high_chance, /area/icemoon/underground/explored) -"wjD" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/closet/secure_closet/medical3, -/obj/item/defibrillator/loaded{ - pixel_y = 3 - }, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "wjL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -79672,16 +79654,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"wBH" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "Cargo Lockdown Shutters"; - id = "cargolockdown"; - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) "wCo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 1 @@ -80750,6 +80722,38 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) +"wSL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/pen/red, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/folder/yellow, +/obj/machinery/button/door/directional/west{ + id = "qmprivacy"; + name = "Privacy Shutters Control"; + req_access = list("qm"); + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + pixel_y = -9; + name = "Cargo Lockdown"; + id = "cargolockdown"; + req_access = list("cargo") + }, +/obj/machinery/button/door/directional/west{ + pixel_y = -1; + name = "Cargo Lobby Lockdown"; + id = "cargolobbylockdown"; + req_access = list("cargo") + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "wSU" = ( /obj/structure/chair{ dir = 1 @@ -81021,6 +81025,13 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"wVJ" = ( +/obj/item/kirbyplants/random, +/obj/machinery/wall_healer/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "wVS" = ( /obj/machinery/door_buttons/access_button, /turf/closed/wall/r_wall, @@ -81414,6 +81425,17 @@ /obj/structure/ladder, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"xcc" = ( +/obj/machinery/medical_kiosk, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/sign/departments/medbay/alt/directional/north, +/obj/machinery/firealarm/directional/north{ + pixel_x = 26 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xce" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -81564,6 +81586,15 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) +"xen" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) "xer" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/poddoor/shutters/preopen{ @@ -82356,15 +82387,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/atmos) -"xoZ" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "xpc" = ( /obj/effect/turf_decal/siding/yellow/corner, /obj/machinery/status_display/evac/directional/south, @@ -82399,10 +82421,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"xpD" = ( -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "xpE" = ( /obj/structure/table, /obj/item/knife/kitchen, @@ -82437,6 +82455,18 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"xqh" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/duct, +/obj/machinery/wall_healer/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness) "xqj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82574,15 +82604,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) -"xrI" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - name = "Cargo Lockdown Shutters"; - id = "cargolockdown" - }, -/turf/open/floor/plating, -/area/station/cargo/storage) "xrS" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -82801,6 +82822,22 @@ /obj/item/wirecutters, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"xvt" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Base" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + name = "Cargo Lockdown Shutters"; + id = "cargolockdown" + }, +/turf/open/floor/iron/dark/textured_half, +/area/station/cargo/storage) "xvy" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/stripes/line{ @@ -83174,6 +83211,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/laborcamp/security) +"xzs" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/turf/open/floor/iron, +/area/station/command/bridge) "xzH" = ( /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -84071,17 +84113,6 @@ "xMq" = ( /turf/closed/mineral/random/snow, /area/icemoon/underground/explored) -"xMC" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/sign/departments/medbay/alt/directional/north, -/obj/machinery/firealarm/directional/north{ - pixel_x = 26 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "xMQ" = ( /obj/effect/mapping_helpers/ianbirthday, /turf/open/floor/carpet, @@ -84304,38 +84335,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/auxiliary) -"xQw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/pen/red, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/folder/yellow, -/obj/machinery/button/door/directional/west{ - id = "qmprivacy"; - name = "Privacy Shutters Control"; - req_access = list("qm"); - pixel_y = 7 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - pixel_y = -9; - name = "Cargo Lockdown"; - id = "cargolockdown"; - req_access = list("cargo") - }, -/obj/machinery/button/door/directional/west{ - pixel_y = -1; - name = "Cargo Lobby Lockdown"; - id = "cargolobbylockdown"; - req_access = list("cargo") - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "xQB" = ( /obj/effect/spawner/random/clothing/costume, /obj/structure/rack, @@ -84689,6 +84688,23 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"xVE" = ( +/obj/machinery/light_switch/directional/south{ + pixel_y = -24; + pixel_x = -2 + }, +/obj/structure/closet/secure_closet/security/cargo, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/button/door/directional/south{ + req_access = list("cargo"); + name = "Cargo Lockdown"; + id = "cargolockdown"; + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "xVG" = ( /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) @@ -84767,11 +84783,6 @@ /obj/item/plate, /turf/open/floor/iron, /area/station/security/prison/mess) -"xWG" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "xWM" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -85613,14 +85624,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) -"ylr" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/filingcabinet/white, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "ylz" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/neutral/warning, @@ -170646,8 +170649,8 @@ gjq sjb wQr wQr -abV -fDg +oFG +pZl wQr vSi vSi @@ -170900,7 +170903,7 @@ gjq gjq gjq gjq -pZW +dCI slh dhV lNH @@ -171420,7 +171423,7 @@ vRn rty lNH eMa -xoZ +xen wmT gDN bGn @@ -171677,7 +171680,7 @@ eOJ vAr bff lNH -jwD +xvt aOf yaD vvU @@ -171928,13 +171931,13 @@ gjq gjq gjq gjq -pZW +dCI tDU hcT bQA ajw wUP -xoZ +xen siI ksn lvT @@ -187358,7 +187361,7 @@ ugs ttb bjU bOO -oit +kHg wZr kwe gkT @@ -233329,7 +233332,7 @@ nrM oCO kxs lsi -rlA +cQp qnj qnj qnj @@ -235677,7 +235680,7 @@ utC utC utC qjQ -fNF +iwa axg qjQ utC @@ -235933,7 +235936,7 @@ kXr utC utC utC -edu +iGV iAu rLo qjQ @@ -237450,7 +237453,7 @@ tKI wBb tKI xua -xQw +wSL fOs dsf xjF @@ -237719,14 +237722,14 @@ erN xwp baf wiz -rKi +tnK iaF iaF iaF iaF ajw ajw -jhb +lQd pBE pBE uYc @@ -237980,7 +237983,7 @@ kXr xaF rUy smx -qMA +vXm gjP ajw ajw @@ -238229,10 +238232,10 @@ obQ ndk rbC kXr -xrI +qDn ttT sQa -xrI +qDn kXr kXr kXr @@ -238763,7 +238766,7 @@ pBE cZa hxE xUS -npe +unP utC utC ptf @@ -239020,7 +239023,7 @@ pBE iVA hxE aCh -npe +unP utC utC ptf @@ -239236,7 +239239,7 @@ sDl hDU dAQ fVU -dVe +wVJ hDU gpp aJA @@ -239257,7 +239260,7 @@ gLN rCC gLN rCC -oyE +jzL rCC dXh cHb @@ -239277,7 +239280,7 @@ fvx hxE hxE xFb -npe +unP utC utC ptf @@ -239515,7 +239518,7 @@ rCC aMd rCC jIg -nyU +aCC unO hkU hwF @@ -239523,10 +239526,10 @@ ljl kXA rLu nRq -pZp +mqp ajw eMa -npe +unP xZX hxE iVA @@ -239772,16 +239775,16 @@ lek jak nfd jIg -nyU -pzP -inC -pzP +aCC +sPs +tku +sPs gam qQo -aTJ -pzP +uiM +sPs tue -wBH +rTY lNG tue qjQ @@ -240029,7 +240032,7 @@ rgl wVF iBF guS -nyU +aCC vlL qxQ eBe @@ -240037,10 +240040,10 @@ hnC cah aSh ycQ -bJd +gdG lIy tBR -sMK +xVE pRj mAc pRj @@ -240294,8 +240297,8 @@ hnC nKr qmi cex -bJd -sGs +gdG +ell thK dnT pRj @@ -240539,7 +240542,7 @@ ozH bZg gst hYG -tUq +jYG dOw dOw yhe @@ -240551,7 +240554,7 @@ sve qmi cXc fhw -bJd +gdG lzt cQh pyc @@ -240808,7 +240811,7 @@ kGx rqJ rMr bgK -bJd +gdG iOS mYs fxn @@ -241054,15 +241057,15 @@ tKZ gst rCC rCC -ovl -ucL -ovl +biK +rtO +biK rCC sOn -sIf -iwt -exy -sIf +jjF +hlu +laI +jjF sOn sOn tue @@ -245449,7 +245452,7 @@ pvg nQW vsz fdy -fmn +qYN wHX nbi qzu @@ -245913,7 +245916,7 @@ gtB tny dLo ctj -gXi +lNs wYZ aKI peq @@ -246953,11 +246956,11 @@ nfk utR tmQ qnV -fAO +xzs cEv lhv iGH -ylr +bGm ybv ybv ybv @@ -247172,7 +247175,7 @@ xmO deY bUx kdT -aYI +tHa syN cAC mWM @@ -247728,7 +247731,7 @@ qWZ ydk tGF iUT -daw +nBT lpM rCD uEm @@ -248203,7 +248206,7 @@ bqx xQG ykw mfH -cIY +uvB mfH mfH lHL @@ -248289,7 +248292,7 @@ gJN ckX iub inn -jtu +nUS vfU pdV gyR @@ -248521,7 +248524,7 @@ frN mhQ pzb iuv -edI +lOT cvS ewi cvS @@ -248972,7 +248975,7 @@ wbG kkl dhU xQG -olY +iWU hQi rRM mFQ @@ -249002,7 +249005,7 @@ pBs eYF sNj fKR -xpD +mmg uja ise iuv @@ -249259,7 +249262,7 @@ pBs uja uja uja -xpD +mmg uja wJk iuv @@ -249515,8 +249518,8 @@ oiz pBs uja kDz -mBm -lUp +hIT +eRk uja uPT poL @@ -249773,7 +249776,7 @@ kqP uja uja uja -xpD +mmg uja ehq kOq @@ -250029,8 +250032,8 @@ aJi eCT uja oUO -msG -xWG +kHO +mQi uja kyL hNU @@ -250788,7 +250791,7 @@ ugA hNp tFI eHb -qYE +xqh bdp nmH tiI @@ -253646,7 +253649,7 @@ qbG onP jyp hgh -iyf +oID xxg ehU uau @@ -254931,7 +254934,7 @@ nOj vwO gnT hgh -xMC +xcc mTS obu mjI @@ -255186,7 +255189,7 @@ cpY lkr lso vwO -qsP +kWn nKa dqO icA @@ -255468,7 +255471,7 @@ iyK uzr qQp qQp -wjD +qfb rZm sOO lRD @@ -258270,7 +258273,7 @@ kKL kdF qGV hUx -oyt +fTc sZF sZF sZF @@ -262664,7 +262667,7 @@ via aYJ lAw aYJ -poY +iWL wib eLr hAm @@ -265724,7 +265727,7 @@ xBU iVU iFX qRr -bML +kGW omh wDr elw diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5f91cb1e676..e910d6ac3eb 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1441,6 +1441,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"aBS" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "aBW" = ( /obj/machinery/button/ignition/incinerator/atmos, /turf/closed/wall/r_wall, @@ -6277,13 +6284,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) -"cmp" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "cmy" = ( /obj/machinery/door/airlock{ id_tag = "Toilet1"; @@ -8422,17 +8422,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"cYs" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "cYx" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -11128,25 +11117,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) -"dUE" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 5; - pixel_y = 14 - }, -/obj/item/folder/white{ - pixel_x = 6; - pixel_y = -1 - }, -/obj/item/paper_bin/carbon{ - pixel_x = -5; - pixel_y = 1 - }, -/obj/item/pen{ - pixel_x = -5 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "dVb" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -20826,25 +20796,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"hlg" = ( -/obj/structure/safe/vault, -/obj/item/storage/briefcase/secure/riches, -/obj/item/storage/backpack/duffelbag/syndie/hitman, -/obj/item/card/id/advanced/silver/reaper, -/obj/item/lazarus_injector, -/obj/item/gun/energy/disabler, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/speedloader/c357, -/obj/item/clothing/neck/stethoscope, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "hlj" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv{ @@ -23717,6 +23668,25 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ikS" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 5; + pixel_y = 14 + }, +/obj/item/folder/white{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/paper_bin/carbon{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/pen{ + pixel_x = -5 + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) "ikY" = ( /obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating, @@ -23876,21 +23846,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"inl" = ( -/obj/structure/noticeboard/directional/south, -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/button/curtain{ - pixel_x = -7; - pixel_y = -23; - id = "psychology_curtains"; - name = "psychology curtains button" - }, -/obj/machinery/computer/records/medical/laptop{ - dir = 1 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "inw" = ( /obj/machinery/disposal/bin{ desc = "A pneumatic waste disposal unit. This one leads into space!"; @@ -25402,6 +25357,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, /area/space/nearstation) +"iNo" = ( +/obj/structure/filingcabinet/white, +/obj/machinery/camera/directional/south{ + c_tag = "Medbay Psychology Office"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/siding/wood, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "iNB" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/glass, @@ -26564,16 +26529,6 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/iron/dark, /area/station/service/cafeteria) -"jgn" = ( -/obj/structure/filingcabinet/white, -/obj/machinery/camera/directional/south{ - c_tag = "Medbay Psychology Office"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/siding/wood, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "jgt" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -30889,6 +30844,13 @@ "kCZ" = ( /turf/closed/wall, /area/station/service/hydroponics) +"kDa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kDb" = ( /obj/structure/chair/office/light{ dir = 1 @@ -31241,6 +31203,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"kKh" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/sign/poster/official/help_others/directional/south, +/obj/structure/sign/departments/psychology/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kKk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40573,13 +40547,6 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"nWB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/machinery/camera/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "nWS" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/basic, @@ -41399,6 +41366,12 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"onv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "onD" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -43356,6 +43329,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"oXK" = ( +/obj/structure/safe/vault, +/obj/item/storage/briefcase/secure/riches, +/obj/item/storage/backpack/duffelbag/syndie/hitman, +/obj/item/card/id/advanced/silver/reaper, +/obj/item/lazarus_injector, +/obj/item/gun/energy/disabler, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/speedloader/c357, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "oXL" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -53819,12 +53811,6 @@ }, /turf/open/floor/iron, /area/station/security/holding_cell) -"sBR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "sBS" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -54141,6 +54127,17 @@ }, /turf/open/floor/iron, /area/station/service/kitchen) +"sFY" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sGm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -55636,6 +55633,21 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"tgC" = ( +/obj/structure/noticeboard/directional/south, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/button/curtain{ + pixel_x = -7; + pixel_y = -23; + id = "psychology_curtains"; + name = "psychology curtains button" + }, +/obj/machinery/computer/records/medical/laptop{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "tgD" = ( /obj/structure/table/glass, /obj/item/clothing/gloves/latex, @@ -56673,18 +56685,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tzI" = ( -/obj/structure/table/reinforced, -/obj/item/emergency_bed, -/obj/item/emergency_bed{ - pixel_y = 3 - }, -/obj/item/emergency_bed{ - pixel_y = 6 - }, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/office) "tzJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59462,6 +59462,14 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"uvq" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain/cloth/fancy/mechanical{ + name = "Psychology Curtains"; + id = "psychology_curtains" + }, +/turf/open/floor/plating, +/area/station/medical/psychology) "uvw" = ( /obj/machinery/status_display/supply{ pixel_y = 32 @@ -60680,18 +60688,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"uPR" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/sign/poster/official/help_others/directional/south, -/obj/structure/sign/departments/psychology/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "uQe" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61913,6 +61909,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"vks" = ( +/obj/structure/table/reinforced, +/obj/item/emergency_bed, +/obj/item/emergency_bed{ + pixel_y = 3 + }, +/obj/item/emergency_bed{ + pixel_y = 6 + }, +/obj/structure/window/spawner/directional/west, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/office) "vkD" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68282,14 +68291,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"xru" = ( -/obj/effect/spawner/structure/window, -/obj/structure/curtain/cloth/fancy/mechanical{ - name = "Psychology Curtains"; - id = "psychology_curtains" - }, -/turf/open/floor/plating, -/area/station/medical/psychology) "xrv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -92488,7 +92489,7 @@ yiJ sfA eQO xjI -jgn +iNo tSw tAH nwT @@ -92659,7 +92660,7 @@ rlU vis dhz ixT -hlg +oXK rlU aaa aEH @@ -92745,7 +92746,7 @@ vAX sfA dvn qkJ -inl +tgC tSw tAH ifQ @@ -92998,7 +92999,7 @@ ngl ngl ngl uYp -dUE +ikS cnc igP sjx @@ -93255,8 +93256,8 @@ dZy kTO gdL fEK -xru -xru +uvq +uvq cMX rOF tSw @@ -93511,11 +93512,11 @@ ePg eMI jfN eMI -cmp -sBR -cYs +kDa +onv +sFY xar -uPR +kKh tSw koq swP @@ -94256,7 +94257,7 @@ ehE rlw bTm ylf -tzI +vks bMY uET iZF @@ -94282,7 +94283,7 @@ oNy bqX bqX bqX -nWB +aBS nmQ qZa aec diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm index 82eda8b9e7a..e4851944078 100644 --- a/_maps/map_files/NebulaStation/NebulaStation.dmm +++ b/_maps/map_files/NebulaStation/NebulaStation.dmm @@ -43662,6 +43662,7 @@ }, /obj/structure/railing, /obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/east, /turf/open/floor/iron/dark, /area/station/medical/storage) "gwJ" = ( @@ -54073,6 +54074,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, /area/station/security/breakroom) "hXH" = ( diff --git a/_maps/map_files/debug/runtimestation_minimal.dmm b/_maps/map_files/debug/runtimestation_minimal.dmm new file mode 100644 index 00000000000..d2d961cc8da --- /dev/null +++ b/_maps/map_files/debug/runtimestation_minimal.dmm @@ -0,0 +1,1229 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"w" = ( +/turf/open/space/basic, +/area/station/commons/storage/primary) + +(1,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(2,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(3,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(4,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(5,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(6,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(7,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(8,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(9,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(10,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(11,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(12,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(13,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(14,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(15,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(16,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(17,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(18,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(19,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(20,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(21,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(22,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(23,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(24,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(25,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(26,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(27,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(28,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(29,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(30,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(31,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(32,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(33,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} +(34,1,1) = {" +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +"} diff --git a/_maps/map_files/generic/CentCom_minimal.dmm b/_maps/map_files/generic/CentCom_minimal.dmm new file mode 100644 index 00000000000..bab075b8627 --- /dev/null +++ b/_maps/map_files/generic/CentCom_minimal.dmm @@ -0,0 +1,570 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"g" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"h" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/control) +"x" = ( +/obj/effect/landmark/error, +/turf/open/floor/iron, +/area/centcom/central_command_areas/control) +"A" = ( +/turf/cordon, +/area/space) +"G" = ( +/turf/closed/indestructible/splashscreen, +/area/space) +"W" = ( +/obj/effect/landmark/start/new_player, +/turf/cordon, +/area/space) + +(1,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +G +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +"} +(2,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(3,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(4,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(5,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +g +a +a +a +a +a +a +h +"} +(6,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(7,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(8,1,1) = {" +A +A +A +A +A +A +A +W +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(9,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +g +a +a +a +g +x +a +a +g +a +a +h +"} +(10,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(11,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(12,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(13,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +g +a +a +a +a +a +a +h +"} +(14,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(15,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(16,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +a +a +a +a +a +a +a +a +a +a +a +a +a +h +"} +(17,1,1) = {" +A +A +A +A +A +A +A +A +A +A +A +A +A +A +A +h +h +h +h +h +h +h +h +h +h +h +h +h +h +h +"} diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 2ecb34e6d63..1da2b58460f 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -4822,21 +4822,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) -"aIF" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/arrows/red{ - pixel_y = 15 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "aIH" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -5086,6 +5071,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) +"aKZ" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "aLd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -7812,6 +7804,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/office) +"bHP" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/build/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "bIf" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9586,14 +9588,6 @@ "cjT" = ( /turf/open/floor/iron/white, /area/station/medical/chemistry) -"cjU" = ( -/obj/effect/turf_decal/siding/thinplating/dark, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "ckb" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -10954,16 +10948,6 @@ /obj/structure/railing, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"cIi" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/sign/poster/official/build/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "cIm" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/bot, @@ -15575,13 +15559,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"enR" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "eor" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -17782,6 +17759,18 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"ffh" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "ffL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20174,12 +20163,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/catwalk_floor, /area/station/maintenance/solars/starboard/fore) -"fYU" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "fYW" = ( /obj/structure/grille, /obj/structure/lattice, @@ -27547,18 +27530,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"iOb" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "iOc" = ( /obj/machinery/stasis{ dir = 8 @@ -29292,6 +29263,21 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"jrc" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/arrows/red{ + pixel_y = 15 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "jrg" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, @@ -36735,6 +36721,17 @@ }, /turf/open/openspace, /area/station/hallway/secondary/exit) +"lIS" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/escapepodbay) "lIZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ @@ -37870,17 +37867,6 @@ /obj/machinery/door/window/right/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"mbU" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/escapepodbay) "mbX" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -38124,21 +38110,6 @@ }, /turf/open/floor/iron/freezer, /area/station/science/lower) -"mga" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/obj/machinery/requests_console/directional/east{ - name = "Atmospherics Requests Console"; - department = "Atmospherics" - }, -/obj/machinery/camera/emp_proof{ - dir = 6; - network = list("ss13","engineering"); - c_tag = "Engineering - Atmospherics Front Desk" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mgh" = ( /obj/structure/sign/clock/directional/north, /turf/open/openspace, @@ -39778,16 +39749,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"mMn" = ( -/obj/structure/closet/secure_closet/medical3, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/item/storage/belt/medical, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "mMK" = ( /obj/structure/cable, /obj/effect/turf_decal/sand/plating, @@ -42149,6 +42110,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"nGZ" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "nHi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -42990,16 +42959,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) -"nWj" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/bridge) "nWu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -43409,17 +43368,6 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) -"odi" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/camera/emp_proof{ - dir = 9; - network = list("ss13","engineering"); - c_tag = "Engineering - Atmospherics Incinerator ACcess" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "odr" = ( /obj/structure/railing{ dir = 4 @@ -43992,14 +43940,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) -"ooI" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/structure/sign/calendar/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "ooV" = ( /obj/effect/turf_decal/trimline/tram/filled/corner{ dir = 4 @@ -47655,15 +47595,6 @@ /obj/machinery/light/floor, /turf/open/floor/grass, /area/station/science/lower) -"pHz" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "pHX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1 @@ -48798,6 +48729,14 @@ /obj/structure/sign/clock/directional/west, /turf/open/floor/iron, /area/station/security/courtroom) +"qcw" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/structure/sign/calendar/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "qcG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/iron/smooth, @@ -52451,12 +52390,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"rpB" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron, -/area/station/security/checkpoint/arrivals) "rpJ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -52548,6 +52481,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"rrJ" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/storage/belt/medical, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "rrL" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -53108,6 +53052,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"rDu" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "rDI" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 1 @@ -55864,6 +55814,12 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) +"sAc" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron, +/area/station/security/checkpoint/arrivals) "sAd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -57349,12 +57305,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/ce) -"tcV" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) "tda" = ( /obj/structure/chair{ dir = 4 @@ -57531,13 +57481,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"tgi" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "tgj" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -60079,15 +60022,6 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"tZo" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/sign/clock/directional/north, -/obj/structure/closet/secure_closet/security/engine, -/obj/item/clothing/mask/whistle, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) "tZO" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ dir = 8 @@ -60126,6 +60060,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"uba" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ubd" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -60743,6 +60686,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"ukE" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/bridge) "ukS" = ( /obj/structure/table/reinforced, /obj/item/surgical_drapes, @@ -62977,6 +62930,15 @@ /obj/item/key/janitor, /turf/open/floor/iron, /area/station/service/janitor) +"uUs" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/sign/clock/directional/north, +/obj/structure/closet/secure_closet/security/engine, +/obj/item/clothing/mask/whistle, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "uUB" = ( /obj/docking_port/stationary{ name = "port bay 2"; @@ -68256,6 +68218,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/checker, /area/station/commons/lounge) +"wLx" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) "wLP" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -68364,6 +68332,21 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white/side, /area/station/science/lobby) +"wNY" = ( +/obj/machinery/computer/station_alert{ + dir = 8 + }, +/obj/machinery/requests_console/directional/east{ + name = "Atmospherics Requests Console"; + department = "Atmospherics" + }, +/obj/machinery/camera/emp_proof{ + dir = 6; + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Front Desk" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wOb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -70108,6 +70091,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xzn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) "xzo" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -72069,6 +72059,17 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/courtroom) +"ykm" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/camera/emp_proof{ + dir = 9; + network = list("ss13","engineering"); + c_tag = "Engineering - Atmospherics Incinerator ACcess" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ykN" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 8 @@ -86436,7 +86437,7 @@ adp adA adB fIV -mbU +lIS adF adK yiI @@ -101873,7 +101874,7 @@ vfR pkp kis cFh -cIi +bHP pLH uGy xjn @@ -104455,7 +104456,7 @@ bAK jsW vTc yfe -ooI +qcw sHH bXp qHs @@ -105216,8 +105217,8 @@ gYI bbj bbj roB -tZo -enR +uUs +xzn roB lUe vSL @@ -107261,7 +107262,7 @@ vNu eAN ake twr -mga +wNY xfx xaT shQ @@ -109345,7 +109346,7 @@ qTR mDC tnq hZr -odi +ykm gWu hZr aaa @@ -121458,7 +121459,7 @@ jFM aPV xvl diy -tcV +wLx sEV xvl xhB @@ -152478,7 +152479,7 @@ wHT twz twz vhv -pHz +uba yjN yjN rWB @@ -156602,7 +156603,7 @@ pyf fXY iRQ hHY -rpB +sAc fSr pkq urK @@ -156841,7 +156842,7 @@ qvK obW uvu aCC -nWj +ukE hhc esf lPY @@ -156867,7 +156868,7 @@ mXY mOt tdR qOF -tgi +aKZ gsO aLi aLQ @@ -165346,7 +165347,7 @@ xBk xBk xBk xBk -mMn +rrJ bbk yeN kRL @@ -188199,7 +188200,7 @@ noI kOf aDN wzg -iOb +ffh qFH tIk aGb @@ -188971,7 +188972,7 @@ fam aDN wzg tiM -fYU +rDu nQq qSm sJx @@ -189228,7 +189229,7 @@ krq eIS vQX dJp -aIF +jrc fio qSm bYa @@ -189752,7 +189753,7 @@ qSm eQs qSm orX -cjU +nGZ fmy aac aac diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 586d6f4bbde..bcbbf9bdaa3 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -4588,6 +4588,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/red_alert_access, /turf/open/floor/iron/dark, /area/station/security/lockers) "bDy" = ( @@ -23684,7 +23685,7 @@ /area/station/maintenance/department/science) "ikc" = ( /obj/structure/closet/crate/secure/loot{ - codelen = 2; + code_length = 2; name = "malfunctioning abandoned crate" }, /turf/open/misc/asteroid, @@ -53739,6 +53740,7 @@ /obj/item/wheelchair{ pixel_y = 3 }, +/obj/structure/fireaxecabinet/jawsofrecovery/directional/west, /turf/open/floor/iron/white/textured, /area/station/medical/paramedic) "stw" = ( diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index af3ffa35212..ba9b83d5dc7 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -5,8 +5,8 @@ "map_file": "multiz.dmm", "ignored_unit_tests": [ "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/spy_bounty" ], "traits": [ diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json index 12f854ce425..715d924d5af 100644 --- a/_maps/runtimestation.json +++ b/_maps/runtimestation.json @@ -6,8 +6,8 @@ "space_ruin_levels": 1, "ignored_unit_tests": [ "/datum/unit_test/cargo_dep_order_locations", - "/datum/unit_test/job_roundstart_spawnpoints", - "/datum/unit_test/required_map_items", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", "/datum/unit_test/spy_bounty" ], "shuttles": { diff --git a/_maps/runtimestation_minimal.json b/_maps/runtimestation_minimal.json new file mode 100644 index 00000000000..d638519ef91 --- /dev/null +++ b/_maps/runtimestation_minimal.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "map_name": "Minimal Runtime Station", + "map_path": "map_files/debug", + "map_file": "runtimestation_minimal.dmm", + "space_ruin_levels": 1, + "ignored_unit_tests": [ + "/datum/unit_test/cargo_dep_order_locations", + "/datum/unit_test/maptest_job_roundstart_spawnpoints", + "/datum/unit_test/maptest_required_map_items", + "/datum/unit_test/spy_bounty", + "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/nuke_cinematic", + "/datum/unit_test/atmospherics_sanity", + "/datum/unit_test/maptest_mapload_space_verification", + "/datum/unit_test/modify_fantasy_variable", + "/datum/unit_test/create_and_destroy" + ] +} diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index b0b75da383a..6cb862f7fb6 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -458,12 +458,10 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "fa" = ( -/obj/structure/chair/comfy/shuttle{ +/obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/obj/machinery/light/directional/east, +/obj/structure/chair/comfy/shuttle, /turf/open/floor/iron/dark, /area/shuttle/escape) "iy" = ( diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index e357077f888..30452f41e5c 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -532,9 +532,9 @@ /area/centcom/central_command_areas/holding) "ni" = ( /obj/structure/rack, -/obj/item/nullrod/claymore/saber/red{ +/obj/item/melee/energy/sword/nullrod/red{ damtype = "stamina"; - force = 30 + active_force = 30 }, /obj/item/nullrod/claymore/katana{ damtype = "stamina"; @@ -898,9 +898,9 @@ /area/centcom/central_command_areas/holding) "vr" = ( /obj/structure/rack, -/obj/item/nullrod/claymore/saber{ +/obj/item/melee/energy/sword/nullrod{ damtype = "stamina"; - force = 30; + active_force = 30; pixel_x = 5; pixel_y = -3 }, diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 7a32eef0659..e0e93c7b59f 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -57,7 +57,7 @@ #define FEATURE_MUTANT_COLOR "mcolor" #define FEATURE_ETHEREAL_COLOR "ethcolor" #define FEATURE_EARS "ears" -#define FEATURE_TAIL "tail_cat" +#define FEATURE_TAIL_CAT "tail_cat" #define FEATURE_TAIL_LIZARD "tail_lizard" #define FEATURE_TAIL_FISH "fish_tail" #define FEATURE_SNOUT "snout" diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 52178bbcb98..edf7deb28fd 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -37,29 +37,27 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ALLOW_DARK_PAINTS_1 (1<<8) /// Should this object be unpaintable? #define UNPAINTABLE_1 (1<<9) -/// Is this atom on top of another atom, and as such has click priority? -#define IS_ONTOP_1 (1<<10) /// Is this atom immune to being dusted by the supermatter? -#define SUPERMATTER_IGNORES_1 (1<<11) +#define SUPERMATTER_IGNORES_1 (1<<10) /// If a turf can be made dirty at roundstart. This is also used in areas. -#define CAN_BE_DIRTY_1 (1<<12) +#define CAN_BE_DIRTY_1 (1<<11) /// Should we use the initial icon for display? Mostly used by overlay only objects -#define HTML_USE_INITAL_ICON_1 (1<<13) +#define HTML_USE_INITAL_ICON_1 (1<<12) /// Can players recolor this in-game via vendors (and maybe more if support is added)? -#define IS_PLAYER_COLORABLE_1 (1<<14) +#define IS_PLAYER_COLORABLE_1 (1<<13) /// Whether or not this atom has contextual screentips when hovered OVER -#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<15) +#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<14) /// Whether or not this atom is storing contents for a disassociated storage object -#define HAS_DISASSOCIATED_STORAGE_1 (1<<16) +#define HAS_DISASSOCIATED_STORAGE_1 (1<<15) /// If this atom has experienced a decal element "init finished" sourced appearance update /// We use this to ensure stacked decals don't double up appearance updates for no reason /// Flag as an optimization, don't make this a trait without profiling /// Yes I know this is a stupid flag, no you can't take him from me -#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<17) +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<16) /// This atom always returns its turf in get_turf_pixel instead of the turf from its offsets -#define IGNORE_TURF_PIXEL_OFFSET_1 (1<<18) +#define IGNORE_TURF_PIXEL_OFFSET_1 (1<<17) /// This atom does not need to generate its own preview icon for GAGS -#define NO_NEW_GAGS_PREVIEW_1 (1<<19) +#define NO_NEW_GAGS_PREVIEW_1 (1<<18) //BUBBER EDIT START - Flags //Does item send log notices to admin log when consumed by supermatter? diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index c07a3956b34..14ba27879bb 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -101,15 +101,53 @@ #define HKT_NEXT "next" #define HKT_BAN "ban" #define HKT_DEPTH "depth" +#define HKT_PURCHASED_DEPTH "purchased_depth" #define HKT_ROUTE "route" #define HKT_UI_BGR "ui_bgr" +#define HKT_COST "cost" +#define HKT_CATEGORY "category" +/// Only present for already researched knowledge. +#define HKT_INSTANCE "instance" +/// unique identifier most commonly used for identifying what knowledge is researchable +#define HKT_ID "id" +#define BGR_SIDE "node_side" + +#define MAGIC_RESISTANCE_MOON (MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND) /// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart. #define HERETIC_NO_HEART_ORGAN -1 #define HERETIC_NO_LIVING_HEART 0 #define HERETIC_HAS_LIVING_HEART 1 +#define HERETIC_DRAFT_TIER_MAX 5 + +/// The default drain speed for heretic rift's, anything below this will be considered a fast drain, and be very noticeable and cause a overlay +#define HERETIC_RIFT_DEFAULT_DRAIN_SPEED 10 SECONDS + +/// Sources of knowledge purchased for heretics, used for positioning in the UI +#define HERETIC_KNOWLEDGE_TREE "tree" +#define HERETIC_KNOWLEDGE_SHOP "shop" +#define HERETIC_KNOWLEDGE_DRAFT "draft" +#define HERETIC_KNOWLEDGE_START "start" + +/// defines for the depths of the heretic knowledge tree nodes +#define HKT_DEPTH_START 2 +#define HKT_DEPTH_TIER_1 3 +#define HKT_DEPTH_DRAFT_1 4 +#define HKT_DEPTH_TIER_2 5 +#define HKT_DEPTH_DRAFT_2 6 +#define HKT_DEPTH_ROBES 7 +#define HKT_DEPTH_TIER_3 8 +#define HKT_DEPTH_DRAFT_3 9 +#define HKT_DEPTH_ARMOR 10 +#define HKT_DEPTH_TIER_4 11 +#define HKT_DEPTH_DRAFT_4 12 +#define HKT_DEPTH_ASCENSION 13 + +#define HERETIC_CAN_ASCEND "can_ascend" + + /// A define used in ritual priority for heretics. #define MAX_KNOWLEDGE_PRIORITY 100 diff --git a/code/__DEFINES/dcs/declarations.dm b/code/__DEFINES/dcs/declarations.dm index f5be9fbc6d3..d6517601a35 100644 --- a/code/__DEFINES/dcs/declarations.dm +++ b/code/__DEFINES/dcs/declarations.dm @@ -68,6 +68,7 @@ #define CALTROP_SILENT (1 << 2) #define CALTROP_NOSTUN (1 << 3) #define CALTROP_NOCRAWL (1 << 4) +#define CALTROP_ANTS (1 << 5) //Ingredient type in datum/component/ingredients_holder #define CUSTOM_INGREDIENT_TYPE_EDIBLE 1 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index bf1f2eff3ab..0219f795c32 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -72,3 +72,10 @@ /// Called on the atom being hit, from /datum/component/anti_magic/on_attack() : (obj/item/weapon, mob/user, antimagic_flags) #define COMSIG_ATOM_HOLYATTACK "atom_holyattacked" + +/// Called from [/mob/living/proc/send_item_attack_message()]: (obj/item/weapon, /mob/living/victim, mob/living/attacker) +#define COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT "send_item_attack_message_object" +/// Called from [/mob/living/proc/send_item_attack_message()]: (mob/living/victim, obj/item/weapon, mob/living/user) +#define COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON "send_item_attack_message_carbon" + /// Return value if the hitby messages are changed. + #define SIGNAL_MESSAGE_MODIFIED (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 522a5b72f55..3ca26908e24 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -76,9 +76,6 @@ #define COMSIG_ATOM_BUMPED "atom_bumped" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) #define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" -///from internal loop in atom/movable/proc/CanReach(): (list/next) -#define COMSIG_ATOM_CANREACH "atom_can_reach" - #define COMPONENT_ALLOW_REACH (1<<0) ///for when an atom has been created through processing (atom/original_atom, list/chosen_processing_option) #define COMSIG_ATOM_CREATEDBY_PROCESSING "atom_createdby_processing" ///when an atom is processed (mob/living/user, obj/item/process_item, list/atom/results) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 0b732912726..48d1c6f9a04 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -14,7 +14,7 @@ #define COMSIG_ATOM_EMP_ACT "atom_emp_act" ///from base of atom/fire_act(): (exposed_temperature, exposed_volume) #define COMSIG_ATOM_FIRE_ACT "atom_fire_act" -///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked) +///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit) #define COMSIG_ATOM_PRE_BULLET_ACT "pre_atom_bullet_act" /// All this does is prevent default bullet on_hit from being called, [BULLET_ACT_HIT] being return is implied #define COMPONENT_BULLET_ACTED (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_food.dm b/code/__DEFINES/dcs/signals/signals_food.dm index 1ab582428b7..0041076802c 100644 --- a/code/__DEFINES/dcs/signals/signals_food.dm +++ b/code/__DEFINES/dcs/signals/signals_food.dm @@ -2,6 +2,8 @@ //Food // Eating stuff +/// From datum/component/edible/proc/TakeBite: (atom/owner) +#define COMSIG_LIVING_EAT_FOOD "food_bit" /// From datum/component/edible/proc/TakeBite: (mob/living/eater, mob/feeder, bitecount, bitesize) #define COMSIG_FOOD_EATEN "food_eaten" #define DESTROY_FOOD (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_heretic.dm b/code/__DEFINES/dcs/signals/signals_heretic.dm index fb76b312316..14fe7a51e53 100644 --- a/code/__DEFINES/dcs/signals/signals_heretic.dm +++ b/code/__DEFINES/dcs/signals/signals_heretic.dm @@ -16,3 +16,11 @@ /// For [/datum/status_effect/protective_blades] to signal when it is triggered #define COMSIG_BLADE_BARRIER_TRIGGERED "blade_barrier_triggered" + +/// at the end of determine_drafted_knowledge +#define COMSIG_HERETIC_SHOP_SETUP "heretic_shop_finished" + +/// called on the antagonist datum, upgrades the passive to level 2 +#define COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST "heretic_passive_upgrade_first" +/// called on the antagonist datum, upgrades the passive to level 3 +#define COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL "heretic_passive_upgrade_final" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 914bc73a355..e57699a34a9 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -16,10 +16,15 @@ #define COMSIG_ORGAN_SURGICALLY_INSERTED "organ_surgically_inserted" /// Called when an organ finishes inserting into a bodypart (obj/item/bodypart/limb, movement_flags) #define COMSIG_ORGAN_BODYPART_INSERTED "organ_bodypart_inserted" +/// Called when a organ's damage is adjusted apply_organ_damage (damage_amount, maximum, required_organ_flag) +#define COMSIG_ORGAN_ADJUST_DAMAGE "organ_adjust_damage" ///Called when movement intent is toggled. #define COMSIG_MOVE_INTENT_TOGGLED "move_intent_toggled" +/// Called when combat mode is toggled. +#define COMSIG_COMBAT_MODE_TOGGLED "combat_mode_toggled" + ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 0b75f01a07d..cabe8a2fcab 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -1,6 +1,3 @@ -///Called on user, from base of /datum/strippable_item/perform_alternate_action() (atom/target, action_key) -#define COMSIG_TRY_ALT_ACTION "try_alt_action" - #define COMPONENT_CANT_ALT_ACTION (1<<0) ///Called on /basic when updating its speed, from base of /mob/living/basic/update_basic_mob_varspeed(): () #define POST_BASIC_MOB_UPDATE_VARSPEED "post_basic_mob_update_varspeed" ///from base of /mob/Login(): () @@ -229,12 +226,12 @@ ///from living/flash_act(), when a mob is successfully flashed. #define COMSIG_MOB_FLASHED "mob_flashed" -/// from /obj/item/assembly/flash/flash_carbon, to the mob being flashed +/// from /obj/item/assembly/flash/flash_mob, to the mob being flashed #define COMSIG_MOB_FLASH_OVERRIDE_CHECK "mob_flash_override_check" /// Has the flash effect been overridden? #define FLASH_OVERRIDDEN (1<<0) /// from /obj/item/assembly/flash/flash_carbon, to the mob flashing another carbon -#define COMSIG_MOB_PRE_FLASHED_CARBON "mob_pre_flashed_carbon" +#define COMSIG_MOB_PRE_FLASHED_MOB "mob_pre_flashed_mob" /// Return to override deviation to be full deviation (fail the flash, usually) #define DEVIATION_OVERRIDE_FULL (1<<0) /// Return to override deviation to be partial deviation @@ -243,9 +240,9 @@ #define DEVIATION_OVERRIDE_NONE (1<<2) /// Return to stop the flash entirely #define STOP_FLASH (1<<3) -/// from /obj/item/assembly/flash/flash_carbon, to the mob flashing another carbon +/// from /obj/item/assembly/flash/flash_mob, to the mob flashing another carbon /// (mob/living/carbon/flashed, obj/item/assembly/flash/flash, deviation (from code/__DEFINES/mobs.dm)) -#define COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON "mob_success_flashed_carbon" +#define COMSIG_MOB_SUCCESSFUL_FLASHED_MOB "mob_success_flashed_mob" /// from mob/get_status_tab_items(): (list/items) #define COMSIG_MOB_GET_STATUS_TAB_ITEMS "mob_get_status_tab_items" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index d09d74c5098..8c221d28d1d 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -17,6 +17,9 @@ #define COMSIG_LIONHUNTER_ON_HIT "lionhunter_on_hit" +/// from /datum/component/subtype_picker/pick_subtype(): (obj/item/old_item, mob/picker) +#define COMSIG_ITEM_SUBTYPE_PICKER_SELECTED "item_subtype_picker_selected" + // /obj/machinery signals ///from /obj/machinery/atom_break(damage_flag): (damage_flag) @@ -145,6 +148,8 @@ #define COMSIG_ITEM_DRIED "item_dried" ///from base of obj/item/dropped(): (mob/user) #define COMSIG_ITEM_DROPPED "item_drop" +///a mob has just dropped an item +#define COMSIG_MOB_DROPPED_ITEM "mob_dropped_item" ///from base of obj/item/pickup(): (/mob/taker) #define COMSIG_ITEM_PICKUP "item_pickup" ///from base of obj/item/on_outfit_equip(): (mob/equipper, visuals_only, slot) @@ -154,6 +159,19 @@ ///from base of datum/storage/handle_exit(): (datum/storage/storage) #define COMSIG_ITEM_UNSTORED "item_unstored" +/** + * From base of datum/strippable_item/get_alternate_actions(): (atom/owner, mob/user, list/alt_actions) + * As a side note, make sure the strippable item datum (the slot) in question doesn't have too many alternate actions already, + * as only up to three are supported at a time (as of september 2025), though, so far only the jumpsuit slot uses all three slots. + * + * Also make sure to code the alt action and add it to the StripMenu.tsx interface + */ +#define COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS "item_get_strippable_alt_actions" + +/// From base of datum/strippable_item/perform_alternate_action(): (atom/owner, mob/user, action_key) +#define COMSIG_ITEM_STRIPPABLE_ALT_ACTION "item_strippable_alt_action" + #define COMPONENT_ALT_ACTION_DONE (1<<0) + ///from base of obj/item/apply_fantasy_bonuses(): (bonus) #define COMSIG_ITEM_APPLY_FANTASY_BONUSES "item_apply_fantasy_bonuses" ///from base of obj/item/remove_fantasy_bonuses(): (bonus) @@ -483,13 +501,17 @@ #define COMSIG_ITEM_ATTACK_SELF_SECONDARY "item_attack_self_secondary" ///from base of obj/item/attack_atom(): (/atom, /mob, list/modifiers) #define COMSIG_ITEM_ATTACK_ATOM "item_attack_atom" -///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers) +///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" +///from base of obj/item/pre_attack(): (obj/item/weapon, atom/target, list/modifiers, list/attack_modifiers) +#define COMSIG_USER_PRE_ITEM_ATTACK "user_pre_item_attack" /// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_PRE_ATTACK_SECONDARY "item_pre_attack_secondary" #define COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN (1<<0) #define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1) #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2) +///from base of obj/item/pre_attack_secondary(): (obj/item/weapon, atom/target, list/modifiers, list/attack_modifiers) +#define COMSIG_USER_PRE_ITEM_ATTACK_SECONDARY "user_pre_item_attack_secondary" /// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary" ///from base of [obj/item/attack()]: (atom/target, mob/user, proximity_flag, list/modifiers) @@ -518,7 +540,7 @@ #define COMSIG_SPEED_POTION_APPLIED "speed_potion" #define SPEED_POTION_STOP (1<<0) -/// from /obj/item/detective_scanner/scan(): (mob/user, list/extra_data) +/// from /obj/item/detective_scanner/scan(): (mob/user, datum/detective_scanner_log/entry) #define COMSIG_DETECTIVE_SCANNED "det_scanned" /// from /obj/plunger_act when an object is being plungered diff --git a/code/__DEFINES/dcs/signals/signals_status_effect.dm b/code/__DEFINES/dcs/signals/signals_status_effect.dm new file mode 100644 index 00000000000..917f5dffc9a --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_status_effect.dm @@ -0,0 +1,2 @@ +/// From /datum/status_effect/fire_handler/fire_stacks/tick() +#define COMSIG_FIRE_STACKS_UPDATED "fire_stacks_updated" diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm index 26459ab4dad..98fc7801850 100644 --- a/code/__DEFINES/dcs/signals/signals_storage.dm +++ b/code/__DEFINES/dcs/signals/signals_storage.dm @@ -5,6 +5,11 @@ /// Sent after dumping into some other storage object: (atom/dest_object, mob/user) #define COMSIG_STORAGE_DUMP_POST_TRANSFER "storage_dump_into_storage" +/// Sent before storing an item (obj/item/being_stored, mob/user, force, messages) +#define COMSIG_ATOM_PRE_STORED_ITEM "atom_pre_storing_item" + /// Return to block the item from being stored. + #define BLOCK_STORAGE_INSERT (1<<0) + /// Fired off the storage's PARENT when an ITEM is STORED INSIDE. (obj/item, mob, force) #define COMSIG_ATOM_STORED_ITEM "atom_storing_item" diff --git a/code/__DEFINES/dcs/signals/signals_tools.dm b/code/__DEFINES/dcs/signals/signals_tools.dm index 110db1ed89c..a3cc381b97e 100644 --- a/code/__DEFINES/dcs/signals/signals_tools.dm +++ b/code/__DEFINES/dcs/signals/signals_tools.dm @@ -5,3 +5,10 @@ #define COMSIG_TOOL_ATOM_ACTED_PRIMARY(tooltype) "tool_atom_acted_[tooltype]" ///Called from /atom/proc/tool_act (atom) #define COMSIG_TOOL_ATOM_ACTED_SECONDARY(tooltype) "tool_atom_acted_[tooltype]" + +//Called when a tool attempts to pry open an airlock. Called from /obj/machinery/door/airlock/try_to_crowbar +#define COMSIG_TOOL_FORCE_OPEN_AIRLOCK "tool_force_open_airlock" + //If this value is returned, prevents the airlock from being forced open. + #define COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN (1<<0) + //If this value is returned, it means the tool successfully opened the airlock without interruption + #define COMPONENT_TOOL_ALLOW_FORCE_OPEN (1<<1) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index a92c3f613eb..9a05d7faff7 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -19,8 +19,9 @@ //Inventory depth: limits how many nested storage items you can access directly. //1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc -#define INVENTORY_DEPTH 3 -#define STORAGE_VIEW_DEPTH 2 +#define REACH_DEPTH_SELF 1 +/// A storage depth ontop of SELF. REACH_DEPTH_STORAGE(1) would allow an item inside of a backpack you are carrying. +#define REACH_DEPTH_STORAGE(level) (level + REACH_DEPTH_SELF) //ITEM INVENTORY SLOT BITMASKS /// Suit slot (armors, costumes, space suits, etc.) @@ -317,6 +318,8 @@ GLOBAL_LIST_INIT(chaplain_suit_allowed, list( /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/bow/divine, /obj/item/gun/ballistic/revolver/chaplain, + /obj/item/toy/plush/carpplushie/nullrod, + /obj/item/melee/energy/sword/nullrod, )) //Allowed list for all mining suits diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 2655c5a90c3..35de08be1b1 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -175,6 +175,8 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list( #define is_simian(A) (isgorilla(A) || ismonkey(A)) +#define isstargazer(A) (istype(A, /mob/living/basic/heretic_summon/star_gazer)) + /// returns whether or not the atom is either a basic mob OR simple animal #define isanimal_or_basicmob(A) (istype(A, /mob/living/simple_animal) || istype(A, /mob/living/basic)) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 124c68f7cf4..004f990bcdf 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -41,8 +41,6 @@ #define ROLE_VOIDWALKER "Voidwalker" #define ROLE_SUNWALKER "Sunwalker" -// Latejoin roles -#define ROLE_HERETIC_SMUGGLER "Heretic Smuggler" #define ROLE_PROVOCATEUR "Provocateur" #define ROLE_STOWAWAY_CHANGELING "Stowaway Changeling" #define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator" diff --git a/code/__DEFINES/security.dm b/code/__DEFINES/security.dm index a385d843398..eb36b2d7092 100644 --- a/code/__DEFINES/security.dm +++ b/code/__DEFINES/security.dm @@ -1,6 +1,9 @@ // CATEGORY HEADERS +/// New `/datum/detective_scan_category` must be created when adding new `DETSCAN_CATEGORY`. +/// Macros are sorted by `/datum/detective_scan_category::display_order` + /// Fingerpints detected #define DETSCAN_CATEGORY_FINGERS "Prints" /// Displays any bloodprints found and their uefi @@ -8,37 +11,20 @@ /// Clothing and glove fibers #define DETSCAN_CATEGORY_FIBER "Fibers" /// Liquids detected -#define DETSCAN_CATEGORY_DRINK "Reagents" +#define DETSCAN_CATEGORY_REAGENTS "Reagents" /// ID Access #define DETSCAN_CATEGORY_ACCESS "ID Access" // The categories below do not have hard rules on what info is displayed, and are for categorizing info thematically. -/// Generic extra information category -#define DETSCAN_CATEGORY_NOTES "Additional Notes" -/// Attributes that might be illegal, but don't have ties to syndicate/aren't exclusively produced by them -#define DETSCAN_CATEGORY_ILLEGAL "Illegal Tech" -/// The emags and other in-house technology from the syndicate -#define DETSCAN_CATEGORY_SYNDIE "Syndicate Tech" -/// praise be -#define DETSCAN_CATEGORY_HOLY "Holy Data" /// The mode that the items in, what kind of item is dispensed, etc #define DETSCAN_CATEGORY_SETTINGS "Active Settings" - -// If your category is not in this list it WILL NOT BE DISPLAYED -/// defines the order categories are displayed, with the original categories, then custom ones, then finally the extra info. -#define DETSCAN_DEFAULT_ORDER(...) list(\ - DETSCAN_CATEGORY_FINGERS, \ - DETSCAN_CATEGORY_BLOOD, \ - DETSCAN_CATEGORY_FIBER, \ - DETSCAN_CATEGORY_DRINK, \ - DETSCAN_CATEGORY_ACCESS, \ - DETSCAN_CATEGORY_SETTINGS, \ - DETSCAN_CATEGORY_HOLY, \ - DETSCAN_CATEGORY_ILLEGAL, \ - DETSCAN_CATEGORY_SYNDIE, \ - DETSCAN_CATEGORY_NOTES, \ -) +/// praise be +#define DETSCAN_CATEGORY_HOLY "Holy Data" +/// Attributes that might be illegal, can also have ties to syndicate +#define DETSCAN_CATEGORY_ILLEGAL "Illegal Tech" +/// Generic extra information category +#define DETSCAN_CATEGORY_NOTES "Additional Notes" /// the order departments show up in for the id scan (its sorted by red to blue on the color wheel) #define DETSCAN_ACCESS_ORDER(...) list(\ diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 4d197d51faa..99b94835c42 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -96,6 +96,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EMOTEMUTE "emotemute" #define TRAIT_DEAF "deaf" #define TRAIT_FAT "fat" +/// If you are fat, you no longer get the slowdown from it +#define TRAIT_FAT_IGNORE_SLOWDOWN "fat_ignore_slowdown" /// Always hungry. They can eat as much as they want without eating slowdown. #define TRAIT_GLUTTON "glutton" #define TRAIT_HUSK "husk" @@ -180,6 +182,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NUKEIMMUNE "nuke_immunity" /// Can't be given viruses #define TRAIT_VIRUSIMMUNE "virus_immunity" +/// Stepping on ants wont cause damage +#define TRAIT_SPACE_ANT_IMMUNITY "space_ant_immunity" /// Won't become a husk under any circumstances #define TRAIT_UNHUSKABLE "trait_unhuskable" /// Reduces the chance viruses will spread to this mob, and if the mob has a virus, slows its advancement @@ -464,6 +468,14 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HALLUCINATION_IMMUNE "hallucination_immune" /// Increases chance of getting special traumas, makes them harder to cure #define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost" + +//---- Brain trauma resists +/// Unable to gain any brain trauma whatsoever +#define TRAIT_BRAIN_TRAUMA_IMMUNITY "brain_trauma_immunity" + +/// Prevents death from having too much brain damage +#define TRAIT_BRAIN_DAMAGE_NODEATH "brain_damage_nodeath" + #define TRAIT_SPACEWALK "spacewalk" /// Mobs with this trait still breathe gas in and out but aren't harmed by lacking any particular gas mix. (You can still be hurt by TOO MUCH of a specific gas). #define TRAIT_NO_BREATHLESS_DAMAGE "spacebreathing" @@ -648,6 +660,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_GUN_AKIMBO "no_gun_akimbo" /// Mobs with this trait cannot be hit by projectiles, meaning the projectiles will just go through. #define TRAIT_UNHITTABLE_BY_PROJECTILES "unhittable_by_projectiles" +/// Mobs with this trait can never be hit by laser projectiles, meaning the projectiles will just go through. +#define TRAIT_UNHITTABLE_BY_LASERS "unhittable_by_lasers" /// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations. #define TRAIT_MORBID "morbid" @@ -889,8 +903,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ROD_ATTRACT_SHINY_LOVERS "rod_attract_shiny_lovers" /// This rod can be used to fish on lava #define TRAIT_ROD_LAVA_USABLE "rod_lava_usable" -/// This rod was infused by a heretic, making it awesome and improving influence gain -#define TRAIT_ROD_MANSUS_INFUSED "rod_infused" /// Stuff that can go inside fish cases and aquariums #define TRAIT_AQUARIUM_CONTENT "aquarium_content" /// If the item can be used as a bit. @@ -939,10 +951,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_STRIP "no_strip" /// Disallows this item from being pricetagged with a barcode #define TRAIT_NO_BARCODES "no_barcode" -/// Allows heretics to cast their spells. -#define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" -/// Designates a heart as a living heart for a heretic. -#define TRAIT_LIVING_HEART "living_heart" /// Prevents the same person from being chosen multiple times for kidnapping objective #define TRAIT_HAS_BEEN_KIDNAPPED "has_been_kidnapped" /// An item still plays its hitsound even if it has 0 force, instead of the tap @@ -961,6 +969,24 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EXAMINE_SKIP "examine_skip" /// Objects with this trait cannot be repaired with duct tape #define TRAIT_DUCT_TAPE_UNREPAIRABLE "duct_tape_unrepairable" +/// An item is ALWAYS considered baseline reachable and will pipe into CanBeReached(). +#define TRAIT_SKIP_BASIC_REACH_CHECK "skip_basic_reach_check" + +//---- Heretic Traits +/// Hides the heretic overlay that outs them as the heretic +#define TRAIT_HERETIC_AURA_HIDDEN "heretic_aura_hidden" +/// This rod was infused by a heretic, making it awesome and improving influence gain +#define TRAIT_ROD_MANSUS_INFUSED "rod_infused" +/// Allows heretics to cast their spells. +#define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" +/// Designates a heart as a living heart for a heretic. +#define TRAIT_LIVING_HEART "living_heart" +/// Trait given to all participants in a heretic arena +#define TRAIT_ELDRITCH_ARENA_PARTICIPANT "eldritch_arena_participant" +/// Trait given to heretic summons, making them immune to heretic spells +#define TRAIT_HERETIC_SUMMON "heretic_summon" +/// Lock heretic grasp no longer goes on cooldown when opening things +#define TRAIT_LOCK_GRASP_UPGRADED "lock_grasp_upgraded" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -1393,9 +1419,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to anything linked to, not necessarily allied to, the mansus #define TRAIT_MANSUS_TOUCHED "mansus_touched" -/// Trait given to all participants in a heretic arena -#define TRAIT_ELDRITCH_ARENA_PARTICIPANT "eldritch_arena_participant" - // These traits are used in IS_X() as an OR, and is utilized for pseudoantags (such as deathmatch or domains) so they don't need to actually get antag status. // To specifically and only get the antag datum, GET_X() exists now. #define TRAIT_ACT_AS_CULTIST "act_as_cultist" @@ -1522,9 +1545,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///A trait given to users as a mutex to prevent repeated unresolved attempts to christen a shuttle #define TRAIT_ATTEMPTING_CHRISTENING "attempting_christening" -///Trait given to heretic summons, making them immune to heretic spells -#define TRAIT_HERETIC_SUMMON "heretic_summon" - ///trait given to mobs that are difficult to tame through mounting #define TRAIT_MOB_DIFFICULT_TO_MOUNT "difficult_to_mount" @@ -1576,4 +1596,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait specifying that an AI has a remote connection to an integrated circuit #define TRAIT_CONNECTED_TO_CIRCUIT "connected_to_circuit" +/// Mob is artificially spawned rather than being created through more natural means - applied to monkey cubes and such +#define TRAIT_SPAWNED_MOB "spawned_mob" + // END TRAIT DEFINES diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index ae0a1e24145..14bf919dc62 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -59,8 +59,6 @@ #define SHOES_TRAIT "shoes" /// Trait inherited by implants #define IMPLANT_TRAIT "implant" -/// Traits given by the heretic arena spell -#define HERETIC_ARENA_TRAIT "heretic_arena" #define GLASSES_TRAIT "glasses" /// inherited from riding vehicles #define VEHICLE_TRAIT "vehicle" @@ -104,9 +102,16 @@ /// Trait given by being recruited as a nuclear operative #define NUKE_OP_MINION_TRAIT "nuke-op-minion" +//---- Heretic Traits Sources +/// Traits given by the heretic arena spell +#define HERETIC_ARENA_TRAIT "heretic_arena" + /// Trait given to you by shapeshifting #define SHAPESHIFT_TRAIT "shapeshift_trait" +///From the cuffed_item status effect +#define CUFFED_ITEM_TRAIT "cuffed_item_trait" + // unique trait sources, still defines #define EMP_TRAIT "emp_trait" #define STATUE_MUTE "statue" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 41319ab7b9e..3f7010c80f2 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -89,6 +89,7 @@ #define RUST_RESISTANCE_REINFORCED 2 #define RUST_RESISTANCE_TITANIUM 3 #define RUST_RESISTANCE_ORGANIC 4 +/// Should not be rustable. EVER. Includes thing like space, lava, chasms, admin walls #define RUST_RESISTANCE_ABSOLUTE 5 /// Turf will be passable if density is 0 diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index 3283d203774..d8053c94e29 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -58,9 +58,6 @@ //when someone pulls back their fishing rod #define COMSIG_FINISH_FISHING "finish_fishing" -/// From mob/living/*/set_combat_mode(): (new_state) -#define COMSIG_LIVING_COMBAT_MODE_TOGGLE "living_combat_mode_toggle" - /// From /obj/item/organ/stomach/after_eat(atom/edible) #define COMSIG_STOMACH_AFTER_EAT "stomach_after_eat" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 9c4cc3eafa8..97ca579156e 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -894,14 +894,6 @@ used_key_list[input_key] = 1 return input_key -///Flattens a keyed list into a list of its contents -/proc/flatten_list(list/key_list) - if(!islist(key_list)) - return null - . = list() - for(var/key in key_list) - . |= LIST_VALUE_WRAP_LISTS(key_list[key]) - ///Make a normal list an associative one /proc/make_associative(list/flat_list) . = list() @@ -959,6 +951,14 @@ UNTYPED_LIST_ADD(keys, key) return keys +/// Turns an associative list into a flat list of values +/proc/assoc_to_values(list/key_list) + if(!islist(key_list)) + return null + . = list() + for(var/key in key_list) + . |= LIST_VALUE_WRAP_LISTS(key_list[key]) + ///compare two lists, returns TRUE if they are the same /proc/compare_list(list/l,list/d) if(!islist(l) || !islist(d)) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 8534322775a..2d8b60d4fcb 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -2,13 +2,13 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /// Creates a human with the given parameters and returns an appearance of it -/proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE) +/proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE, combat_mode = TRUE) if(!species_path) return FALSE if(!ispath(species_path)) stack_trace("Attempted to call get_dynamic_human_appearance() with an instantiated species_path. Pass the species datum typepath instead.") return FALSE - var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]" + var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]_[combat_mode]" if(GLOB.dynamic_human_appearances[arg_string]) //if already exists in our cache, just return that return GLOB.dynamic_human_appearances[arg_string] var/mob/living/carbon/human/dummy/consistent/dummy = new() @@ -18,6 +18,7 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) dummy.undershirt = "Nude" dummy.socks = "Nude" dummy.bra = "Nude" // SKYRAT EDIT ADDITION - Underwear and bra split + dummy.set_combat_mode(combat_mode) if(outfit_path) var/datum/outfit/outfit = new outfit_path() if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index dd39af6f150..286ce6b02db 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -753,7 +753,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /// # If you already have a human and need to get its flat icon, call `get_flat_existing_human_icon()` instead. /// For creating consistent icons for human looking simple animals. -/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null) +/proc/get_flat_human_icon(icon_id, datum/job/job, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override = null, no_anim = FALSE) var/static/list/humanoid_icon_cache = list() if(icon_id && humanoid_icon_cache[icon_id]) return humanoid_icon_cache[icon_id] @@ -771,7 +771,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") for(var/direction in showDirs) - var/icon/partial = getFlatIcon(body, defdir = direction) + var/icon/partial = getFlatIcon(body, defdir = direction, no_anim = no_anim) out_icon.Insert(partial, dir = direction) humanoid_icon_cache[icon_id] = out_icon diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 507ff81e786..857bdec8099 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -141,7 +141,11 @@ // 2 for preloading absolutely everything; #ifdef LOWMEMORYMODE +#ifndef ABSOLUTE_MINIMUM #define FORCE_MAP "runtimestation" +#else +#define FORCE_MAP "runtimestation_minimal" +#endif #define FORCE_MAP_DIRECTORY "_maps" #endif diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index bb03bbaaaa1..1957e132858 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -138,7 +138,6 @@ DEFINE_BITFIELD(flags_1, list( "HTML_USE_INITAL_ICON_1" = HTML_USE_INITAL_ICON_1, "IGNORE_TURF_PIXEL_OFFSET_1" = IGNORE_TURF_PIXEL_OFFSET_1, "INITIALIZED_1" = INITIALIZED_1, - "IS_ONTOP_1" = IS_ONTOP_1, "IS_PLAYER_COLORABLE_1" = IS_PLAYER_COLORABLE_1, "NO_NEW_GAGS_PREVIEW_1" = NO_NEW_GAGS_PREVIEW_1, "NO_SCREENTIPS_1" = NO_SCREENTIPS_1, diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 1e6eba39405..fe12dab2628 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -389,7 +389,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/grenade/clusterbuster/spawner_spesscarp, /obj/item/grenade/spawnergrenade/spesscarp, /obj/item/knife/carp, - /obj/item/nullrod/carp, /obj/item/organ/brain/carp, /obj/item/organ/heart/carp, /obj/item/organ/liver/fish, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 2ca43e8366b..1943c137d2e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -34,6 +34,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SPINNING" = TRAIT_SPINNING, "TRAIT_STICKERED" = TRAIT_STICKERED, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, "TRAIT_TETHER_ATTACHED" = TRAIT_TETHER_ATTACHED, ), @@ -145,6 +146,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( /datum/wound = list( "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, ), + /datum/antagonist/heretic = list( + "TRAIT_LOCK_GRASP_UPGRADED" = TRAIT_LOCK_GRASP_UPGRADED, + ), // SKYRAT EDIT ADDITON BEGIN - Synthetic wounds /datum/wound/electrical_damage = list( "TRAIT_ELECTRICAL_DAMAGE_REPAIRING" = TRAIT_ELECTRICAL_DAMAGE_REPAIRING, @@ -548,11 +552,12 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SNEAK" = TRAIT_SNEAK, "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, - "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SOOTHED_HEADACHE" = TRAIT_SOOTHED_HEADACHE, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, "TRAIT_SOUND_DEBUGGED" = TRAIT_SOUND_DEBUGGED, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_SPARRING" = TRAIT_SPARRING, + "TRAIT_SPAWNED_MOB" = TRAIT_SPAWNED_MOB, "TRAIT_SPEAKS_CLEARLY" = TRAIT_SPEAKS_CLEARLY, "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, "TRAIT_SPELLS_LOTTERY" = TRAIT_SPELLS_LOTTERY, @@ -650,6 +655,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS, "TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS, "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, + "TRAIT_FAT_IGNORE_SLOWDOWN" = TRAIT_FAT_IGNORE_SLOWDOWN, + "TRAIT_SPACE_ANT_IMMUNITY" = TRAIT_SPACE_ANT_IMMUNITY, + "TRAIT_BRAIN_TRAUMA_IMMUNITY" = TRAIT_BRAIN_TRAUMA_IMMUNITY, "TRAIT_CRUSHER_MARK_IMMUNE" = TRAIT_CRUSHER_MARK_IMMUNE, // BUBBER EDIT ADDITION ), /mob/dead/observer = list( @@ -691,12 +699,14 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_OMNI_BAIT" = TRAIT_OMNI_BAIT, "TRAIT_PLANT_WILDMUTATE" = TRAIT_PLANT_WILDMUTATE, "TRAIT_POISONOUS_BAIT" = TRAIT_POISONOUS_BAIT, - "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_SKIP_BASIC_REACH_CHECK" = TRAIT_SKIP_BASIC_REACH_CHECK, "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_UNCOMPOSTABLE" = TRAIT_UNCOMPOSTABLE, "TRAIT_UNIQUE_AQUARIUM_CONTENT" = TRAIT_UNIQUE_AQUARIUM_CONTENT, "TRAIT_WIELDED" = TRAIT_WIELDED, + "TRAIT_HERETIC_AURA_HIDDEN" = TRAIT_HERETIC_AURA_HIDDEN, "TRAIT_TORPOR" = TRAIT_TORPOR, // BUBBER EDIT ADDITION "TRAIT_PET_SKILLCHIP" = TRAIT_PET_SKILLCHIP, // BUBBER EDIT ADDITION ), @@ -776,6 +786,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART, "TRAIT_USED_ORGAN" = TRAIT_USED_ORGAN, ), + /obj/item/organ/brain = list( + "TRAIT_BRAIN_DAMAGE_NODEATH" = TRAIT_BRAIN_DAMAGE_NODEATH, + ), /obj/item/organ/liver = list( "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 972afde1fa8..b592bbda9d6 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CATCH_AND_RELEASE" = TRAIT_CATCH_AND_RELEASE, "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, + "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 4e4b491b672..ee1aa3633d1 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -163,7 +163,7 @@ UnarmedAttack(item_atom, TRUE, modifiers) //Standard reach turf to turf or reaching inside storage - if(CanReach(A,W)) + if(A.IsReachableBy(src, W?.reach)) if(W) W.melee_attack_chain(src, A, modifiers) else @@ -200,42 +200,81 @@ return FALSE /** - * A backwards depth-limited breadth-first-search to see if the target is - * logically "in" anything adjacent to us. + * Returns TRUE if a movable can "Reach" this atom. This is defined as adjacency + * + * Args: + * * user: The movable trying to reach us. + * * reacher_range: How far the reacher can reach. + * * depth: How deep nested inside of an atom contents stack an object can be. + * * direct_access: Do not override. Used for recursion. */ -/atom/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) - var/list/direct_access = DirectAccess() - var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH) +/atom/proc/IsReachableBy(atom/movable/user, reacher_range = 1, depth = INFINITY, direct_access = user.DirectAccess()) + SHOULD_NOT_OVERRIDE(TRUE) - var/list/closed = list() - var/list/checking = list(ultimate_target) + if(isnull(user)) + return FALSE - while (checking.len && depth > 0) - var/list/next = list() - --depth - - for(var/atom/target in checking) // will filter out nulls - if(closed[target] || isarea(target)) // avoid infinity situations - continue - - if(isturf(target) || isturf(target.loc) || (target in direct_access) || (ismovable(target) && target.flags_1 & IS_ONTOP_1) || target.loc?.atom_storage) //Directly accessible atoms - if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks - return TRUE - - closed[target] = TRUE - - if (!target.loc) - continue - - if(target.loc.atom_storage) - next += target.loc - - checking = next - - if(SEND_SIGNAL(src, COMSIG_ATOM_CANREACH, ultimate_target) & COMPONENT_ALLOW_REACH) + if(src in direct_access) return TRUE - return FALSE + // This is a micro-opt, if any turf ever returns false from IsContainedAtomAccessible, change this. + if(isturf(loc) || isturf(src)) + if(CheckReachableAdjacency(user, reacher_range)) + return TRUE + + depth-- + + if(depth <= 0) + return FALSE + + if(isnull(loc) || isarea(loc)) + return FALSE + if(!HAS_TRAIT(src, TRAIT_SKIP_BASIC_REACH_CHECK) && !loc.IsContainedAtomAccessible(src, user)) + return FALSE + + return loc.IsReachableBy(user, reacher_range, depth, direct_access) + +/atom/proc/CheckReachableAdjacency(atom/movable/reacher, reacher_range) + if(reacher.Adjacent(src)) + return TRUE + + if(isliving(reacher)) + var/mob/living/living_reacher = reacher + if(living_reacher.reach_length > reacher_range) + reacher_range = living_reacher.reach_length + + return (reacher_range > 1) && RangedReachCheck(reacher, src, reacher_range) + +/// Called by IsReachableBy() to check for ranged reaches. +/proc/RangedReachCheck(atom/movable/here, atom/movable/there, reach) + if(!here || !there) + return FALSE + + if(reach <= 1) + return FALSE + + // Prevent infinite loop. + if(istype(here, /obj/effect/abstract/reach_checker)) + return FALSE + + var/obj/effect/abstract/reach_checker/dummy = new(get_turf(here)) + for(var/i in 1 to reach) //Limit it to that many tries + var/turf/T = get_step(dummy, get_dir(dummy, there)) + if(there.IsReachableBy(dummy)) + . = TRUE + break + + if(!dummy.Move(T)) //we're blocked! + break + + qdel(dummy) + +/// Returns TRUE if an atom contained within our contents is reachable. +/atom/proc/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + +/atom/movable/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return !!atom_storage /atom/proc/DirectAccess() return list(src, loc) @@ -269,7 +308,7 @@ dummy.SetInvisibility(INVISIBILITY_ABSTRACT) for(var/i in 1 to reach) //Limit it to that many tries var/turf/T = get_step(dummy, get_dir(dummy, there)) - if(dummy.CanReach(there)) + if(there.IsReachableBy(dummy)) qdel(dummy) return TRUE if(!dummy.Move(T)) //we're blocked! diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 1f95850ff79..a27dc00e848 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -85,7 +85,7 @@ return // cyborg rightclick code, allowing borgos to use weapons at range - if(CanReach(A,W)) + if(A.IsReachableBy(src, W?.reach)) W.melee_attack_chain(src, A, modifiers) return else if(isturf(A) || isturf(A.loc)) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index aa23d5a57ea..46d7cee82f9 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -11,7 +11,8 @@ if(!usr || !over) return - var/proximity_check = usr.client.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) + var/client/usrclient = GET_CLIENT(usr) + var/proximity_check = usrclient.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) if(proximity_check) return proximity_check @@ -38,7 +39,7 @@ var/combined_atom_flags = interaction_flags_atom | over.interaction_flags_atom if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS)) //Check for adjacency - if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) && (!CanReach(user) || !over.CanReach(user))) + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) && (!IsReachableBy(user) || !over.IsReachableBy(user))) return // should stop you from dragging through windows if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY)) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index c10bc5922e2..0087df9f773 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -12,13 +12,13 @@ *flicks are forwarded to master *override makes it so the alert is not replaced until cleared by a clear_alert with clear_override, and it's used for hallucinations. */ -/mob/proc/throw_alert(category, type, severity, obj/new_master, override = FALSE, timeout_override, no_anim = FALSE) +/mob/proc/throw_alert(category, type, severity, atom/new_master, override = FALSE, timeout_override, no_anim = FALSE) if(!category || QDELETED(src)) return var/datum/weakref/master_ref - if(isdatum(new_master)) + if(isatom(new_master)) master_ref = WEAKREF(new_master) var/atom/movable/screen/alert/thealert if(alerts[category]) @@ -51,17 +51,9 @@ thealert.owner = src if(new_master) - var/mutable_appearance/master_appearance = new(new_master) - master_appearance.appearance_flags = KEEP_TOGETHER - master_appearance.layer = FLOAT_LAYER - master_appearance.plane = FLOAT_PLANE - master_appearance.dir = SOUTH - master_appearance.pixel_x = new_master.base_pixel_x - master_appearance.pixel_y = new_master.base_pixel_y - master_appearance.pixel_z = new_master.base_pixel_z - thealert.add_overlay(strip_appearance_underlays(master_appearance)) - thealert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() thealert.master_ref = master_ref + thealert.RegisterSignal(new_master, COMSIG_ATOM_UPDATE_APPEARANCE, TYPE_PROC_REF(/atom/movable/screen/alert, on_master_update_appearance)) + thealert.update_appearance(UPDATE_OVERLAYS) else thealert.icon_state = "[initial(thealert.icon_state)][severity]" thealert.severity = severity @@ -118,6 +110,9 @@ /// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master. var/click_master = TRUE + ///If set true, instead of using the default icon file for screen alerts, it will use the hud's ui style + var/use_user_hud_icon = FALSE + /atom/movable/screen/alert/Initialize(mapload, datum/hud/hud_owner) . = ..() if(clickable_glow) @@ -129,10 +124,64 @@ if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle) - /atom/movable/screen/alert/MouseExited() closeToolTip(usr) +/atom/movable/screen/alert/proc/on_master_update_appearance(datum/source) + SIGNAL_HANDLER + update_appearance(UPDATE_OVERLAYS) + +/atom/movable/screen/alert/update_overlays() + . = ..() + var/atom/our_master = master_ref?.resolve() + if(!istype(our_master) || QDELETED(our_master)) + return + . += add_atom_icon(our_master) + +///Returns a copy of the appearance of the atom, with its base pixel coordinates. Useful for overlays +/atom/movable/screen/alert/proc/add_atom_icon(atom/atom) + var/mutable_appearance/atom_appearance = new(atom) + atom_appearance.appearance_flags = KEEP_TOGETHER + atom_appearance.layer = FLOAT_LAYER + atom_appearance.plane = FLOAT_PLANE + atom_appearance.dir = SOUTH + atom_appearance.pixel_x = atom.base_pixel_x + atom_appearance.pixel_y = atom.base_pixel_y + atom_appearance.pixel_w = atom.base_pixel_w + atom_appearance.pixel_z = atom.base_pixel_z + strip_appearance_underlays(atom_appearance) + return atom_appearance + +/atom/movable/screen/alert/Click(location, control, params) + SHOULD_CALL_PARENT(TRUE) + + ..() + if(!usr || !GET_CLIENT(usr) || usr != owner) + return FALSE + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat + to_chat(usr, boxed_message(jointext(examine(usr), "\n"))) + return FALSE + if(!click_master) + return TRUE + var/datum/our_master = master_ref?.resolve() + if(our_master) + return usr.client.Click(our_master, location, control, params) + + return TRUE + +/atom/movable/screen/alert/Destroy() + . = ..() + severity = 0 + master_ref = null + owner = null + screen_loc = "" + +/atom/movable/screen/alert/examine(mob/user) + return list( + span_boldnotice(name), + span_info(desc), + ) //Gas alerts // Gas alerts are continuously thrown/cleared by: @@ -326,7 +375,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return roller.resist_fire() /atom/movable/screen/alert/give // information set when the give alert is made - icon_state = "default" + icon_state = "template" + use_user_hud_icon = TRUE clickable_glow = TRUE /// The offer we're linked to, yes this is suspiciously like a status effect alert var/datum/status_effect/offering/offer @@ -848,6 +898,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." name = "Something interesting is happening!" desc = "This can be clicked on to perform an action." icon_state = "template" + use_user_hud_icon = TRUE timeout = 30 SECONDS clickable_glow = TRUE /// Weakref to the target atom to use the action on @@ -875,6 +926,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." /atom/movable/screen/alert/poll_alert name = "Looking for candidates" icon_state = "template" + use_user_hud_icon = TRUE timeout = 30 SECONDS ghost_screentips = TRUE /// If true you need to call START_PROCESSING manually @@ -1030,6 +1082,8 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." clickable_glow = TRUE /atom/movable/screen/alert/restrained + icon_state = "template" + use_user_hud_icon = TRUE clickable_glow = TRUE /atom/movable/screen/alert/restrained/handcuffed @@ -1128,7 +1182,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return TRUE for(var/i in 1 to length(alerts)) var/atom/movable/screen/alert/alert = alerts[alerts[i]] - if(alert.icon_state == "template") + if(alert.use_user_hud_icon) alert.icon = ui_style alert.screen_loc = get_ui_alert_placement(i) screenmob.client.screen |= alert @@ -1136,34 +1190,3 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." for(var/viewer in mymob.observers) reorganize_alerts(viewer) return TRUE - -/atom/movable/screen/alert/Click(location, control, params) - SHOULD_CALL_PARENT(TRUE) - - ..() - if(!usr || !usr.client) - return FALSE - if(usr != owner) - return FALSE - var/list/modifiers = params2list(params) - if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat - to_chat(usr, boxed_message(jointext(examine(usr), "\n"))) - return FALSE - var/datum/our_master = master_ref?.resolve() - if(our_master && click_master) - return usr.client.Click(our_master, location, control, params) - - return TRUE - -/atom/movable/screen/alert/Destroy() - . = ..() - severity = 0 - master_ref = null - owner = null - screen_loc = "" - -/atom/movable/screen/alert/examine(mob/user) - return list( - span_boldnotice(name), - span_info(desc), - ) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 9f78a492ab9..7c525460168 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -108,7 +108,8 @@ * See: [/obj/item/proc/melee_attack_chain] */ /obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) //do stuff before attackby! - if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_USER_PRE_ITEM_ATTACK, src, target, modifiers, attack_modifiers) + if(signal_result & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE return FALSE //return TRUE to avoid calling attackby after this proc does stuff @@ -124,7 +125,7 @@ * See: [/obj/item/proc/melee_attack_chain] */ /obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_USER_PRE_ITEM_ATTACK_SECONDARY, src, target, modifiers, attack_modifiers) if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -478,6 +479,11 @@ return clamp(w_class * 6, 10, 100) // Multiply the item's weight class by 6, then clamp the value between 10 and 100 /mob/living/proc/send_item_attack_message(obj/item/weapon, mob/living/user, hit_area, def_zone) + if(SEND_SIGNAL(weapon, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, src, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(SEND_SIGNAL(src, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, weapon, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(!weapon.force && !length(weapon.attack_verb_simple) && !length(weapon.attack_verb_continuous)) return diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index e5f14edb2ef..db682f48d7e 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -796,3 +796,7 @@ /datum/config_entry/flag/generate_assets_in_init default = FALSE + +/datum/config_entry/number/minimum_ascension_time + default = 0 // 1 minute + min_val = 0 diff --git a/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm b/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm index d780e2fa344..88e20ce349b 100644 --- a/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm +++ b/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm @@ -35,19 +35,6 @@ /datum/dynamic_ruleset/latejoin/traitor/assign_role(datum/mind/candidate) candidate.add_antag_datum(/datum/antagonist/traitor) -/datum/dynamic_ruleset/latejoin/heretic - name = "Heretic" - config_tag = "Latejoin Heretic" - preview_antag_datum = /datum/antagonist/heretic - pref_flag = ROLE_HERETIC_SMUGGLER - jobban_flag = ROLE_HERETIC - weight = 3 - min_pop = 30 // Ensures good spread of sacrifice targets - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_HERETIC_SACRIFICE) - blacklisted_roles = list( - JOB_HEAD_OF_PERSONNEL, - ) - /datum/dynamic_ruleset/latejoin/heretic/assign_role(datum/mind/candidate) candidate.add_antag_datum(/datum/antagonist/heretic) diff --git a/code/controllers/subsystem/dynamic/dynamic_testing.dm b/code/controllers/subsystem/dynamic/dynamic_testing.dm index c1b5c3df005..fe9da13d231 100644 --- a/code/controllers/subsystem/dynamic/dynamic_testing.dm +++ b/code/controllers/subsystem/dynamic/dynamic_testing.dm @@ -13,8 +13,10 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities /// A formatted report of the weights of each roundstart ruleset, refreshed occasionally and sent to the UI. var/list/roundstart_ruleset_report = list() - /// A formatted report of the weights of each midround ruleset, refreshed occasionally and sent to the UI. - var/list/midround_ruleset_report = list() + /// A formatted report of the weights of each light midround ruleset, refreshed occasionally and sent to the UI. + var/list/light_midround_ruleset_report = list() + /// A formatted report of the weights of each heavy midround ruleset, refreshed occasionally and sent to the UI. + var/list/heavy_midround_ruleset_report = list() /// What is the tier we are testing? var/tier = 1 @@ -57,8 +59,9 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities data["tier"] = tier data["num_players"] = num_players - data["roundstart_ruleset_report"] = flatten_list(roundstart_ruleset_report) - data["midround_ruleset_report"] = flatten_list(midround_ruleset_report) + data["roundstart_ruleset_report"] = assoc_to_values(roundstart_ruleset_report) + data["light_midround_ruleset_report"] = assoc_to_values(light_midround_ruleset_report) + data["heavy_midround_ruleset_report"] = assoc_to_values(heavy_midround_ruleset_report) return data @@ -98,14 +101,16 @@ ADMIN_VERB(dynamic_tester, R_DEBUG, "Dynamic Tester", "See dynamic probabilities "comment" = comment, ) - midround_ruleset_report.Cut() + light_midround_ruleset_report.Cut() + heavy_midround_ruleset_report.Cut() for(var/datum/dynamic_ruleset/midround/ruleset as anything in midround_rulesets) - midround_ruleset_report[ruleset] = list( + var/list/list_to_add = ruleset.midround_type == LIGHT_MIDROUND ? light_midround_ruleset_report : heavy_midround_ruleset_report + list_to_add[ruleset] = list( "name" = ruleset.name, "weight" = ruleset.get_weight(num_players, tier), "max_candidates" = ruleset.get_antag_cap(num_players, ruleset.max_antag_cap || ruleset.min_antag_cap), "min_candidates" = ruleset.get_antag_cap(num_players, ruleset.min_antag_cap), - "comment" = ruleset.midround_type, ) + update_static_data_for_all_viewers() diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index c7605e254a7..2ebb5a19f96 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -27,7 +27,7 @@ SUBSYSTEM_DEF(economy) var/techweb_bounty = 250 /** * List of normal (no department ones) accounts' identifiers with associated datum accounts, for big O performance. - * A list of sole account datums can be obtained with flatten_list(), another variable would be redundant rn. + * A list of sole account datums can be obtained with assoc_to_values(), another variable would be redundant rn. */ var/list/bank_accounts_by_id = list() /// A list of bank accounts indexed by their assigned job typepath. diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 83f6e4e4ff8..95c6923269f 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -127,7 +127,7 @@ SUBSYSTEM_DEF(throwing) qdel(src) -/// Returns the mob thrower, or null +/// Returns the thrower, or null /datum/thrownthing/proc/get_thrower() . = thrower?.resolve() if(isnull(.)) @@ -144,11 +144,11 @@ SUBSYSTEM_DEF(throwing) return var/atom/movable/actual_target = initial_target?.resolve() - var/mob/mob_thrower = get_thrower() + var/atom/thrower = get_thrower() if(dist_travelled) //to catch sneaky things moving on our tile while we slept for(var/atom/movable/obstacle as anything in get_turf(thrownthing)) - if (obstacle == thrownthing || (obstacle == mob_thrower && !ismob(thrownthing))) + if(obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing))) continue if(ismob(obstacle) && thrownthing.pass_flags & PASSMOB && (obstacle != actual_target)) continue diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 3a62a6ec527..130fd4ba5ce 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -14,7 +14,11 @@ SUBSYSTEM_DEF(ticker) /// or a "round-ending" event, like summoning Nar'Sie, a blob victory, the nuke going off, etc. ([FORCE_END_ROUND]) var/force_ending = END_ROUND_AS_NORMAL /// If TRUE, there is no lobby phase, the game starts immediately. + #ifdef ABSOLUTE_MINIMUM + var/start_immediately = TRUE + #else var/start_immediately = FALSE + #endif /// Boolean to track and check if our subsystem setup is done. var/setup_done = FALSE diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 513c29c4765..0683a5b8562 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -386,7 +386,7 @@ multiple modular subtrees with behaviors return ///Stops pawns from performing such actions that should require the target to be adjacent. var/atom/movable/moving_pawn = pawn - var/can_reach = !(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_REACH) || moving_pawn.CanReach(current_movement_target) + var/can_reach = !(current_behavior.behavior_flags & AI_BEHAVIOR_REQUIRE_REACH) || current_movement_target.IsReachableBy(moving_pawn) if(can_reach && current_behavior.required_distance >= get_dist(moving_pawn, current_movement_target)) ///Are we close enough to engage? if(ai_movement.moving_controllers[src] == current_movement_target) //We are close enough, if we're moving stop. ai_movement.stop_moving_towards(src) 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 b75fc1ef38e..2e145c31ec4 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 @@ -22,7 +22,7 @@ var/atom/target = controller.blackboard[target_key] if (isnull(target)) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if (!controller.pawn.CanReach(target)) + if (!target.IsReachableBy(controller.pawn)) controller.clear_blackboard_key(BB_BASIC_MOB_MELEE_COOLDOWN_TIMER) return AI_BEHAVIOR_INSTANT diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm index 8effc7a0fa7..7dd626b1dc4 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm @@ -26,7 +26,8 @@ /datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) var/atom/movable/atom_pawn = controller.pawn - if(!atom_pawn.CanReach(controller.blackboard[target_key])) + var/atom/atom_target = controller.blackboard[target_key] + if(!atom_target.IsReachableBy(atom_pawn)) return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED . = ..() return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm b/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm index 9dfbfce94de..2c0a198c768 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/escape_captivity.dm @@ -60,7 +60,7 @@ if (QDELETED(target)) return FALSE var/mob/living/pawn = controller.pawn - if (!pawn.CanReach(target)) + if (!target.IsReachableBy(pawn)) return FALSE return pawn.loc == target || pawn.buckled == target diff --git a/code/datums/ai/hunting_behavior/hunting_mouse.dm b/code/datums/ai/hunting_behavior/hunting_mouse.dm index b5c9a7743a4..ca849274f6d 100644 --- a/code/datums/ai/hunting_behavior/hunting_mouse.dm +++ b/code/datums/ai/hunting_behavior/hunting_mouse.dm @@ -40,7 +40,7 @@ if (!isturf(instrument.loc) || !can_see(pawn, instrument)) controller.clear_blackboard_key(BB_SONG_INSTRUMENT) return - if (pawn.CanReach(instrument)) + if (instrument.IsReachableBy(pawn)) return controller.queue_behavior(/datum/ai_behavior/travel_towards/adjacent, BB_SONG_INSTRUMENT) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index ef49de98823..01dd0b61449 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -87,7 +87,7 @@ var/success = FALSE - if(do_after(living_pawn, MONKEY_ITEM_SNATCH_DELAY, victim) && target && living_pawn.CanReach(victim)) + if(do_after(living_pawn, MONKEY_ITEM_SNATCH_DELAY, victim) && target && victim.IsReachableBy(living_pawn)) for(var/obj/item/I in victim.held_items) if(I == target) @@ -195,7 +195,7 @@ //look for any potential weapons we're holding var/obj/item/potential_weapon = locate() in living_pawn.held_items - if(!living_pawn.CanReach(target, potential_weapon)) + if(!target.IsReachableBy(living_pawn, potential_weapon?.reach)) return FALSE if(isnull(potential_weapon)) diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index b2c56bc9f3c..b875da42ce2 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -33,10 +33,11 @@ stack_trace("adding a [parent.type] to a [receiver.type] when it shouldn't be!") if(imprint_on_next_insertion) //We only want this set *once* - var/feature_name = receiver.dna.features[feature_key] + var/feature_name = receiver.dna.features[feature_key] || receiver.dna.species.mutant_organs[parent.type] if (isnull(feature_name)) /* SKYRAT EDIT - Customization - ORIGINAL: - feature_name = receiver.dna.species.mutant_organs[parent.type] + stack_trace("[type] has no default feature name for organ [parent.type]!") + feature_name = get_consistent_feature_entry(get_global_feature_list()) //fallback to something set_appearance_from_name(feature_name) */ // SKYRAT EDIT START if(!set_appearance_from_dna(receiver.dna)) diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 3c7f5ce7aec..9d1caff55f6 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -8,14 +8,22 @@ abstract_type = /datum/brain_trauma var/name = "Brain Trauma" var/desc = "A trauma caused by brain damage, which causes issues to the patient." - var/scan_desc = "generic brain trauma" //description when detected by a health scanner - var/mob/living/carbon/owner //the poor bastard - var/obj/item/organ/brain/brain //the poor bastard's brain + /// Description when detected by a health scanner + var/scan_desc = "generic brain trauma" + /// The poor bastard + var/mob/living/carbon/owner + /// The poor bastard's brain + var/obj/item/organ/brain/brain + /// Message sent in chat when trauma is gained var/gain_text = span_notice("You feel traumatized.") + /// Message sent in chat when trauma is lost var/lose_text = span_notice("You no longer feel traumatized.") + /// If the trauma can be gained, checked in can_gain_trauma var/can_gain = TRUE - var/random_gain = TRUE //can this be gained through random traumas? - var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? + /// If this trauma can be gained randomly + var/random_gain = TRUE + /// How hard is this to cure? + var/resilience = TRAUMA_RESILIENCE_BASIC /datum/brain_trauma/Destroy() // Handles our references with our brain diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index d0026703c13..d15296baa22 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -74,8 +74,12 @@ scan_desc = "extra-sensory paranoia" gain_text = span_warning("You feel like something wants to kill you...") lose_text = span_notice("You no longer feel eyes on your back.") + /// Type of stalker that is chasing us + var/stalker_type = /obj/effect/client_image_holder/stalker_phantom + /// Reference to the stalker that is chasing us var/obj/effect/client_image_holder/stalker_phantom/stalker - var/close_stalker = FALSE //For heartbeat + /// Plays a sound when the stalker is near their victim + var/close_stalker = FALSE /datum/brain_trauma/magic/stalker/Destroy() QDEL_NULL(stalker) @@ -87,7 +91,7 @@ /datum/brain_trauma/magic/stalker/proc/create_stalker() var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z) //random corner - stalker = new(stalker_source, owner) + stalker = new stalker_type(stalker_source, owner) /datum/brain_trauma/magic/stalker/on_lose() QDEL_NULL(stalker) @@ -125,3 +129,12 @@ desc = "It's coming closer..." image_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' image_state = "curseblob" + +// Heretic subtype that replaces the ghost guy with a stargazer +/datum/brain_trauma/magic/stalker/cosmic + stalker_type = /obj/effect/client_image_holder/stalker_phantom/cosmic + random_gain = FALSE + +/obj/effect/client_image_holder/stalker_phantom/cosmic + image_icon = 'icons/mob/nonhuman-player/96x96eldritch_mobs.dmi' + image_state = "star_gazer" diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 57cfae25cf5..b2b50cbe707 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -356,7 +356,7 @@ stealables += potential_stealable for(var/obj/item/stealable as anything in shuffle(stealables)) - if(!owner.CanReach(stealable, view_only = TRUE) || stealable.IsObscured()) + if(!stealable.IsReachableBy(owner) || stealable.IsObscured()) continue // Try to do a raw click on the item with one of our empty hands, to pick it up (duh) owner.log_message("attempted to pick up (kleptomania)", LOG_ATTACK, color = "orange") diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm index 143c0b260cd..1cc9ef4f210 100644 --- a/code/datums/components/appearance_on_aggro.dm +++ b/code/datums/components/appearance_on_aggro.dm @@ -65,13 +65,10 @@ /datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source) SIGNAL_HANDLER - if (source.stat == DEAD) - return - source.icon_state = source.ai_controller?.blackboard_key_exists(target_key) ? aggro_state : initial(source.icon_state) + if (source.stat != DEAD) + source.icon_state = source.ai_controller?.blackboard_key_exists(target_key) ? aggro_state : initial(source.icon_state) /datum/component/appearance_on_aggro/proc/on_overlays_updated(mob/living/basic/source, list/overlays) SIGNAL_HANDLER - - if(!(source.ai_controller?.blackboard_key_exists(target_key))) - return - overlays += aggro_overlay + if(source.ai_controller?.blackboard_key_exists(target_key) && source.stat != DEAD) + overlays += aggro_overlay diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm index e71a06de2fb..416ab713b44 100644 --- a/code/datums/components/aura_healing.dm +++ b/code/datums/components/aura_healing.dm @@ -44,6 +44,9 @@ /// The color to give the healing visual var/healing_color = COLOR_GREEN + /// If the aura also heals the owner of the component + var/self_heal = TRUE + /// A list of being healed to active alerts var/list/mob/living/current_alerts = list() @@ -64,6 +67,7 @@ simple_heal = 0, limit_to_trait = null, healing_color = COLOR_GREEN, + self_heal = TRUE, ) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -83,6 +87,7 @@ src.simple_heal = simple_heal src.limit_to_trait = limit_to_trait src.healing_color = healing_color + src.self_heal = self_heal /datum/component/aura_healing/Destroy(force) STOP_PROCESSING(SSaura, src) @@ -158,5 +163,7 @@ /atom/movable/screen/alert/aura_healing name = "Aura Healing" icon_state = "template" + use_user_hud_icon = TRUE + clickable_glow = TRUE #undef HEAL_EFFECT_COOLDOWN diff --git a/code/datums/components/boomerang.dm b/code/datums/components/boomerang.dm index e41917a2b10..82a189985bc 100644 --- a/code/datums/components/boomerang.dm +++ b/code/datums/components/boomerang.dm @@ -85,7 +85,7 @@ /datum/component/boomerang/proc/aerodynamic_swing(datum/thrownthing/throwingdatum) var/mob/thrown_by = throwingdatum?.get_thrower() var/obj/item/true_parent = parent - if(thrown_by) + if(istype(thrown_by)) addtimer(CALLBACK(true_parent, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, boomerang_throw_range, throwingdatum.speed, thrown_by, TRUE), 0.1 SECONDS) COOLDOWN_START(src, last_boomerang_throw, BOOMERANG_REBOUND_INTERVAL) true_parent.visible_message( diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index d4f1df1778b..a333884455c 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -108,6 +108,8 @@ if(HAS_TRAIT(digitigrade_fan, TRAIT_LIGHT_STEP)) damage *= 0.75 + if(flags & CALTROP_ANTS && HAS_TRAIT(digitigrade_fan, TRAIT_SPACE_ANT_IMMUNITY)) + damage = 0 if(!(flags & CALTROP_SILENT) && !digitigrade_fan.has_status_effect(/datum/status_effect/caltropped)) digitigrade_fan.apply_status_effect(/datum/status_effect/caltropped) diff --git a/code/datums/components/can_flash_from_behind.dm b/code/datums/components/can_flash_from_behind.dm index c443d160dfb..f375df20c98 100644 --- a/code/datums/components/can_flash_from_behind.dm +++ b/code/datums/components/can_flash_from_behind.dm @@ -10,10 +10,10 @@ return COMPONENT_INCOMPATIBLE /datum/component/can_flash_from_behind/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOB_PRE_FLASHED_CARBON, PROC_REF(on_pre_flashed_carbon)) + RegisterSignal(parent, COMSIG_MOB_PRE_FLASHED_MOB, PROC_REF(on_pre_flashed_carbon)) /datum/component/can_flash_from_behind/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_MOB_PRE_FLASHED_CARBON) + UnregisterSignal(parent, COMSIG_MOB_PRE_FLASHED_MOB) /datum/component/can_flash_from_behind/proc/on_pre_flashed_carbon(source, flashed, flash, deviation) SIGNAL_HANDLER diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 9ea3d59ac29..7cf080680fc 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -33,6 +33,49 @@ time = 4 SECONDS category = CAT_WEAPON_MELEE +/datum/crafting_recipe/stunsword + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/claymore = 1, + /obj/item/melee/baton/security = 1 + ) + blacklist = list( + /obj/item/claymore/cutlass, + /obj/item/claymore/cutlass/old, + /obj/item/claymore/carrot, + /obj/item/claymore/shortsword, + /obj/item/claymore/highlander, + /obj/item/claymore/weak, + /obj/item/claymore/weak/ceremonial, + /obj/item/claymore/highlander/robot + ) + tool_behaviors = list(TOOL_WELDER) + time = 10 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/stunswordalt + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/katana = 1, + /obj/item/melee/baton/security = 1, + ) + tool_behaviors = list(TOOL_WELDER) + time = 10 SECONDS + category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/stunswordalt2 + name = "\improper NT-20 'Excalibur' Stunsword" + result = /obj/item/melee/baton/security/stunsword + reqs = list( + /obj/item/melee/sabre = 1, + /obj/item/melee/baton/telescopic/contractor_baton = 1, + ) + tool_behaviors = list(TOOL_WELDER) + time = 10 SECONDS + category = CAT_WEAPON_MELEE + /datum/crafting_recipe/tailclub name = "Tail Club" result = /obj/item/tailclub diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 9da3001015f..b238be9f5a7 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -495,6 +495,7 @@ Behavior that's still missing from this component that original food items had t playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) if(!owner.reagents.total_volume) return + SEND_SIGNAL(eater, COMSIG_LIVING_EAT_FOOD, owner) var/sig_return = SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption) if(sig_return & DESTROY_FOOD) qdel(owner) diff --git a/code/datums/components/fov_handler.dm b/code/datums/components/fov_handler.dm index eb67a90db3f..61cd1fa5633 100644 --- a/code/datums/components/fov_handler.dm +++ b/code/datums/components/fov_handler.dm @@ -128,5 +128,4 @@ /datum/component/fov_handler/UnregisterFromParent() . = ..() UnregisterSignal(parent, list(COMSIG_MOB_RESET_PERSPECTIVE, COMSIG_ATOM_DIR_CHANGE, COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE, COMSIG_MOB_LOGOUT)) - UnregisterSignal(parent, COMSIG_LIVING_COMBAT_MODE_TOGGLE) //SKYRAT EDIT ADDITION diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index e1d620222cb..a9e4a3b82f9 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -5,11 +5,13 @@ GLOBAL_LIST_EMPTY(GPS_list) var/gpstag = "COM0" var/tracking = TRUE var/emped = FALSE + var/list/turf/tagged -/datum/component/gps/Initialize(_gpstag = "COM0") +/datum/component/gps/Initialize(_gpstag = "COM0", _tracking = TRUE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE gpstag = _gpstag + tracking = _tracking GLOB.GPS_list += src /datum/component/gps/Destroy() @@ -32,8 +34,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown /// UI state of GPS, altering when it can be used. var/datum/ui_state/state = null + var/debug_mode = FALSE -/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, state = null, overlay_state = "working") +/datum/component/gps/item/Initialize(_gpstag = "COM0", _tracking = TRUE, emp_proof = FALSE, state = null, overlay_state = "working", debug = FALSE) . = ..() if(. == COMPONENT_INCOMPATIBLE || !isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -41,17 +44,28 @@ GLOBAL_LIST_EMPTY(GPS_list) if(isnull(state)) state = GLOB.default_state src.state = state + debug_mode = debug var/atom/A = parent if(overlay_state) A.add_overlay(overlay_state) A.name = "[initial(A.name)] ([gpstag])" RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(interact)) + + if(debug_mode && tracking) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(tag_the_floor)) + if(!emp_proof) RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) +/datum/component/gps/item/Destroy() + if(tagged) + clear() + return ..() + ///Called on COMSIG_ITEM_ATTACK_SELF /datum/component/gps/item/proc/interact(datum/source, mob/user) SIGNAL_HANDLER @@ -59,6 +73,29 @@ GLOBAL_LIST_EMPTY(GPS_list) if(user) INVOKE_ASYNC(src, PROC_REF(ui_interact), user) +///Called on COMSIG_MOVABLE_MOVED +/datum/component/gps/item/proc/tag_the_floor(atom/movable/mover, turf/old_loc) + SIGNAL_HANDLER + + if(!debug_mode) + return + + var/turf/tagged_turf = get_turf(mover) + if(tagged_turf) + tagged_turf.color = RANDOM_COLOUR + tagged_turf.maptext = MAPTEXT("[tagged_turf.x],[tagged_turf.y],[tagged_turf.z]") + LAZYOR(tagged, tagged_turf) + +///Called on COMSIG_MOVABLE_MOVED +/datum/component/gps/item/proc/clear() + SIGNAL_HANDLER + + while(tagged.len) + var/turf/tagged_turf = pop(tagged) + tagged_turf.color = initial(tagged_turf.color) + tagged_turf.maptext = initial(tagged_turf.maptext) + LAZYNULL(tagged) + ///Called on COMSIG_ATOM_EXAMINE /datum/component/gps/item/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER @@ -108,6 +145,13 @@ GLOBAL_LIST_EMPTY(GPS_list) to_chat(user, span_notice("[parent] is now tracking, and visible to other GPS devices.")) tracking = TRUE + if(debug_mode) + if(tracking) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(tag_the_floor)) + else + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + clear() + /datum/component/gps/item/ui_interact(mob/user, datum/tgui/ui) if(emped) to_chat(user, span_hear("[parent] fizzles weakly.")) diff --git a/code/datums/components/happiness.dm b/code/datums/components/happiness.dm index 75aecee3561..95d3b0d1f42 100644 --- a/code/datums/components/happiness.dm +++ b/code/datums/components/happiness.dm @@ -104,7 +104,7 @@ START_PROCESSING(SSprocessing, src) /datum/component/happiness/proc/view_happiness(mob/living/source, mob/living/clicker) - if(HAS_TRAIT(source, TRAIT_MOB_HIDE_HAPPINESS) || !istype(clicker) || !COOLDOWN_FINISHED(src, happiness_inspect) || !clicker.CanReach(source)) + if(HAS_TRAIT(source, TRAIT_MOB_HIDE_HAPPINESS) || !istype(clicker) || !COOLDOWN_FINISHED(src, happiness_inspect) || !source.IsReachableBy(clicker)) return var/y_position = source.get_cached_height() + 1 var/obj/effect/overlay/happiness_overlay/hearts = new diff --git a/code/datums/components/hat_stabilizer.dm b/code/datums/components/hat_stabilizer.dm index 44545f273a4..b7d1a4a3ce2 100644 --- a/code/datums/components/hat_stabilizer.dm +++ b/code/datums/components/hat_stabilizer.dm @@ -2,7 +2,7 @@ /datum/component/hat_stabilizer dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /// Currently "stored" hat. No armor or function will be inherited, only the icon and cover flags. - var/obj/item/clothing/head/attached_hat + var/obj/item/attached_hat /// If TRUE, the hat will fall to the ground when the owner does so. It can also be shot off. var/loose_hat = FALSE /// Original cover flags for the helmet, before a hat is placed @@ -12,6 +12,8 @@ var/use_worn_icon = TRUE /// Pixel z offset for the hat var/pixel_z_offset + /// Which way a loose hat is offset + var/head_angle = 1 /datum/component/hat_stabilizer/Initialize(use_worn_icon = FALSE, pixel_z_offset = 0, loose_hat = FALSE) if(!ismovable(parent)) @@ -114,7 +116,7 @@ if(loose_hat) var/matrix/tilt_trix = matrix(worn_overlay.transform) var/angle = 5 - tilt_trix.Turn(angle * pick(1, -1)) + tilt_trix.Turn(angle * head_angle) worn_overlay.transform = tilt_trix worn_overlay.pixel_z = pixel_z_offset + attached_hat.worn_y_offset overlays += worn_overlay @@ -132,7 +134,7 @@ if(loose_hat) var/matrix/tilt_trix = matrix(worn_overlay.transform) var/angle = 5 - tilt_trix.Turn(angle * pick(1, -1)) + tilt_trix.Turn(angle * head_angle) worn_overlay.transform = tilt_trix worn_overlay.pixel_z = pixel_z_offset + attached_hat.worn_y_offset overlays += worn_overlay @@ -147,41 +149,44 @@ SIGNAL_HANDLER var/atom/movable/movable_parent = parent - if(!istype(hitting_item, /obj/item/clothing/head)) + if(!(hitting_item.slot_flags & ITEM_SLOT_HEAD)) return if(attached_hat) movable_parent.balloon_alert(user, "hat already attached!") return + if(isclothing(hitting_item)) + var/obj/item/clothing/hat = hitting_item + if(hat.clothing_flags & STACKABLE_HELMET_EXEMPT) + movable_parent.balloon_alert(user, "invalid hat!") + return - var/obj/item/clothing/hat = hitting_item - if(hat.clothing_flags & STACKABLE_HELMET_EXEMPT) - movable_parent.balloon_alert(user, "invalid hat!") + if(!user.transferItemToLoc(hitting_item, parent, force = FALSE, silent = TRUE)) return - if(!user.transferItemToLoc(hat, parent, force = FALSE, silent = TRUE)) - return + attach_hat(hitting_item, user) - attach_hat(hat, user) - -/datum/component/hat_stabilizer/proc/attach_hat(obj/item/clothing/hat, mob/user) +/datum/component/hat_stabilizer/proc/attach_hat(obj/item/hat, mob/user) var/atom/movable/movable_parent = parent attached_hat = hat RegisterSignal(hat, COMSIG_MOVABLE_MOVED, PROC_REF(on_hat_movement)) + head_angle = pick(1, -1) if (!isnull(user)) movable_parent.balloon_alert(user, "hat attached") - if (!istype(parent, /obj/item/clothing)) + if (!isclothing(parent)) movable_parent.update_appearance() return var/obj/item/clothing/apparel = parent - apparel.attach_clothing_traits(attached_hat.clothing_traits) + if(isclothing(attached_hat)) + var/obj/item/clothing/realhat = attached_hat + apparel.attach_clothing_traits(realhat.clothing_traits) + apparel.visor_flags_cover |= realhat.visor_flags_cover former_flags = apparel.flags_cover former_visor_flags = apparel.visor_flags_cover apparel.flags_cover |= attached_hat.flags_cover - apparel.visor_flags_cover |= attached_hat.visor_flags_cover apparel.update_appearance() if (ismob(apparel.loc)) @@ -220,14 +225,16 @@ else movable_parent.balloon_alert_to_viewers("the hat falls to the floor!") - if (!istype(parent, /obj/item/clothing)) + if (!isclothing(parent)) attached_hat = null movable_parent.update_appearance() return var/former_hat = attached_hat var/obj/item/clothing/apparel = parent - apparel.detach_clothing_traits(attached_hat.clothing_traits) + if(isclothing(attached_hat)) + var/obj/item/clothing/truehat = attached_hat + apparel.detach_clothing_traits(truehat.clothing_traits) apparel.flags_cover = former_flags apparel.visor_flags_cover = former_visor_flags apparel.update_appearance() @@ -235,8 +242,8 @@ if (ismob(apparel.loc)) var/mob/wearer = apparel.loc wearer.update_clothing(wearer.get_slot_by_item(apparel)) - - return former_hat + if(isnull(user)) + return former_hat /datum/component/hat_stabilizer/proc/on_requesting_context_from_item(atom/source, list/context, obj/item/held_item, mob/user) SIGNAL_HANDLER diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 72d7aeb9163..7bfead87625 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -1,7 +1,11 @@ /datum/component/orbiter can_transfer = TRUE dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Assoc list of all orbiters -> their initial matrix var/list/orbiter_list + /// Assoc list of orbiters -> their orbiting parameters + var/list/orbiter_params + /// Movement tracker used to check when our owner moves var/datum/movement_detector/tracker //radius: range to orbit at, radius of the circle formed by orbiting (in pixels) @@ -14,6 +18,7 @@ return COMPONENT_INCOMPATIBLE orbiter_list = list() + orbiter_params = list() begin_orbit(orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) @@ -39,6 +44,7 @@ for(var/i in orbiter_list) end_orbit(i) orbiter_list = null + orbiter_params = null return ..() /datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) @@ -50,11 +56,14 @@ var/atom/movable/incoming_orbiter = o incoming_orbiter.orbiting = src // It is important to transfer the signals so we don't get locked to the new orbiter component for all time - newcomp.UnregisterSignal(incoming_orbiter, COMSIG_MOVABLE_MOVED) + newcomp.UnregisterSignal(incoming_orbiter, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE)) RegisterSignal(incoming_orbiter, COMSIG_MOVABLE_MOVED, PROC_REF(orbiter_move_react)) + RegisterSignal(incoming_orbiter, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, PROC_REF(orbiter_before_shuttle_move)) orbiter_list += newcomp.orbiter_list + orbiter_params += newcomp.orbiter_params newcomp.orbiter_list = null + newcomp.orbiter_params = null /datum/component/orbiter/PostTransfer(datum/new_parent) if(!isatom(new_parent) || isarea(new_parent) || !get_turf(new_parent)) @@ -67,11 +76,14 @@ orbiter.orbiting.end_orbit(orbiter, TRUE) else orbiter.orbiting.end_orbit(orbiter) + + orbiter_params[orbiter] = args.Copy(2) orbiter_list[orbiter] = TRUE orbiter.orbiting = src ADD_TRAIT(orbiter, TRAIT_NO_FLOATING_ANIM, ORBITING_TRAIT) RegisterSignal(orbiter, COMSIG_MOVABLE_MOVED, PROC_REF(orbiter_move_react)) + RegisterSignal(orbiter, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, PROC_REF(orbiter_before_shuttle_move)) SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_BEGIN, orbiter) @@ -103,15 +115,28 @@ orbiter.abstract_move(get_turf(parent)) to_chat(orbiter, span_notice("Now orbiting [parent].")) +/datum/component/orbiter/proc/orbiter_before_shuttle_move(atom/source) + SIGNAL_HANDLER + // We need to detach ourselves before the shuttle moves and reattach afterwards + end_orbit(source, TRUE) + RegisterSignal(source, COMSIG_ATOM_AFTER_SHUTTLE_MOVE, PROC_REF(orbiter_after_shuttle_move)) + +/datum/component/orbiter/proc/orbiter_after_shuttle_move(atom/source) + SIGNAL_HANDLER + UnregisterSignal(source, COMSIG_ATOM_AFTER_SHUTTLE_MOVE) + begin_orbit(arglist(list(source) + orbiter_params[source])) + /datum/component/orbiter/proc/end_orbit(atom/movable/orbiter, refreshing=FALSE) if(!orbiter_list[orbiter]) return - UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) + UnregisterSignal(orbiter, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_BEFORE_SHUTTLE_MOVE, COMSIG_ATOM_AFTER_SHUTTLE_MOVE)) SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_STOP, orbiter) orbiter.SpinAnimation(0, 0) if(istype(orbiter_list[orbiter],/matrix)) //This is ugly. orbiter.transform = orbiter_list[orbiter] orbiter_list -= orbiter + if(!refreshing) + orbiter_params -= orbiter orbiter.stop_orbit(src) orbiter.orbiting = null diff --git a/code/datums/components/pet_commands/fetch.dm b/code/datums/components/pet_commands/fetch.dm index 143ac9ca101..f3675534fa9 100644 --- a/code/datums/components/pet_commands/fetch.dm +++ b/code/datums/components/pet_commands/fetch.dm @@ -73,10 +73,11 @@ return var/mob/thrower = throwingdatum?.get_thrower() - if(thrower) - try_activate_command(thrower) - set_command_target(parent, thrown_thing) - parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, thrower) + if(!istype(thrower)) + return + try_activate_command(thrower) + set_command_target(parent, thrown_thing) + parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, thrower) // Don't try and fetch turfs or anchored objects if someone points at them /datum/pet_command/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom) diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 836fc7e2167..3c2ddbef1a8 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -105,7 +105,7 @@ /datum/component/profound_fisher/proc/should_fish_on(mob/living/user, atom/target) if(!HAS_TRAIT(target, TRAIT_FISHING_SPOT) || GLOB.fishing_challenges_by_user[user]) return FALSE - if(user.combat_mode || !user.CanReach(target)) + if(user.combat_mode || !target.IsReachableBy(user)) return FALSE return TRUE diff --git a/code/datums/components/prosthetic_item.dm b/code/datums/components/prosthetic_item.dm index b8876f5484f..1537535974f 100644 --- a/code/datums/components/prosthetic_item.dm +++ b/code/datums/components/prosthetic_item.dm @@ -137,6 +137,9 @@ * Returns the created pseudopart */ /mob/living/carbon/proc/make_item_prosthetic(obj/item/some_thing, target_zone = BODY_ZONE_R_ARM, fall_prob = 0) + if(HAS_TRAIT_FROM(some_thing, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) + CRASH("make_item_prosthetic given an item that is already a prosthetic limb!") + var/obj/item/bodypart/existing = get_bodypart(target_zone) existing?.drop_limb(special = TRUE) diff --git a/code/datums/components/redirect_attack_hand_from_turf.dm b/code/datums/components/redirect_attack_hand_from_turf.dm index 1e538029070..6d1327f3bcc 100644 --- a/code/datums/components/redirect_attack_hand_from_turf.dm +++ b/code/datums/components/redirect_attack_hand_from_turf.dm @@ -28,13 +28,21 @@ src.screentip_texts = screentip_texts src.interact_check = interact_check - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) connect_to_new_turf() +/datum/component/redirect_attack_hand_from_turf/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + /datum/component/redirect_attack_hand_from_turf/Destroy(force) + interact_check = null disconnect_from_old_turf() return ..() +/datum/component/redirect_attack_hand_from_turf/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + /datum/component/redirect_attack_hand_from_turf/proc/find_turf() PRIVATE_PROC(TRUE) @@ -101,7 +109,7 @@ var/atom/movable/movable_parent = parent if (!movable_parent.can_interact(user)) return NONE - + if (!isnull(interact_check) && !interact_check.Invoke(user)) return NONE @@ -123,7 +131,7 @@ if (!isnull(held_item)) return NONE - + if (!isnull(interact_check) && !interact_check.Invoke(user)) return NONE diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm index 82ed1a24da2..d5d37b72dd2 100644 --- a/code/datums/components/reflection.dm +++ b/code/datums/components/reflection.dm @@ -148,9 +148,9 @@ SIGNAL_HANDLER var/atom/movable/reflection = LAZYACCESS(reflected_movables, target) - if(reflection) - qdel(reflection) LAZYREMOVE(reflected_movables, target) + if(!QDELETED(reflection)) + qdel(reflection) UnregisterSignal(target, check_reflect_signals) UnregisterSignal(target, COMSIG_QDELETING) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 9811339fccb..b860a8423a1 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -5,8 +5,10 @@ var/can_be_driven = TRUE /// If TRUE, this creature's abilities can be triggered by the rider while mounted var/can_use_abilities = FALSE - /// shall we require riders to go through the riding minigame if they arent in our friends list + /// Shall we require riders to go through the riding minigame if they arent in our friends list var/require_minigame = FALSE + /// Do we use vehicle_move_delay or default to mob's own movespeed? + var/uses_native_speed = FALSE /// unsharable abilities that we will force to be shared anyway var/list/override_unsharable_abilities = list() /// abilities that are always blacklisted from sharing @@ -103,8 +105,12 @@ formerly_ridden.layer = MOB_LAYER return ..() +/datum/component/riding/creature/Process_Spacemove(direction, continuous_move) + var/mob/living/living_parent = parent + return override_allow_spacemove || living_parent.Process_Spacemove(direction, continuous_move) + /datum/component/riding/creature/driver_move(atom/movable/movable_parent, mob/living/user, direction) - if(!COOLDOWN_FINISHED(src, vehicle_move_cooldown) || !Process_Spacemove()) + if(!COOLDOWN_FINISHED(src, vehicle_move_cooldown) || !Process_Spacemove(direction)) return COMPONENT_DRIVER_BLOCK_MOVE if(!keycheck(user)) if(ispath(keytype, /obj/item)) @@ -113,7 +119,8 @@ return COMPONENT_DRIVER_BLOCK_MOVE var/mob/living/living_parent = parent step(living_parent, direction) - var/modified_move_delay = vehicle_move_delay + var/datum/movespeed_modifier/slowdown = get_cached_movespeed_modifier(living_parent.get_move_intent_slowdown()) + var/modified_move_delay = uses_native_speed ? living_parent.cached_multiplicative_slowdown - slowdown?.multiplicative_slowdown : vehicle_move_delay if(HAS_TRAIT(user, TRAIT_ROUGHRIDER)) // YEEHAW! switch(HAS_TRAIT(user, TRAIT_PRIMITIVE) ? SANITY_LEVEL_GREAT : user.mob_mood?.sanity_level) if(SANITY_LEVEL_GREAT) @@ -554,7 +561,7 @@ /datum/component/riding/creature/goliath keytype = /obj/item/key/lasso - vehicle_move_delay = 4 + uses_native_speed = TRUE rider_traits = list(TRAIT_NO_FLOATING_ANIM, TRAIT_TENTACLE_IMMUNE) /datum/component/riding/creature/goliath/deathmatch @@ -630,6 +637,17 @@ return charger.summoner == user /datum/component/riding/creature/goldgrub + uses_native_speed = TRUE + +/datum/component/riding/creature/goldgrub/Initialize(mob/living/riding_mob, force, ride_check_flags) + . = ..() + var/mob/living/basic/mining/goldgrub/goldgrub = parent + goldgrub.add_movespeed_modifier(/datum/movespeed_modifier/goldgrub_mount) + +/datum/component/riding/creature/goldgrub/Destroy(force) + var/mob/living/basic/mining/goldgrub/goldgrub = parent + goldgrub.remove_movespeed_modifier(/datum/movespeed_modifier/goldgrub_mount) + return ..() /datum/component/riding/creature/goldgrub/get_rider_offsets_and_layers(pass_index, mob/offsetter) return list( @@ -676,7 +694,7 @@ if(!isclosedturf(pointed)) return var/mob/living/basic/basic_parent = parent - if(!basic_parent.CanReach(pointed)) + if(!pointed.IsReachableBy(basic_parent)) return basic_parent.melee_attack(pointed) @@ -686,6 +704,7 @@ /datum/component/riding/creature/raptor require_minigame = TRUE + uses_native_speed = TRUE ride_check_flags = RIDER_NEEDS_ARM | UNBUCKLE_DISABLED_RIDER /datum/component/riding/creature/raptor/Initialize(mob/living/riding_mob, force, ride_check_flags) @@ -743,8 +762,5 @@ if (istype(raptor)) raptor.adjust_offsets(dir) -/datum/component/riding/creature/raptor/fast - vehicle_move_delay = 1.5 - /datum/component/riding/creature/raptor/combat ai_behavior_while_ridden = RIDING_PAUSE_AI_MOVEMENT diff --git a/code/datums/components/storm_hating.dm b/code/datums/components/storm_hating.dm index 896c9cd471a..62a59a0ad71 100644 --- a/code/datums/components/storm_hating.dm +++ b/code/datums/components/storm_hating.dm @@ -19,6 +19,7 @@ . = ..() RegisterSignal(parent, COMSIG_ENTER_AREA, PROC_REF(on_area_entered)) RegisterSignal(parent, COMSIG_EXIT_AREA, PROC_REF(on_area_exited)) + RegisterSignal(parent, COMSIG_MOB_LOGIN, PROC_REF(on_login)) /datum/component/storm_hating/UnregisterFromParent() . = ..() @@ -46,3 +47,7 @@ return parent_atom.fade_into_nothing(life_time = 3 SECONDS, fade_time = 2 SECONDS) qdel(src) + +/datum/component/storm_hating/proc/on_login(datum/source) + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index fa533db97bd..cf970d93910 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -97,7 +97,7 @@ ADD_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips /datum/component/style/RegisterWithParent() - RegisterSignal(parent, COMSIG_USER_ITEM_INTERACTION, PROC_REF(hotswap)) + RegisterSignal(parent, COMSIG_USER_PRE_ITEM_ATTACK, PROC_REF(hotswap)) RegisterSignal(parent, COMSIG_MOB_MINED, PROC_REF(on_mine)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) RegisterSignal(parent, COMSIG_MOB_EMOTED("taunt"), PROC_REF(on_taunt)) @@ -112,7 +112,7 @@ ADD_TRAIT(parent, TRAIT_MINING_PARRYING, STYLE_TRAIT) /datum/component/style/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_USER_ITEM_INTERACTION) + UnregisterSignal(parent, COMSIG_USER_PRE_ITEM_ATTACK) UnregisterSignal(parent, COMSIG_MOB_MINED) UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) UnregisterSignal(parent, COMSIG_MOB_EMOTED("taunt")) @@ -295,27 +295,28 @@ return "#364866" /// A proc that lets a user, when their rank >= `hotswap_rank`, swap items in storage with what's in their hands, simply by clicking on the stored item with a held item -/datum/component/style/proc/hotswap(mob/living/source, atom/target, obj/item/weapon, list/modifiers) +/datum/component/style/proc/hotswap(mob/living/source, obj/item/weapon, atom/target, list/modifiers) SIGNAL_HANDLER - - if((rank < hotswap_rank) || !isitem(target) || !(target in source.get_all_contents())) + if((rank < hotswap_rank) || !isitem(target) || get(target, /mob/living) != source) return NONE var/obj/item/item_target = target - if(!(item_target.item_flags & IN_STORAGE)) return NONE - var/datum/storage/atom_storage = item_target.loc.atom_storage + INVOKE_ASYNC(src, PROC_REF(hotswap_interact), source, weapon, target, modifiers) + return COMPONENT_CANCEL_ATTACK_CHAIN +/datum/component/style/proc/hotswap_interact(mob/living/source, obj/item/weapon, atom/target, list/modifiers) + var/datum/storage/atom_storage = target.loc.atom_storage if(!atom_storage.can_insert(weapon, source, messages = FALSE)) source.balloon_alert(source, "unable to hotswap!") - return NONE + return - atom_storage.attempt_insert(weapon, source, override = TRUE) - INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, put_in_hands), target) - source.visible_message(span_notice("[source] quickly swaps [weapon] out with [target]!"), span_notice("You quickly swap [weapon] with [target].")) - return ITEM_INTERACT_BLOCKING + if (atom_storage.attempt_insert(weapon, source, override = TRUE) && source.put_in_hands(target)) + source.visible_message(span_notice("[source] quickly swaps [weapon] out with [target]!"), span_notice("You quickly swap [weapon] with [target].")) + else + source.balloon_alert(source, "unable to hotswap!") // Point givers /datum/component/style/proc/on_punch(mob/living/carbon/human/punching_person, atom/attacked_atom, proximity) diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 5f8e1b471b6..46ff3f281ab 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -24,6 +24,7 @@ /datum/component/subtype_picker/Destroy(force) on_picked_callback = null + subtype2descriptions = null return ..() /datum/component/subtype_picker/RegisterWithParent() @@ -69,11 +70,12 @@ return var/picked_subtype = name2subtype[name_of_type] - picked_subtype = new picked_subtype(picker.drop_location()) - on_picked_callback?.Invoke(picked_subtype, picker) + var/obj/item/picked = new picked_subtype(picker.drop_location()) + on_picked_callback?.Invoke(picked, picker) + SEND_SIGNAL(picked, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, target, picker) qdel(target) - picker.put_in_hands(picked_subtype) + picker.put_in_hands(picked) /** * Checks if we are allowed to interact with the radial menu diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 1b79c2e2978..e722d5ba865 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -411,6 +411,13 @@ if(istype(potential_spine)) defense_mod += potential_spine.strength_bonus + if(istype(tackle_target.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/blade)) + defense_mod += 8 + if(istype(tackle_target.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/rust)) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/rust_robes = tackle_target.wear_suit + if(rust_robes.rusted) + defense_mod += 10 + // OF-FENSE var/mob/living/carbon/sacker = parent var/sacker_drunkenness = sacker.get_drunk_amount() diff --git a/code/datums/components/tether.dm b/code/datums/components/tether.dm index b2aedaeb9ff..e156640682f 100644 --- a/code/datums/components/tether.dm +++ b/code/datums/components/tether.dm @@ -286,7 +286,7 @@ /datum/component/tether/proc/process_beam_click(atom/source, atom/location, params, mob/user) var/turf/nearest_turf for (var/turf/line_turf in get_line(get_turf(parent), get_turf(tether_target))) - if (user.CanReach(line_turf)) + if (line_turf.IsReachableBy(user)) nearest_turf = line_turf break diff --git a/code/datums/components/torn_wall.dm b/code/datums/components/torn_wall.dm index 9b36921a39f..5de757e9fd8 100644 --- a/code/datums/components/torn_wall.dm +++ b/code/datums/components/torn_wall.dm @@ -13,10 +13,11 @@ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/current_stage = TORN_WALL_INITIAL -/datum/component/torn_wall/Initialize() +/datum/component/torn_wall/Initialize(current_stage) . = ..() if (!isclosedturf(parent) || isindestructiblewall(parent)) return COMPONENT_INCOMPATIBLE + src.current_stage = current_stage || src.current_stage /datum/component/torn_wall/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined)) diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index eda01737231..a8116bd6900 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -114,10 +114,10 @@ /datum/component/transforming/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_SHARPEN_ACT, COMSIG_DETECTIVE_SCANNED)) -/datum/component/transforming/proc/on_scan(datum/source, mob/user, list/extra_data) +/datum/component/transforming/proc/on_scan(datum/source, mob/user, datum/detective_scanner_log/entry) SIGNAL_HANDLER - LAZYADD(extra_data[DETSCAN_CATEGORY_NOTES], "Readings suggest some form of state changing.") + entry.add_data_entry(DETSCAN_CATEGORY_NOTES, "Readings suggest some form of state changing.") /* * Called on [COMSIG_ITEM_ATTACK_SELF]. diff --git a/code/datums/dna/blocks/dna_features_block.dm b/code/datums/dna/blocks/dna_features_block.dm index e37f6f78c93..758919be31e 100644 --- a/code/datums/dna/blocks/dna_features_block.dm +++ b/code/datums/dna/blocks/dna_features_block.dm @@ -31,7 +31,7 @@ // One day, someone should consider merging all tails into one, this is stupid // No I don't care that it will "Create situations where a felinid grows a lizard tail" that makes it more fun /datum/dna_block/feature/tail - feature_key = FEATURE_TAIL + feature_key = FEATURE_TAIL_CAT /datum/dna_block/feature/tail/create_unique_block(mob/living/carbon/human/target) return construct_block(SSaccessories.tails_list_felinid.Find(target.dna.features[feature_key]), length(SSaccessories.tails_list_felinid)) diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 8eaf86e2a3f..c2865f36258 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -37,7 +37,7 @@ examine_list["climbable"] = "It looks like it can be climbed on." /datum/element/climbable/proc/can_climb(atom/source, mob/user) - if (!user.CanReach(source)) + if (!source.IsReachableBy(user)) return FALSE var/dir_step = get_dir(user, source.loc) //To jump over a railing you have to be standing next to it, not far behind it. diff --git a/code/datums/elements/cuffable_item.dm b/code/datums/elements/cuffable_item.dm new file mode 100644 index 00000000000..4d22337098f --- /dev/null +++ b/code/datums/elements/cuffable_item.dm @@ -0,0 +1,69 @@ +///This element allows the item it's attached to be bound to oneself's arm with a pair of handcuffs (sold separately). Borgs need not to apply +/datum/element/cuffable_item + +/datum/element/cuffable_item/Attach(datum/target) + . = ..() + + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + RegisterSignal(target, COMSIG_ATOM_ITEM_INTERACTION_SECONDARY, PROC_REF(item_interaction)) + + var/atom/atom_target = target + atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + +///Tell the player about the interaction if they examine the item twice. +/datum/element/cuffable_item/proc/on_examine_more(obj/item/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(length(user.held_items) < 0 || iscyborg(user) || source.anchored) + return + examine_list += span_smallnotice("You could bind [source.p_they()] to your wrist with a pair of handcuffs...") + +///Give context to players holding a pair of handcuffs when hovering the item +/datum/element/cuffable_item/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + if (!istype(held_item, /obj/item/restraints/handcuffs)) + return NONE + var/obj/item/restraints/handcuffs/cuffs = held_item + if(!cuffs.used) + context[SCREENTIP_CONTEXT_RMB] = "Cuff to your wrist" + return CONTEXTUAL_SCREENTIP_SET + +/datum/element/cuffable_item/proc/item_interaction(obj/item/source, mob/living/user, obj/item/tool, modifiers) + SIGNAL_HANDLER + + if(!istype(tool, /obj/item/restraints/handcuffs) || iscyborg(user) || source.anchored || !source.IsReachableBy(user)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(apply_cuffs), source, user, tool) + return ITEM_INTERACT_SUCCESS + +///The proc responsible for adding the status effect to the player and all... +/datum/element/cuffable_item/proc/apply_cuffs(obj/item/source, mob/living/user, obj/item/restraints/handcuffs/cuffs) + if(cuffs.used || DOING_INTERACTION_WITH_TARGET(user, source)) + return + + if(HAS_TRAIT_FROM(source, TRAIT_NODROP, CUFFED_ITEM_TRAIT)) + to_chat(user, span_warning("[source] is already cuffed to your wrist!")) + return + + if(cuffs.handcuffs_clumsiness_check(user)) + return + + source.balloon_alert(user, "cuffing item...") + playsound(source, cuffs.cuffsound, 30, TRUE, -2) + if(!do_after(user, cuffs.get_handcuff_time(user), source)) + return + + playsound(source, cuffs.cuffsuccesssound, 30, TRUE, -2) + + if(user.apply_status_effect(/datum/status_effect/cuffed_item, source, cuffs)) + source.balloon_alert(user, "item cuffed to wrist") + return + + source.balloon_alert(user, "couldn't cuff to wrist!") + return diff --git a/code/datums/elements/cuffsnapping.dm b/code/datums/elements/cuffsnapping.dm index 3640b0a5bd8..47728af0744 100644 --- a/code/datums/elements/cuffsnapping.dm +++ b/code/datums/elements/cuffsnapping.dm @@ -49,12 +49,20 @@ UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_SECONDARY, COMSIG_ATOM_EXAMINE, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) return ..() -/datum/element/cuffsnapping/proc/add_item_context(obj/item/source, list/context, mob/living/carbon/target, mob/living/user) +/datum/element/cuffsnapping/proc/add_item_context(obj/item/source, list/context, atom/target, mob/living/user) SIGNAL_HANDLER - if(!iscarbon(target) || !target.handcuffed) + if(!isliving(target)) //Removing restraints takes precedence return NONE - context[SCREENTIP_CONTEXT_RMB] = "Cut Restraints" - return CONTEXTUAL_SCREENTIP_SET + var/mob/living/living_target = target + if(iscarbon(living_target)) + var/mob/living/carbon/carbon_target = living_target + if(carbon_target.handcuffed) + context[SCREENTIP_CONTEXT_RMB] = "Cut Restraints" + return CONTEXTUAL_SCREENTIP_SET + if(living_target.has_status_effect(/datum/status_effect/cuffed_item)) + context[SCREENTIP_CONTEXT_RMB] = "Remove Binds From Item" + return CONTEXTUAL_SCREENTIP_SET + return NONE ///signal called on parent being examined /datum/element/cuffsnapping/proc/on_examine(datum/target, mob/user, list/examine_list) @@ -72,48 +80,74 @@ examine_list += span_notice(examine_string) -/datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/living/cutter_user, list/modifiers) +///Signal called on parent when it right-clicks another mob. +/datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/target, mob/living/cutter_user, list/modifiers) SIGNAL_HANDLER - if(!istype(target)) //we aren't the kind of mob that can even have cuffs, so we skip. - return - - if(!target.handcuffed) - return - - var/obj/item/restraints/handcuffs/cuffs = target.handcuffed - - if(!istype(cuffs)) - return - - if(cuffs.restraint_strength && isnull(src.snap_time_strong)) - cutter_user.visible_message(span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) - return COMPONENT_SKIP_ATTACK - - else if(isnull(src.snap_time_weak)) - cutter_user.visible_message(span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!")) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) - return COMPONENT_SKIP_ATTACK - - . = COMPONENT_SKIP_ATTACK - - INVOKE_ASYNC(src, PROC_REF(do_cuffsnap_target), cutter, target, cutter_user, cuffs) - -/datum/element/cuffsnapping/proc/do_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs) if(LAZYACCESS(cutter_user.do_afters, cutter)) return + var/mob/living/carbon/carbon_target = target + if(!istype(carbon_target) || !carbon_target.handcuffed) + var/datum/status_effect/cuffed_item/cuffed_status = target.has_status_effect(/datum/status_effect/cuffed_item) + if(!cuffed_status) + return NONE + INVOKE_ASYNC(src, PROC_REF(try_cuffsnap_item), cutter, target, cutter_user, cuffed_status.cuffed, cuffed_status.cuffs) + return COMPONENT_SKIP_ATTACK + + var/obj/item/restraints/handcuffs/cuffs = carbon_target.handcuffed + + if(!istype(cuffs)) + return NONE + + if(check_cuffs_strength(carbon_target, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through [target]'s restraints with [cutter], but fails!"))) + INVOKE_ASYNC(src, PROC_REF(do_cuffsnap_target), cutter, target, cutter_user, cuffs) + + return COMPONENT_SKIP_ATTACK + +///Check that the type of restraints can be cut by this element. +/datum/element/cuffsnapping/proc/check_cuffs_strength(obj/item/cutter, mob/living/target, mob/living/cutter_user, obj/item/restraints/handcuffs/cuffs, message) + if(cuffs.restraint_strength ? snap_time_strong : snap_time_weak) + return TRUE + cutter_user.visible_message(message) + playsound(source = get_turf(cutter), soundin = cutter.usesound || cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) + return FALSE + +///Called when a player tries to remove the cuffs restraining another mob. +/datum/element/cuffsnapping/proc/do_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs) + if(LAZYACCESS(cutter_user.do_afters, cutter)) + return log_combat(cutter_user, target, "cut or tried to cut [target]'s cuffs", cutter) - var/snap_time = src.snap_time_weak - if(cuffs.restraint_strength) - snap_time = src.snap_time_strong + do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts [target]'s restraints with [cutter]!")) - if(snap_time == 0 || do_after(cutter_user, snap_time, target, interaction_key = cutter)) // If 0 just do it. This to bypass the do_after() creating a needless progress bar. - cutter_user.do_attack_animation(target, used_item = cutter) - cutter_user.visible_message(span_notice("[cutter_user] cuts [target]'s restraints with [cutter]!")) - qdel(target.handcuffed) - playsound(source = get_turf(cutter), soundin = cutter.usesound ? cutter.usesound : cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) +///Called when a player tries to remove the cuffs binding an item to their owner +/datum/element/cuffsnapping/proc/try_cuffsnap_item(obj/item/cutter, mob/living/target, mob/living/cutter_user, obj/item/cuffed, obj/item/restraints/handcuffs/cuffs) + if(check_cuffs_strength(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] tries to cut through the restraints binding [cuffed] to [target], but fails!"))) + return - return + log_combat(cutter_user, target, "cut or tried to cut restraints binding [cuffed] to") + + do_snip_snap(cutter, target, cutter_user, cuffs, span_notice("[cutter_user] cuts the restraints binding [src] to [target] with [cutter]!")) + +///The proc responsible for the very timed action that deletes the cuffs +/datum/element/cuffsnapping/proc/do_snip_snap(obj/item/cutter, mob/living/target, mob/cutter_user, obj/item/restraints/handcuffs/cuffs, message) + var/snap_time = cuffs.restraint_strength ? snap_time_strong : snap_time_weak + + var/target_was_restrained = FALSE + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + target_was_restrained = carbon_target.handcuffed + + if(snap_time) + if(!do_after(cutter_user, snap_time, target, interaction_key = cutter)) // If 0 just do it. This to bypass the do_after() creating a needless progress bar. + return + if(target_was_restrained) //Removing restraints takes priority over cuffed items. This only applies for carbon mobs, but we need to make sure the restraints are still the same. + var/mob/living/carbon/carbon_target = target + if(carbon_target.handcuffed != cuffs) + return + + cutter_user.do_attack_animation(target, used_item = cutter) + cutter_user.visible_message(message) + qdel(cuffs) + playsound(source = get_turf(cutter), soundin = cutter.usesound || cutter.hitsound, vol = cutter.get_clamped_volume(), vary = TRUE) diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm index 8eb73bbb438..f93288303bd 100644 --- a/code/datums/elements/drag_pickup.dm +++ b/code/datums/elements/drag_pickup.dm @@ -1,7 +1,8 @@ /** - * drag_pickup element; for allowing things to be picked up by dragging. + * drag_pickup element * - * Used for paper bins. + * Allowing things to be picked up or unequipped by mouse-dragging. + * Useful for objects which have an interaction on click */ /datum/element/drag_pickup @@ -15,20 +16,22 @@ UnregisterSignal(source, COMSIG_MOUSEDROP_ONTO) return ..() -/datum/element/drag_pickup/proc/pick_up(atom/source, atom/over, mob/user) +/datum/element/drag_pickup/proc/pick_up(atom/movable/source, atom/over, mob/user) SIGNAL_HANDLER - var/mob/living/picker = user - if(!istype(picker) || !user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) - return - var/obj/pickup_object = source - if (pickup_object) - if (pickup_object.anchored) + if(!user.can_perform_action(source, FORBID_TELEKINESIS_REACH)) + return NONE + if(source.anchored) + return NONE + if(source.loc == user && isitem(source)) + var/obj/item/item_source = source + if(!item_source.can_mob_unequip(user)) return COMPONENT_CANCEL_MOUSEDROP_ONTO - if(over == picker) - INVOKE_ASYNC(picker, TYPE_PROC_REF(/mob/, put_in_hands), source) + if(over == user) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, put_in_hands), source) else if(istype(over, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/Selected_hand = over - picker.putItemFromInventoryInHandIfPossible(source, Selected_hand.held_index) + var/atom/movable/screen/inventory/hand/selected_hand = over + user.putItemFromInventoryInHandIfPossible(source, selected_hand.held_index) + source.add_fingerprint(user) return COMPONENT_CANCEL_MOUSEDROP_ONTO diff --git a/code/datums/elements/effect_trail.dm b/code/datums/elements/effect_trail.dm index d1d2fbec44a..58fddf51216 100644 --- a/code/datums/elements/effect_trail.dm +++ b/code/datums/elements/effect_trail.dm @@ -16,13 +16,55 @@ src.chosen_effect = chosen_effect /datum/element/effect_trail/Detach(datum/target) - . = ..() UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + return ..() /// Generates an effect /datum/element/effect_trail/proc/generate_effect(atom/movable/target_object) SIGNAL_HANDLER var/turf/open/open_turf = get_turf(target_object) - if(istype(open_turf)) - new chosen_effect(open_turf) + if(!istype(open_turf)) + return + new chosen_effect(open_turf) + +/// If we are a cosmic heretic, this will return the appropriate effect trail based on our passive level. returns the default trail otherwise +/proc/cosmic_trail_based_on_passive(mob/living/source) + if(isstargazer(source)) + return /datum/element/effect_trail/cosmic_field/antiprojectile + + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = source.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return /datum/element/effect_trail/cosmic_field + if(cosmic_passive.passive_level == 3) + return /datum/element/effect_trail/cosmic_field/antiprojectile + if(cosmic_passive.passive_level == 2) + return /datum/element/effect_trail/cosmic_field/antiexplosion + return /datum/element/effect_trail + +/datum/element/effect_trail/cosmic_field // Cosmic field subtype which applies any upgrades + var/prevents_explosions = FALSE + var/slows_projectiles = FALSE + +/datum/element/effect_trail/cosmic_field/Attach(datum/target, chosen_effect) + . = ..() + if(!ispath(chosen_effect, /obj/effect/forcefield/cosmic_field)) + stack_trace("Tried to attach a cosmic_field effect trail with a non-cosmic field as the chosen effect") + +/datum/element/effect_trail/cosmic_field/generate_effect(atom/movable/target_object) + var/turf/open/open_turf = get_turf(target_object) + if(!istype(open_turf)) + return + var/obj/effect/forcefield/cosmic_field/new_field = new chosen_effect(open_turf) + + if(prevents_explosions) + new_field.prevents_explosions() + if(slows_projectiles) + new_field.slows_projectiles() + +/datum/element/effect_trail/cosmic_field/antiexplosion + prevents_explosions = TRUE + +/datum/element/effect_trail/cosmic_field/antiprojectile + prevents_explosions = TRUE + slows_projectiles = TRUE diff --git a/code/datums/elements/examine_lore.dm b/code/datums/elements/examine_lore.dm new file mode 100644 index 00000000000..00066ef51c5 --- /dev/null +++ b/code/datums/elements/examine_lore.dm @@ -0,0 +1,39 @@ +/// A simple element for adding additional lore to things. Examine more? More like examine *lore*. +/// Yes, the name's a pun, I'm sorry, I thought it was funny at the moment. +/datum/element/examine_lore + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// The message we add to items to denote that we have cool lore to read. + var/lore_hint + /// Our lore. In order to match descriptions on items, this should be considered to be pre-italicized. + var/lore + +/datum/element/examine_lore/Attach(datum/target, lore_hint, lore) + . = ..() + + src.lore_hint = lore_hint + src.lore = lore + + if(!lore_hint || !lore) + stack_trace("[type] initialized without lore or a lore hint! Double-check element addition?") + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + + +/datum/element/examine_lore/Detach(datum/source, ...) + . = ..() + + UnregisterSignal(source, list( + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_EXAMINE_MORE, + )) + +/datum/element/examine_lore/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += lore_hint + +/datum/element/examine_lore/proc/on_examine_more(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += "[lore]" diff --git a/code/datums/elements/leeching_walk.dm b/code/datums/elements/leeching_walk.dm index f5148b43a5a..a0d9e7a2706 100644 --- a/code/datums/elements/leeching_walk.dm +++ b/code/datums/elements/leeching_walk.dm @@ -1,5 +1,6 @@ /// Buffs and heals the target while standing on rust. /datum/element/leeching_walk + var/healing_multiplier = 1.0 // How much healing to do /datum/element/leeching_walk/Attach(datum/target) . = ..() @@ -43,13 +44,14 @@ // Heals all damage + Stamina var/need_mob_update = FALSE var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. - need_mob_update += source.adjustBruteLoss(-3 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustFireLoss(-3 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustToxLoss(-3 * delta_time, updating_health = FALSE, forced = TRUE) // Slimes are people too - need_mob_update += source.adjustOxyLoss(-1.5 * delta_time, updating_health = FALSE) - need_mob_update += source.adjustStaminaLoss(-10 * delta_time, updating_stamina = FALSE) + need_mob_update += source.adjustBruteLoss(-3 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjustFireLoss(-3 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjustToxLoss(-3 * delta_time * healing_multiplier, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjustOxyLoss(-1.5 * delta_time * healing_multiplier, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-10 * delta_time * healing_multiplier, updating_stamina = FALSE) if(need_mob_update) source.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(source), COLOR_BROWN) // Reduces duration of stuns/etc source.AdjustAllImmobility((-0.5 SECONDS) * delta_time) // Heals blood loss @@ -57,3 +59,10 @@ source.blood_volume += 2.5 * delta_time // Slowly regulates your body temp source.adjust_bodytemperature((source.get_body_temp_normal() - source.bodytemperature) / 5) + +/datum/element/leeching_walk/minor + healing_multiplier = 0.5 + +// Minor variant which heals slightly less and no baton resistance +/datum/element/leeching_walk/minor/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + return diff --git a/code/datums/elements/nullrod_core.dm b/code/datums/elements/nullrod_core.dm new file mode 100644 index 00000000000..020874777d5 --- /dev/null +++ b/code/datums/elements/nullrod_core.dm @@ -0,0 +1,38 @@ +///Proxy element that attaches components, elements and traits that are common to more or less all nullrods. +/datum/element/nullrod_core + +/** + * Called when the element is added to a datum. If the 'chaplain_spawnable' arg is TRUE and unit testing is enabled, + * we check that the target is actually in the nullrod_variants global list + */ +/datum/element/nullrod_core/Attach(obj/item/target, chaplain_spawnable = TRUE, rune_remove_line = "BEGONE FOUL MAGIKS!!") + . = ..() + if(!istype(target)) + return ELEMENT_INCOMPATIBLE + + target.AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + target.AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = rune_remove_line, \ + tip_text = "Clear rune", \ + on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed), target), \ + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ + ) + target.AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + ADD_TRAIT(target, TRAIT_NULLROD_ITEM, ELEMENT_TRAIT(type)) + + if(!PERFORM_ALL_TESTS(focus_only/nullrod_variants) || !chaplain_spawnable) + return + + if(!GLOB.nullrod_variants[target.type]) + stack_trace("[target.type] is absent from the nullrod_variants global list. Please include it.") + +/// Callback for effect remover, invoked when a cult rune is cleared +/datum/element/nullrod_core/proc/on_cult_rune_removed(obj/item/nullrod, obj/effect/target, mob/living/user) + if(!istype(target, /obj/effect/rune)) + return + + var/obj/effect/rune/target_rune = target + if(target_rune.log_when_erased) + user.log_message("erased [target_rune.cultist_name] rune using [nullrod]", LOG_GAME) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index 9059223fb0c..b43ec92a2bc 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -20,7 +20,7 @@ if((target.z == 0) || (user.z == 0) || target.z == user.z) return NONE var/turf/target_turf = parse_caught_click_modifiers(modifiers, get_turf(user.client?.eye || user), user.client) - if(target_turf?.z == user.z && user.CanReach(target_turf, source)) + if(target_turf?.z == user.z && target_turf.IsReachableBy(user, source?.reach)) INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), target_turf, user, modifiers) return ITEM_INTERACT_BLOCKING return NONE diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 5d16fbb4e1b..6dd9e8dfd47 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -74,8 +74,8 @@ var/obj/item/hit_item = hit_atom if(!hit_item.throwforce) return - var/mob/thrown_by = throwingdatum?.get_thrower() - if(!ismob(thrown_by)) + var/atom/thrown_by = throwingdatum?.get_thrower() + if(!istype(thrown_by)) return relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm index 2bc63c12737..91bcd038d57 100644 --- a/code/datums/elements/rust.dm +++ b/code/datums/elements/rust.dm @@ -36,7 +36,7 @@ /datum/element/rust/proc/handle_examine(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER - examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off.") + examine_text += span_notice("[source] is very rusty, you could probably burn or scrape it off, hell maybe even pour some space cola on it to remove the rust.") /datum/element/rust/proc/apply_rust_overlay(atom/parent_atom, list/overlays) SIGNAL_HANDLER @@ -115,6 +115,10 @@ /datum/element/rust/heretic/proc/on_entered(turf/source, atom/movable/entered, ...) SIGNAL_HANDLER + if(ismecha(entered)) + var/obj/vehicle/sealed/mecha/victim = entered + victim.take_damage(20, armour_penetration = 100) + return if(!isliving(entered)) return var/mob/living/victim = entered diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 2fe4b4b0680..b2542f10139 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -189,9 +189,14 @@ * All string keys in the list must be inside tgui\packages\tgui\interfaces\StripMenu.tsx * You can also return null if there are no alternate actions. */ -/datum/strippable_item/proc/get_alternate_actions(atom/source, mob/user) +/datum/strippable_item/proc/get_alternate_actions(atom/source, mob/user, obj/item/item) RETURN_TYPE(/list) - return null + SHOULD_CALL_PARENT(TRUE) + + var/list/alt_actions = list() + if(item) + SEND_SIGNAL(item, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS, source, user, alt_actions) + return alt_actions /** * Performs an alternate action on this strippable_item. @@ -200,9 +205,9 @@ * - action_key: The key of the alternate action to perform. * Returns FALSE if unable to perform the action; whether it be due to the signal or some other factor. */ -/datum/strippable_item/proc/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/proc/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) SHOULD_CALL_PARENT(TRUE) - if(SEND_SIGNAL(user, COMSIG_TRY_ALT_ACTION, source, action_key) & COMPONENT_CANT_ALT_ACTION) + if(item && SEND_SIGNAL(item, COMSIG_ITEM_STRIPPABLE_ALT_ACTION, source, user, action_key) & COMPONENT_ALT_ACTION_DONE) return FALSE return TRUE @@ -380,9 +385,10 @@ LAZYINITLIST(result) - result["icon"] = icon2base64(icon(item.icon, item.icon_state)) + result["icon"] = icon2base64(icon(item.icon, item.icon_state, frame = 1)) result["name"] = item.name - result["alternate"] = item_data.get_alternate_actions(owner, user) + result["alternate"] = item_data.get_alternate_actions(owner, user, item) + list_clear_nulls(result["alternate"]) var/static/list/already_cried = list() if(length(result["alternate"]) > 3 && !(type in already_cried)) stack_trace("Too many alternate actions for [type]! Only three are supported at the moment! This will look bad!") @@ -493,16 +499,14 @@ return var/item = strippable_item.get_item(owner) - if (isnull(item)) - return - if (!(alt_action in strippable_item.get_alternate_actions(owner, user))) + if (!(alt_action in strippable_item.get_alternate_actions(owner, user, item))) return LAZYORASSOCLIST(interactions, user, key) // Potentially yielding - strippable_item.perform_alternate_action(owner, user, alt_action) + strippable_item.perform_alternate_action(owner, user, alt_action, item) LAZYREMOVEASSOC(interactions, user, key) diff --git a/code/datums/embedding.dm b/code/datums/embedding.dm index dd6c044f79c..1c876468350 100644 --- a/code/datums/embedding.dm +++ b/code/datums/embedding.dm @@ -313,7 +313,7 @@ /// Someone attempted to pull us out! Either the owner by inspecting themselves, or someone else by examining the owner and clicking the link. /datum/embedding/proc/rip_out(mob/living/jack_the_ripper) - if (!jack_the_ripper.CanReach(owner)) + if (!owner.IsReachableBy(jack_the_ripper)) return if (!jack_the_ripper.can_perform_action(owner, FORBID_TELEKINESIS_REACH | NEED_HANDS | ALLOW_RESTING)) diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 1f6f61eda0a..47aebcf2c25 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -467,7 +467,7 @@ ACCESS_HOP, ) job = /datum/job/clown - honorifics = list("the Clown") + honorifics = list(" the Clown") honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE /datum/id_trim/job/cook @@ -825,7 +825,7 @@ ACCESS_HOP, ) job = /datum/job/mime - honorifics = list("the Mime") + honorifics = list(" the Mime") honorific_positions = HONORIFIC_POSITION_LAST_FULL | HONORIFIC_POSITION_NONE /datum/id_trim/job/paramedic diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index 2b2b00e19a1..d2f62f28174 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -68,7 +68,13 @@ //If we reserve a random sound channel, store the channel number here so we can clean it up later. var/reserved_channel -/datum/looping_sound/New(_parent, start_immediately = FALSE, _direct = FALSE, _skip_starting_sounds = FALSE) +/datum/looping_sound/New( + _parent, + start_immediately = FALSE, + _direct = FALSE, + _skip_starting_sounds = FALSE, + sound_channel, +) if(!mid_sounds) WARNING("A looping sound datum was created without sounds to play.") return @@ -76,6 +82,7 @@ set_parent(_parent) direct = _direct skip_starting_sounds = _skip_starting_sounds + src.sound_channel = sound_channel if(start_immediately) start() @@ -164,9 +171,9 @@ */ /datum/looping_sound/proc/play(soundfile, volume_override) var/sound/sound_to_play = sound(soundfile) + sound_to_play.channel = sound_channel || SSsounds.random_available_channel() + sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override if(direct) - sound_to_play.channel = sound_channel || SSsounds.random_available_channel() - sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override SEND_SOUND(parent, sound_to_play) else playsound( @@ -176,6 +183,7 @@ vary, extra_range, falloff_exponent = falloff_exponent, + channel = sound_to_play.channel, pressure_affected = pressure_affected, ignore_walls = ignore_walls, falloff_distance = falloff_distance, diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 9d9407636d8..b2564093a33 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -113,7 +113,8 @@ strength_bonus *= potential_spine.strength_bonus damage += round(athletics_skill * check_streak(attacker, defender) + strength_bonus, 1) - grant_experience = TRUE + if(defender.stat <= HARD_CRIT) // Do not grant experience against dead targets + grant_experience = TRUE var/current_atk_verb = atk_verb var/current_atk_verbed = atk_verbed @@ -160,7 +161,7 @@ return TRUE if(grant_experience) - skill_experience_adjustment(attacker, (damage/lower_force)) + skill_experience_adjustment(attacker, defender, (damage/lower_force)) //Determine our attackers athletics level as a knockout probability bonus var/attacker_athletics_skill = (attacker.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER) + base_unarmed_effectiveness) @@ -180,7 +181,7 @@ playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE) new /obj/effect/temp_visual/crit(get_turf(defender)) - skill_experience_adjustment(attacker, experience_earned) //double experience for a successful crit + skill_experience_adjustment(attacker, defender, experience_earned) //double experience for a successful crit return TRUE @@ -221,7 +222,7 @@ return TRUE /// Handles our instances of experience gain while boxing. It also applies the exercised status effect. -/datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, experience_value) +/datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, mob/living/defender, experience_value) //Boxing in heavier gravity gives you more experience var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 1 : 2 @@ -261,7 +262,7 @@ experience_earned = 2 // WE reward experience for getting punched while boxing - skill_experience_adjustment(boxer, experience_earned) //just getting hit a bunch doesn't net you much experience however + skill_experience_adjustment(boxer, attacker, experience_earned) //just getting hit a bunch doesn't net you much experience however if(!prob(block_chance)) return NONE @@ -307,7 +308,7 @@ default_damage_type = BRUTE boxing_traits = list(TRAIT_BOXING_READY) /// The mobs we are looking for to pass the honor check - var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG | MOB_MINING + var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG | MOB_MINING | MOB_CRUSTACEAN | MOB_REPTILE /// Our crit shout words. First word is then paired with a second word to form an attack name. var/list/first_word_strike = list("Extinction", "Brutalization", "Explosion", "Adventure", "Thunder", "Lightning", "Sonic", "Atomizing", "Whirlwind", "Tornado", "Shark", "Falcon") var/list/second_word_strike = list(" Punch", " Pawnch", "-punch", " Jab", " Hook", " Fist", " Uppercut", " Straight", " Strike", " Lunge") @@ -360,6 +361,15 @@ defender.apply_damage(rand(15,20), default_damage_type, BODY_ZONE_CHEST) +/datum/martial_art/boxing/hunter/skill_experience_adjustment(mob/living/boxer, mob/living/defender, experience_value) + if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna)) + return ..() //IF they're a normal human, we give the normal amount of experience instead + + var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 2 : 1 + var/big_game_bonus = (defender.maxHealth / 500) + + boxer.mind?.adjust_experience(/datum/skill/athletics, round(experience_value * (gravity_modifier + big_game_bonus), 1)) + #undef LEFT_RIGHT_COMBO #undef RIGHT_LEFT_COMBO #undef LEFT_LEFT_COMBO diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 4a447f3c02f..5c56a8a451d 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -329,7 +329,7 @@ Unless you know what you're doing, only use the first three numbers. They're in SIGNAL_HANDLER if(prob(67)) return - var/list/elegible_fish_sources = flatten_list(GLOB.preset_fish_sources) + var/list/elegible_fish_sources = assoc_to_values(GLOB.preset_fish_sources) for(var/datum/fish_source/source as anything in elegible_fish_sources) if(source.fish_source_flags & FISH_SOURCE_FLAG_NO_BLUESPACE_ROD) elegible_fish_sources -= source @@ -759,6 +759,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.25 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" + mat_rust_resistance = RUST_RESISTANCE_BASIC fish_weight_modifier = 1.2 fishing_difficulty_modifier = 30 //Sand fishing rods? What the hell are you doing? fishing_cast_range = -2 @@ -790,6 +791,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "brick" + mat_rust_resistance = RUST_RESISTANCE_BASIC fish_weight_modifier = 1.2 fishing_difficulty_modifier = 25 //Sand fishing rods? What the hell are you doing? fishing_cast_range = -2 @@ -817,6 +819,7 @@ Unless you know what you're doing, only use the first three numbers. They're in beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" + mat_rust_resistance = RUST_RESISTANCE_ORGANIC fish_weight_modifier = 0.8 fishing_difficulty_modifier = 25 fishing_cast_range = -2 diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm index dfd38434886..fbc54cf65c6 100644 --- a/code/datums/materials/pizza.dm +++ b/code/datums/materials/pizza.dm @@ -16,6 +16,7 @@ item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "pizza" + mat_rust_resistance = RUST_RESISTANCE_REINFORCED fish_weight_modifier = 0.9 fishing_difficulty_modifier = 13 fishing_cast_range = -2 diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm index 9bd02f061ac..5c684f08521 100644 --- a/code/datums/mocking/client.dm +++ b/code/datums/mocking/client.dm @@ -85,3 +85,6 @@ /datum/client_interface/proc/set_fullscreen(logging_in = FALSE) return TRUE + +/datum/client_interface/proc/check_drag_proximity(atom/dragging, atom/over, src_location, over_location, src_control, over_control, params) + return FALSE diff --git a/code/datums/mood.dm b/code/datums/mood.dm index efb84f5ef08..412a48223e2 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -260,7 +260,7 @@ /// Updates the mob's mood icon /datum/mood/proc/update_mood_icon() - if (!(mob_parent.client || mob_parent.hud_used)) + if (!(mob_parent.client || mob_parent.hud_used) || isnull(mood_screen_object)) return mood_screen_object.cut_overlays() @@ -330,6 +330,7 @@ if(hud?.infodisplay) hud.infodisplay -= mood_screen_object QDEL_NULL(mood_screen_object) + UnregisterSignal(hud, COMSIG_QDELETING) /// Handles clicking on the mood HUD object /datum/mood/proc/hud_click(datum/source, location, control, params, mob/user) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 56bb17a1b86..0ca1b52a55c 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -570,9 +570,12 @@ /datum/mood_event/see_death/add_effects(mob/dead_mob) if(isnull(dead_mob)) return + if(HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB)) + mood_change *= 0.25 + timeout *= 0.2 if(HAS_TRAIT(owner, TRAIT_CULT_HALO) && !HAS_TRAIT(dead_mob, TRAIT_CULT_HALO)) // When cultists get halos, they stop caring about death - mood_change = 4 + mood_change *= -0.5 description = "More souls for the Geometer!" return @@ -603,9 +606,9 @@ description = replacetext(normal_message, "%DEAD_MOB%", get_descriptor(dead_mob)) -/datum/mood_event/see_death/be_refreshed(datum/mood/home, ...) +/datum/mood_event/see_death/be_refreshed(datum/mood/home, mob/dead_mob, ...) // Every time we get refreshed we get worse if not desensitized - if(!HAS_TRAIT(owner, TRAIT_DESENSITIZED)) + if(!HAS_TRAIT(owner, TRAIT_DESENSITIZED) && !HAS_TRAIT(dead_mob, TRAIT_SPAWNED_MOB)) mood_change *= 1.5 return ..() diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index f5347fab41c..f38a03f933a 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -102,6 +102,13 @@ to_chat(owner, span_warning("You plunge into your mind... Yep, it's your mind.")) return + if(cast_on.has_status_effect(/datum/status_effect/heretic_passive/moon)) + to_chat(owner, span_hypnophrase(span_bolddanger("YOU SEEK THE TRUTH? I WILL SHOW YOU EVERYTHING."))) + if(isliving(owner)) + var/mob/living/reader = owner + reader.apply_status_effect(/datum/status_effect/moon_converted) + return + if(HAS_TRAIT(cast_on, TRAIT_EVIL)) to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \ you feel the overwhelming emptiness within. A truly evil being. \ diff --git a/code/datums/mutations/reach.dm b/code/datums/mutations/reach.dm index 7f4d226bcac..712be7d9e40 100644 --- a/code/datums/mutations/reach.dm +++ b/code/datums/mutations/reach.dm @@ -53,15 +53,16 @@ . = ..() if(!.) return - RegisterSignal(homan, COMSIG_ATOM_CANREACH, PROC_REF(on_canreach)) RegisterSignal(homan, COMSIG_LIVING_TRY_PUT_IN_HAND, PROC_REF(on_owner_equipping_item)) RegisterSignal(homan, COMSIG_LIVING_TRY_PULL, PROC_REF(on_owner_try_pull)) + homan.reach_length++ /datum/mutation/elastic_arms/on_losing(mob/living/carbon/human/homan) . = ..() if(.) return - UnregisterSignal(homan, list(COMSIG_ATOM_CANREACH, COMSIG_LIVING_TRY_PUT_IN_HAND, COMSIG_LIVING_TRY_PULL)) + UnregisterSignal(homan, list(COMSIG_LIVING_TRY_PUT_IN_HAND, COMSIG_LIVING_TRY_PULL)) + homan.reach_length = min(1, homan.reach_length - 1) /// signal sent when prompting if an item can be equipped /datum/mutation/elastic_arms/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/pick_item) @@ -83,30 +84,3 @@ if(item_target.w_class > WEIGHT_CLASS_BULKY) item_target.balloon_alert(owner, "arms too floppy to pull this!") return COMSIG_LIVING_CANCEL_PULL - -// probably buggy. let's enlist our players as bug testers -/datum/mutation/elastic_arms/proc/on_canreach(mob/source, atom/target) - SIGNAL_HANDLER - - var/distance = get_dist(target, source) - - // We only care about handling the reach distance, anything closer or further is handled normally. - // Also, no z-level shenanigans. Yet. - if((distance != 2) || source.z != target.z) - return - - var/direction = get_dir(source, target) - if(!direction) - return - var/turf/open/adjacent_turf = get_step(source, direction) - - // Make sure it's an open turf we're trying to pass over. - if(!istype(adjacent_turf)) - return - - // Check if there's something dense inbetween, then allow it. - for(var/atom/thing in adjacent_turf) - if(thing.density) - return - - return COMPONENT_ALLOW_REACH diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm index b89f2a6085c..f79ac17b95a 100644 --- a/code/datums/proximity_monitor/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -95,7 +95,7 @@ if(-INFINITY to -1) particle_type = /particles/grav_field_up if (particle_type) - add_shared_particles(/particles/grav_field_down/strong) + add_shared_particles(particle_type) color = particle_type::color RegisterSignal(src, COMSIG_ATOM_SMOOTHED_ICON, PROC_REF(smoothed)) diff --git a/code/datums/proximity_monitor/fields/heretic_arena.dm b/code/datums/proximity_monitor/fields/heretic_arena.dm index fc89fe824d1..4c41be6cfe6 100644 --- a/code/datums/proximity_monitor/fields/heretic_arena.dm +++ b/code/datums/proximity_monitor/fields/heretic_arena.dm @@ -63,7 +63,8 @@ GLOBAL_LIST_EMPTY(heretic_arenas) var/obj/item/melee/sickly_blade/training/new_blade = new(get_turf(human_in_range)) welfare_blades += new_blade INVOKE_ASYNC(human_in_range, TYPE_PROC_REF(/mob, put_in_hands), new_blade) - human_in_range.mind?.add_antag_datum(/datum/antagonist/heretic_arena_participant) + to_chat(human_in_range, span_boldbig("Escape is impossible. The only way out is to defeat another participant in this battle to the death.")) + human_in_range.balloon_alert(human_in_range, "start killing!") human_in_range.apply_status_effect(/datum/status_effect/arena_tracker) RegisterSignal(human_in_range, COMSIG_CAN_Z_MOVE, PROC_REF(on_try_z_move)) RegisterSignal(human_in_range, COMSIG_LADDER_TRAVEL, PROC_REF(on_try_ladder)) @@ -75,8 +76,8 @@ GLOBAL_LIST_EMPTY(heretic_arenas) mob.remove_traits(given_immunities, HERETIC_ARENA_TRAIT) mob.remove_status_effect(/datum/status_effect/arena_tracker) UnregisterSignal(mob, list(COMSIG_CAN_Z_MOVE, COMSIG_LADDER_TRAVEL, COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_POST_TELEPORT)) - if(mob.mind?.has_antag_datum(/datum/antagonist/heretic_arena_participant)) - mob.mind.remove_antag_datum(/datum/antagonist/heretic_arena_participant) + to_chat(mob, span_boldbig("Your bloodlust is sated.")) + mob.balloon_alert(mob, "escape the arena!") for(var/turf/to_restore in border_walls) to_restore.ChangeTurf(border_walls[to_restore]) for(var/obj/to_refund as anything in welfare_blades) diff --git a/code/datums/quirks/negative_quirks/food_allergy.dm b/code/datums/quirks/negative_quirks/food_allergy.dm index ba2c1711032..1f8a6e9e829 100644 --- a/code/datums/quirks/negative_quirks/food_allergy.dm +++ b/code/datums/quirks/negative_quirks/food_allergy.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(possible_food_allergies, list( if(target_foodtypes != NONE) // Got a preference, don't care return - target_foodtypes = pick(flatten_list(GLOB.possible_food_allergies)) + target_foodtypes = pick(assoc_to_values(GLOB.possible_food_allergies)) /datum/quirk/item_quirk/food_allergic/add_unique(client/client_source) var/what_are_we_actually_killed_by = english_list(bitfield_to_list(target_foodtypes, FOOD_FLAGS_IC)) // This should never be more than one thing but just in case we can support it diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index f5d2b69acab..b9dafedd7f1 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -50,7 +50,7 @@ /datum/sprite_accessory/blank name = SPRITE_ACCESSORY_NONE - icon_state = "None" + icon_state = SPRITE_ACCESSORY_NONE //////////////// // Hair Masks // diff --git a/code/datums/station_traits/admin_panel.dm b/code/datums/station_traits/admin_panel.dm index 67669027c54..9779d7b22d0 100644 --- a/code/datums/station_traits/admin_panel.dm +++ b/code/datums/station_traits/admin_panel.dm @@ -29,6 +29,8 @@ ADMIN_VERB(station_traits_panel, R_FUN, "Modify Station Traits", "Modify the sta var/list/valid_station_traits = list() for (var/datum/station_trait/station_trait_path as anything in subtypesof(/datum/station_trait)) + if(station_trait_path::abstract_type == station_trait_path) + continue valid_station_traits += list(list( "name" = initial(station_trait_path.name), "path" = station_trait_path, diff --git a/code/datums/status_effects/buffs/xray.dm b/code/datums/status_effects/buffs/xray.dm new file mode 100644 index 00000000000..cdeb909d623 --- /dev/null +++ b/code/datums/status_effects/buffs/xray.dm @@ -0,0 +1,30 @@ +/** + * Effectively grants a temporary form of x-ray with a cooldown period. + */ +/datum/status_effect/temporary_xray + id = "temp xray" + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + duration = 10 SECONDS + show_duration = TRUE + +/datum/status_effect/temporary_xray/on_apply() + ADD_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) + owner.update_sight() + return TRUE + +/datum/status_effect/temporary_xray/on_remove() + REMOVE_TRAIT(owner, TRAIT_XRAY_VISION, TRAIT_STATUS_EFFECT(id)) + owner.update_sight() + +/datum/status_effect/temporary_xray/eldritch // Heretic subtype that plays a sound and screen alert + alert_type = /atom/movable/screen/alert/status_effect/temporary_xray + +/datum/status_effect/temporary_xray/eldritch/on_apply() + . = ..() + SEND_SOUND(owner, 'sound/effects/hallucinations/i_see_you1.ogg') + +/atom/movable/screen/alert/status_effect/temporary_xray + name = "Eldritch Sight" + desc = "You get a glimpse of something new..." + icon_state = "influence" diff --git a/code/datums/status_effects/cuffed_item.dm b/code/datums/status_effects/cuffed_item.dm new file mode 100644 index 00000000000..3bd034fb097 --- /dev/null +++ b/code/datums/status_effects/cuffed_item.dm @@ -0,0 +1,165 @@ +/** + * The status effect given by the cuffable_item. + * It basically binds an item to your arm, basically making it undroppable until the cuffs or item are removed, usually done by one of: + * - clicking the status alert + * - using the topic hyperlink + * - strip menu for others + * - alternatively, dismemberment or destroying the item + */ +/datum/status_effect/cuffed_item + id = "cuffed_item" + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/cuffed_item + ///Reference to the item stuck into the player's hand + var/obj/item/cuffed + ///Reference to the pair of handcuffs used to bind the item + var/obj/item/restraints/handcuffs/cuffs + +/datum/status_effect/cuffed_item/on_creation(mob/living/new_owner, obj/item/cuffed, obj/item/restraints/handcuffs/cuffs) + src.cuffed = cuffed + src.cuffs = cuffs + . = ..() //throws the alert and all + linked_alert.update_appearance(UPDATE_OVERLAYS) + +/datum/status_effect/cuffed_item/on_apply() + if(HAS_TRAIT_FROM(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT)) + qdel(src) + return FALSE + owner.temporarilyRemoveItemFromInventory(cuffs, force = TRUE) + if(!owner.is_holding(cuffed) && !owner.put_in_hands(cuffed)) + owner.put_in_hands(cuffs) + qdel(src) + return FALSE + + ADD_TRAIT(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT) + + RegisterSignals(cuffed, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(on_displaced)) + RegisterSignal(cuffed, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(on_item_update_appearance)) + RegisterSignal(cuffed, COMSIG_ATOM_EXAMINE, PROC_REF(cuffed_reminder)) + RegisterSignal(cuffed, COMSIG_TOPIC, PROC_REF(topic_handler)) + RegisterSignal(cuffed, COMSIG_ITEM_GET_STRIPPABLE_ALT_ACTIONS, PROC_REF(get_strippable_action)) + RegisterSignal(cuffed, COMSIG_ITEM_STRIPPABLE_ALT_ACTION, PROC_REF(do_strippable_action)) + + RegisterSignals(cuffs, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(on_displaced)) + RegisterSignal(cuffs, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(on_item_update_appearance)) + + RegisterSignal(owner, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) + + owner.log_message("bound [src] to themselves with restraints", LOG_GAME) + + return TRUE + +/datum/status_effect/cuffed_item/on_remove() + //Prevent possible recursions from these signals + UnregisterSignal(cuffed, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) + UnregisterSignal(cuffs, list(COMSIG_ITEM_EQUIPPED, COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) + + REMOVE_TRAIT(cuffed, TRAIT_NODROP, CUFFED_ITEM_TRAIT) + cuffed = null + + if(!QDELETED(cuffs)) + cuffs.on_uncuffed(wearer = owner) + if(!QDELETED(owner) && cuffs.loc == owner && !(cuffs in owner.get_equipped_items(INCLUDE_POCKETS | INCLUDE_HELD))) + cuffs.forceMove(owner.drop_location()) + cuffs = null + +///Called when someone examines the owner twice, so they can know if someone has a cuffed item +/datum/status_effect/cuffed_item/proc/on_examine_more(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += span_warning("[cuffed.examine_title(user)] is bound to [owner.p_their()] [owner.get_held_index_name(owner.get_held_index_of_item(cuffed))] by [cuffs.examine_title(user)]") + +///What happens if one of the items is moved away from the mob +/datum/status_effect/cuffed_item/proc/on_displaced(datum/source) + SIGNAL_HANDLER + qdel(src) + +///Tell the player that the item is stuck to their hands someway. Also another way to trigger the try_remove_cuffs proc. +/datum/status_effect/cuffed_item/proc/cuffed_reminder(obj/item/item, mob/user, list/examine_texts) + SIGNAL_HANDLER + + if(user == owner) + examine_texts += span_notice("[item.p_Theyre()] cuffed to you by \a [cuffs]. You can remove them.") + +/// This mainly exists as a fallback in the rare case the alert icon is not reachable (too many alerts?). You should be somewhat able to examine items while blind so all good. +/datum/status_effect/cuffed_item/proc/topic_handler(atom/source, user, href_list) + SIGNAL_HANDLER + + if(user == owner && href_list["remove_cuffs_item"]) + INVOKE_ASYNC(src, PROC_REF(try_remove_cuffs), user) + +/datum/status_effect/cuffed_item/proc/get_strippable_action(obj/item/source, atom/owner, mob/user, list/alt_actions) + SIGNAL_HANDLER + alt_actions += "remove_item_cuffs" + +/datum/status_effect/cuffed_item/proc/do_strippable_action(obj/item/source, atom/owner, mob/user, action_key) + SIGNAL_HANDLER + if(action_key != "remove_item_cuffs") + return NONE + if(source != cuffed || !isliving(user)) + return NONE + + INVOKE_ASYNC(src, PROC_REF(try_remove_cuffs), user) + return COMPONENT_ALT_ACTION_DONE + +///The main proc responsible for attempting to remove the hancfuss. +/datum/status_effect/cuffed_item/proc/try_remove_cuffs(mob/living/user) + + var/interaction_key = REF(src) + if(LAZYACCESS(user.do_afters, interaction_key)) + return FALSE + + if(!(user.mobility_flags & MOBILITY_USE) || (user != owner && !owner.IsReachableBy(user))) + owner.balloon_alert(user, "can't do it right now!") + return FALSE + + if(user != owner) + owner.visible_message(span_notice("[user] tries to remove [cuffs] binding [cuffed] to [owner]"), span_warning("[user] is trying to remove [cuffs] binding [cuffed] to you.")) + + owner.balloon_alert(user, "removing cuffs...") + playsound(owner, cuffs.cuffsound, 30, TRUE, -2) + if(!do_after(user, cuffs.get_handcuff_time(user) * 1.5, owner, interaction_key = interaction_key) || QDELETED(src)) + owner.balloon_alert(user, "interrupted!") + return FALSE + + if(user != owner) + owner.visible_message(span_notice("[user] removes [cuffs] binding [cuffed] to [owner]"), span_warning("[user] removes [cuffs] binding [cuffed] to you.")) + + log_combat(user, owner, "removed restraints binding [cuffed] to") + + var/obj/item/restraints/handcuffs/ref_cuffs = cuffs + ref_cuffs.forceMove(owner.drop_location()) //This will cause the status effect to delete itself, which unsets the 'cuffs' var + user.put_in_hands(ref_cuffs) + owner.balloon_alert(user, "cuffs removed from item") + + return TRUE + +///Whenever the appearance of one of either cuffed or cuffs is updated, update the alert appearance +/datum/status_effect/cuffed_item/proc/on_item_update_appearance(datum/source) + SIGNAL_HANDLER + linked_alert.update_appearance(UPDATE_OVERLAYS) + +///The status alert linked to the cuffed_item status effect +/atom/movable/screen/alert/status_effect/cuffed_item + name = "Cuffed Item" + desc = "You've an item firmly cuffed to your arm. You probably won't be accidentally dropping it somewhere anytime soon." + icon_state = "template" + use_user_hud_icon = TRUE + clickable_glow = TRUE + click_master = FALSE + +/atom/movable/screen/alert/status_effect/cuffed_item/update_overlays() + . = ..() + if(!attached_effect) + return + var/datum/status_effect/cuffed_item/effect = attached_effect + . += add_atom_icon(effect.cuffed) + var/mutable_appearance/cuffs_appearance = add_atom_icon(effect.cuffs) + cuffs_appearance.transform *= 0.8 + . += cuffs_appearance + +/atom/movable/screen/alert/status_effect/cuffed_item/Click(location, control, params) + . = ..() + if(.) + var/datum/status_effect/cuffed_item/effect = attached_effect + effect?.try_remove_cuffs(owner) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 40dbc901413..420ac0db902 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -178,6 +178,7 @@ var/decay_multiplier = HAS_TRAIT(owner, TRAIT_HUSK) ? 2 : 1 // husks decay twice as fast adjust_stacks(owner.fire_stack_decay_rate * decay_multiplier * seconds_between_ticks) + SEND_SIGNAL(owner, COMSIG_FIRE_STACKS_UPDATED, stacks) if(stacks <= 0) qdel(src) diff --git a/code/datums/status_effects/debuffs/rust_corruption.dm b/code/datums/status_effects/debuffs/rust_corruption.dm index 6ba9d6a4ee9..168986beb92 100644 --- a/code/datums/status_effects/debuffs/rust_corruption.dm +++ b/code/datums/status_effects/debuffs/rust_corruption.dm @@ -5,8 +5,14 @@ remove_on_fullheal = TRUE /datum/status_effect/rust_corruption/tick(seconds_between_ticks) - if(issilicon(owner)) + if(issilicon(owner) || isbot(owner)) owner.adjustBruteLoss(10 * seconds_between_ticks) return owner.adjust_disgust(5 * seconds_between_ticks) owner.reagents?.remove_all(0.75 * seconds_between_ticks) + if(!iscarbon(owner)) + return + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/bodypart/robotic_limb as anything in carbon_owner.bodyparts) + if(IS_ROBOTIC_LIMB(robotic_limb)) + robotic_limb.receive_damage(10) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 162ccb6770e..94bb67855c6 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -265,7 +265,7 @@ /// One of our possible takers moved, see if they left us hanging /datum/status_effect/offering/proc/check_taker_in_range(mob/living/taker) SIGNAL_HANDLER - if(owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker)) + if(taker.IsReachableBy(owner) || ((owner.pulling == taker) || (taker.pulling == owner)) && !IS_DEAD_OR_INCAP(taker)) return to_chat(taker, span_warning("You moved out of range of [owner]!")) @@ -276,7 +276,7 @@ SIGNAL_HANDLER for(var/mob/living/checking_taker as anything in possible_takers) - if(!istype(checking_taker) || !owner.CanReach(checking_taker) || IS_DEAD_OR_INCAP(checking_taker)) + if(!istype(checking_taker) || (!checking_taker.IsReachableBy(owner) && !((owner.pulling == checking_taker) || (checking_taker.pulling == owner))) || IS_DEAD_OR_INCAP(checking_taker)) remove_candidate(checking_taker) /// We lost the item, give it up @@ -291,7 +291,7 @@ * Returns `TRUE` if the taker is valid as a target for the offering. */ /datum/status_effect/offering/proc/is_taker_elligible(mob/living/taker) - return owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker) + return taker.IsReachableBy(owner) && !IS_DEAD_OR_INCAP(taker) && additional_taker_check(taker) /** * Additional checks added to `CanReach()` and `IS_DEAD_OR_INCAP()` in `is_taker_elligible()`. diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 7f66a86eae6..73707ccabfa 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -171,6 +171,16 @@ remove_all(update_storage = FALSE) +/// Ran on items instantiated inside the storage, basically a chopped down version of handle_enter +/datum/storage/proc/item_init(datum/source, obj/item/inited) + SIGNAL_HANDLER + + if(!istype(inited)) + return + + inited.item_flags |= IN_STORAGE + RegisterSignal(inited, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) + /// Automatically ran on all object insertions: flag marking and view refreshing. /datum/storage/proc/handle_enter(datum/source, obj/item/arrived) SIGNAL_HANDLER @@ -223,6 +233,7 @@ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) RegisterSignal(parent, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, PROC_REF(contents_changed_w_class)) RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) + RegisterSignal(parent, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(item_init)) /** * Sets where items are physically being stored in the case it shouldn't be on the parent. @@ -476,6 +487,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!can_insert(to_insert, user, messages = messages, force = force)) return FALSE + if(SEND_SIGNAL(parent, COMSIG_ATOM_PRE_STORED_ITEM, to_insert, user, force, messages) & BLOCK_STORAGE_INSERT) + return FALSE SEND_SIGNAL(parent, COMSIG_ATOM_STORED_ITEM, to_insert, user, force) SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) @@ -650,7 +663,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) */ /datum/storage/proc/remove_type(type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) if(!force && check_adjacent) - if(isnull(user) || !user.CanReach(destination) || !user.CanReach(parent)) + if(isnull(user) || !destination.IsReachableBy(user) || !parent.IsReachableBy(user)) return FALSE var/list/taking = typecache_filter_list(real_location.contents, typecacheof(type)) @@ -775,11 +788,15 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SIGNAL_HANDLER if(ismecha(user.loc) || user.incapacitated || !user.canUseStorage()) - return + return NONE if(istype(over_object, /atom/movable/screen/inventory/hand)) if(real_location.loc != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) - return + return NONE + if(isitem(parent)) + var/obj/item/item_parent = parent + if(!item_parent.can_mob_unequip(user)) + return COMPONENT_CANCEL_MOUSEDROP_ONTO var/atom/movable/screen/inventory/hand/hand = over_object user.putItemFromInventoryInHandIfPossible(parent, hand.held_index) @@ -788,27 +805,27 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(ismob(over_object)) if(over_object != user || !user.can_perform_action(parent, FORBID_TELEKINESIS_REACH | ALLOW_RESTING)) - return + return NONE parent.add_fingerprint(user) INVOKE_ASYNC(src, PROC_REF(open_storage), user) return COMPONENT_CANCEL_MOUSEDROP_ONTO if(istype(over_object, /atom/movable/screen)) - return + return NONE if(!user.can_perform_action(over_object, FORBID_TELEKINESIS_REACH)) - return + return NONE parent.add_fingerprint(user) var/atom/dump_loc = over_object.get_dumping_location() if(isnull(dump_loc)) - return + return NONE /// Don't dump *onto* objects in the same storage as ourselves if (over_object.loc == parent.loc && !isnull(parent.loc.atom_storage) && isnull(over_object.atom_storage)) - return + return NONE INVOKE_ASYNC(src, PROC_REF(dump_content_at), over_object, dump_loc, user) return COMPONENT_CANCEL_MOUSEDROP_ONTO @@ -823,7 +840,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(locked) user.balloon_alert(user, "closed!") return - if(!user.CanReach(parent) || !user.CanReach(dest_object)) + if(!parent.IsReachableBy(user) || !dest_object.IsReachableBy(user)) return if(SEND_SIGNAL(dest_object, COMSIG_STORAGE_DUMP_CONTENT, src, user) & STORAGE_DUMP_HANDLED) @@ -989,9 +1006,13 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SIGNAL_HANDLER for(var/mob/user in can_see_contents()) - if (!user.CanReach(parent)) + if (!can_be_reached_by(user)) hide_contents(user) +/// Relay for parent.IsReachableBy +/datum/storage/proc/can_be_reached_by(mob/user) + return parent.IsReachableBy(user) + /// Close the storage UI for everyone viewing us. /datum/storage/proc/close_all() for(var/mob/user as anything in is_using) @@ -1165,8 +1186,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/contents_changed_w_class(datum/source, obj/item/changed, old_w_class, new_w_class) SIGNAL_HANDLER - if(new_w_class <= max_specific_storage && new_w_class + get_total_weight() <= max_total_storage) + // If old weight already overloaded the storage, don't drop the item out just in case we're inside of a premade box + if(new_w_class <= max_specific_storage && (get_total_weight() <= max_total_storage || get_total_weight() - new_w_class + old_w_class > max_total_storage)) return + if(!attempt_remove(changed, parent.drop_location())) return diff --git a/code/datums/storage/subtypes/bags.dm b/code/datums/storage/subtypes/bags.dm index 5af96e69ec9..5fa9f1e35bf 100644 --- a/code/datums/storage/subtypes/bags.dm +++ b/code/datums/storage/subtypes/bags.dm @@ -270,12 +270,51 @@ /datum/storage/bag/garment numerical_stacking = FALSE max_total_storage = 200 - max_slots = 15 + max_slots = 20 insert_preposition = "in" + allow_big_nesting = TRUE /datum/storage/bag/garment/New(atom/parent, max_slots, max_specific_storage, max_total_storage, rustle_sound, remove_rustle_sound) . = ..() - set_holdable(/obj/item/clothing) + set_holdable( + can_hold_list = list(/obj/item/clothing, /obj/item/storage/backpack), + exception_hold_list = list(/obj/item/storage/backpack), + ) + +/datum/storage/bag/garment/can_insert(obj/item/to_insert, mob/user, messages, force) + . = ..() + if(!.) + return FALSE + + if(istype(to_insert, /obj/item/storage/backpack) && length(to_insert.contents)) + if(messages && user) + parent.balloon_alert(user, "can't store filled backpacks!") + return FALSE + + return TRUE + +/datum/storage/bag/garment/item_init(datum/source, obj/item/inited) + . = ..() + if(!istype(inited, /obj/item/storage/backpack)) + return + RegisterSignal(inited, COMSIG_ATOM_PRE_STORED_ITEM, PROC_REF(block_inner_storage)) + +/datum/storage/bag/garment/handle_enter(datum/source, obj/item/arrived) + . = ..() + if(!istype(arrived, /obj/item/storage/backpack)) + return + RegisterSignal(arrived, COMSIG_ATOM_PRE_STORED_ITEM, PROC_REF(block_inner_storage)) + +/datum/storage/bag/garment/handle_exit(datum/source, obj/item/gone) + . = ..() + UnregisterSignal(gone, COMSIG_ATOM_PRE_STORED_ITEM) + +/datum/storage/bag/garment/proc/block_inner_storage(obj/item/backpack, to_insert, user, force, messages) + SIGNAL_HANDLER + + if(user && messages) + parent.balloon_alert(user, "garment bag is in the way!") + return BLOCK_STORAGE_INSERT ///Quiver bag /datum/storage/bag/quiver diff --git a/code/datums/storage/subtypes/belts.dm b/code/datums/storage/subtypes/belts.dm index 156f6adb151..4cccf248756 100644 --- a/code/datums/storage/subtypes/belts.dm +++ b/code/datums/storage/subtypes/belts.dm @@ -74,6 +74,7 @@ /obj/item/flesh_shears, /obj/item/blood_scanner, /obj/item/reflexhammer, + /obj/item/crowbar/power/paramedic, /obj/item/clothing/suit/toggle/labcoat/hospitalgown, //SKYRAT EDIT ADDITION - adds surgery gowns to belts /obj/item/hypospray/mkii, //SKYRAT EDIT ADDITION - HYPOSPRAYS /obj/item/storage/hypospraykit/, //SKYRAT EDIT ADDITION - HYPOSPRAYS diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index b53bb64183b..d255d9d0f26 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -24,7 +24,7 @@ /atom/proc/attempt_wire_interaction(mob/user) if(!wires) return WIRE_INTERACTION_FAIL - if(!user.CanReach(src)) + if(!IsReachableBy(user)) return WIRE_INTERACTION_FAIL INVOKE_ASYNC(wires, TYPE_PROC_REF(/datum/wires, interact), user) return WIRE_INTERACTION_BLOCK diff --git a/code/game/atom/alternate_appearance.dm b/code/game/atom/alternate_appearance.dm index 1bc5ae0d641..270f26e1809 100644 --- a/code/game/atom/alternate_appearance.dm +++ b/code/game/atom/alternate_appearance.dm @@ -228,7 +228,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/basic/heretic -/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/M) - if(IS_HERETIC(M)) +/datum/atom_hud/alternate_appearance/basic/heretic/mobShouldSee(mob/viewer) + if(IS_HERETIC_OR_MONSTER(viewer)) return TRUE return FALSE diff --git a/code/game/atom/atom_act.dm b/code/game/atom/atom_act.dm index 40e4394b1a8..0d94aacf9a7 100644 --- a/code/game/atom/atom_act.dm +++ b/code/game/atom/atom_act.dm @@ -73,6 +73,14 @@ if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) wires.emp_pulse() + if(flags_1 & HOLOGRAM_1) // holograms should ignore EMP_PROTECT flags (since the protection itself is also a hologram) + if(prob(75 / severity)) + // avoid spamming messages for anything inside the holodeck directly + if(!istype(get_area(src), /area/station/holodeck)) + visible_message(span_warning("[src] fades away!")) + animate(alpha = 0, time = 1 SECONDS) + QDEL_IN(src, 1 SECONDS) + SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity, protection) return protection // Pass the protection value collected here upwards @@ -86,8 +94,18 @@ */ /atom/proc/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = null) + var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone, piercing_hit) + + if(sigreturn & COMPONENT_BULLET_PIERCED) + return BULLET_ACT_FORCE_PIERCE + if(sigreturn & COMPONENT_BULLET_BLOCKED) + return BULLET_ACT_BLOCK + if(sigreturn & COMPONENT_BULLET_ACTED) + return BULLET_ACT_HIT + if (isnull(blocked)) blocked = check_projectile_armor(def_zone, hitting_projectile) + return bullet_act(hitting_projectile, def_zone, piercing_hit, blocked) /** @@ -101,15 +119,6 @@ */ /atom/proc/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = 0) SHOULD_CALL_PARENT(TRUE) - - var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone, piercing_hit, blocked) - if(sigreturn & COMPONENT_BULLET_PIERCED) - return BULLET_ACT_FORCE_PIERCE - if(sigreturn & COMPONENT_BULLET_BLOCKED) - return BULLET_ACT_BLOCK - if(sigreturn & COMPONENT_BULLET_ACTED) - return BULLET_ACT_HIT - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, hitting_projectile, def_zone, piercing_hit, blocked) if(QDELETED(hitting_projectile)) // Signal deleted it? return BULLET_ACT_BLOCK @@ -222,8 +231,9 @@ * * Override this if you want custom behaviour in whatever gets hit by the rust * /turf/rust_turf should be used instead for overriding rust on turfs + * rust_strength (optional) - if you want to vary the effect based on the users' strength */ -/atom/proc/rust_heretic_act() +/atom/proc/rust_heretic_act(rust_strength) return ///wrapper proc that passes our mob's rust_strength to the target we are rusting diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 9c7fcf91dfd..0e24764df77 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1339,13 +1339,13 @@ return ..() // Calls throw_at after checking that the move strength is greater than the thrown atom's move resist. Identical args. -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, atom/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) if((force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) return return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle) ///If this returns FALSE then callback will not be called. -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE, throw_datum_typepath = /datum/thrownthing) +/atom/movable/proc/throw_at(atom/target, range, speed, atom/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE, quickstart = TRUE, throw_datum_typepath = /datum/thrownthing) . = FALSE if(QDELETED(src)) @@ -1361,36 +1361,38 @@ pulledby.stop_pulling() //They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw? - if (thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag*2) - var/user_momentum = thrower.cached_multiplicative_slowdown - if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. - user_momentum = world.tick_lag + if(ismob(thrower)) + var/mob/thrower_mob = thrower + if(thrower_mob.last_move && thrower_mob.client && thrower_mob.client.move_delay >= world.time + world.tick_lag*2) + var/user_momentum = thrower_mob.cached_multiplicative_slowdown + if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. + user_momentum = world.tick_lag - user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses. + user_momentum = 1 / user_momentum // convert from ds to the tiles per ds that throw_at uses. - if (get_dir(thrower, target) & last_move) - user_momentum = user_momentum //basically a noop, but needed - else if (get_dir(target, thrower) & last_move) - user_momentum = -user_momentum //we are moving away from the target, lets slowdown the throw accordingly - else - user_momentum = 0 + if (get_dir(thrower_mob, target) & last_move) + user_momentum = user_momentum //basically a noop, but needed + else if (get_dir(target, thrower_mob) & last_move) + user_momentum = -user_momentum //we are moving away from the target, lets slowdown the throw accordingly + else + user_momentum = 0 - - if (user_momentum) - //first lets add that momentum to range. - range *= (user_momentum / speed) + 1 - //then lets add it to speed - speed += user_momentum - if (speed <= 0) - return//no throw speed, the user was moving too fast. + if (user_momentum) + //first lets add that momentum to range. + range *= (user_momentum / speed) + 1 + //then lets add it to speed + speed += user_momentum + if (speed <= 0) + return//no throw speed, the user was moving too fast. . = TRUE // No failure conditions past this point. var/target_zone if(QDELETED(thrower)) thrower = null //Let's not pass a qdeleting reference if any. - else - target_zone = thrower.zone_selected + else if(ismob(thrower)) + var/mob/thrower_mob = thrower + target_zone = thrower_mob.zone_selected var/datum/thrownthing/thrown_thing = new throw_datum_typepath(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 1b1ff3c8443..f2bee534b1c 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -295,11 +295,10 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) steal_hint = "A self-defense weapon standard-issue for all heads of staffs barring the Head of Security. Rarely found off of their person." /datum/objective_item/steal/traitor/telebaton/check_special_completion(obj/item/thing) - return thing.type == /obj/item/melee/baton/telescopic + return !istype(thing, /obj/item/melee/baton/telescopic/contractor_baton) /obj/item/melee/baton/telescopic/add_stealing_item_objective() - if(type == /obj/item/melee/baton/telescopic) - return add_item_to_steal(src, /obj/item/melee/baton/telescopic) + return add_item_to_steal(src, /obj/item/melee/baton/telescopic) /datum/objective_item/steal/traitor/cargo_budget name = "cargo's departmental budget" diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index c97d4d4fbe1..2023722ea35 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -396,7 +396,7 @@ var/turf/this_turf = get_turf(src) for(var/atom/movable/movable_atom in contents) //so machines like microwaves dont dump out signalers after cooking - if(wires && (movable_atom in flatten_list(wires.assemblies))) + if(wires && (movable_atom in assoc_to_values(wires.assemblies))) continue if(subset && !(movable_atom in subset)) @@ -1237,8 +1237,9 @@ dropped_atom.pixel_x = -8 + ((.%3)*8) dropped_atom.pixel_y = -8 + (round( . / 3)*8) -/obj/machinery/rust_heretic_act() - take_damage(500, BRUTE, MELEE, 1) +/obj/machinery/rust_heretic_act(rust_strength) + var/damage = 500 + rust_strength * 200 + take_damage(damage, BRUTE, BOMB, 1) /obj/machinery/vv_edit_var(vname, vval) if(vname == NAMEOF(src, occupant)) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index ad906e12471..7bdc537dd81 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -106,9 +106,6 @@ if(state != FRAME_COMPUTER_STATE_EMPTY) balloon_alert(user, "circuit already installed!") return FALSE - if(!anchored && istype(board)) - balloon_alert(user, "frame must be anchored!") - return FALSE . = ..() if(. && !by_hand) // Installing via RPED auto-secures it state = FRAME_COMPUTER_STATE_BOARD_SECURED @@ -194,8 +191,6 @@ if(FRAME_COMPUTER_STATE_GLASSED) if(finalize_construction(user, tool)) return ITEM_INTERACT_SUCCESS - - balloon_alert(user, "missing components!") return ITEM_INTERACT_BLOCKING /obj/structure/frame/computer/crowbar_act(mob/living/user, obj/item/tool) @@ -295,6 +290,10 @@ return TRUE /obj/structure/frame/computer/finalize_construction(mob/living/user, obj/item/tool) + if(!anchored) + balloon_alert(user, "frame must be anchored!") + return FALSE + tool.play_tool_sound(src) var/obj/machinery/new_machine = new circuit.build_path(loc) new_machine.balloon_alert(user, "monitor connected") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index de0c1c54d26..6f127126377 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -280,7 +280,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if (can_buy_shuttles_or_fail_reason != FALSE) to_chat(user, span_alert("[can_buy_shuttles_or_fail_reason]")) return - var/list/shuttles = flatten_list(SSmapping.shuttle_templates) + var/list/shuttles = assoc_to_values(SSmapping.shuttle_templates) var/datum/map_template/shuttle/shuttle = locate(params["shuttle"]) in shuttles if (!istype(shuttle)) return diff --git a/code/game/machinery/computer/telescreen.dm b/code/game/machinery/computer/telescreen.dm index 12bafc3f73e..51f00c7f1b2 100644 --- a/code/game/machinery/computer/telescreen.dm +++ b/code/game/machinery/computer/telescreen.dm @@ -106,7 +106,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai if(HAS_SILICON_ACCESS(user) || (user.interaction_range && user.interaction_range >= get_dist(user, src))) can_range = TRUE - if((can_range || user.CanReach(src)) && ISADVANCEDTOOLUSER(user)) + if((can_range || IsReachableBy(user)) && ISADVANCEDTOOLUSER(user)) if(user.incapacitated) return UI_UPDATE if(!can_range && user.can_hold_items() && (user.usable_hands <= 0 || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 1e64561c9be..8c8c0512bc3 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -226,10 +226,10 @@ /obj/machinery/dna_infuser/click_alt(mob/user) if(infusing) balloon_alert(user, "not while it's on!") - return + return CLICK_ACTION_BLOCKING if(!infusing_from) balloon_alert(user, "no sample to eject!") - return + return CLICK_ACTION_BLOCKING balloon_alert(user, "ejected sample") infusing_from.forceMove(get_turf(src)) infusing_from = null diff --git a/code/game/machinery/dna_infuser/dna_infusion.dm b/code/game/machinery/dna_infuser/dna_infusion.dm index 2ea3b09ca7c..b2de63a3a2d 100644 --- a/code/game/machinery/dna_infuser/dna_infusion.dm +++ b/code/game/machinery/dna_infuser/dna_infusion.dm @@ -25,7 +25,7 @@ ///returns /datum/infuser_entry that matches an item being used for infusion, returns a fly mutation on failure /atom/movable/proc/get_infusion_entry() as /datum/infuser_entry var/datum/infuser_entry/found - for(var/datum/infuser_entry/entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/entry as anything in assoc_to_values(GLOB.infuser_entries)) if(entry.tier == DNA_MUTANT_UNOBTAINABLE) continue if(is_type_in_list(src, entry.input_obj_or_mob)) diff --git a/code/game/machinery/dna_infuser/infuser_book.dm b/code/game/machinery/dna_infuser/infuser_book.dm index 416ed038d64..370d7a87c1e 100644 --- a/code/game/machinery/dna_infuser/infuser_book.dm +++ b/code/game/machinery/dna_infuser/infuser_book.dm @@ -29,7 +29,7 @@ var/list/data = list() // Collect all info from each intry. var/list/entry_data = list() - for(var/datum/infuser_entry/entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/entry as anything in assoc_to_values(GLOB.infuser_entries)) if(entry.tier == DNA_MUTANT_UNOBTAINABLE) continue var/list/individual_entry_data = list() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 74d415aed9a..56c1907d25e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -202,7 +202,7 @@ diag_hud_set_electrified() // Click on the floor to close airlocks - AddComponent(/datum/component/redirect_attack_hand_from_turf) + AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(drag_check))) AddElement(/datum/element/nav_computer_icon, 'icons/effects/nav_computer_indicators.dmi', "airlock", TRUE) @@ -210,6 +210,12 @@ RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) +// if dragging, block 'Click on the floor to close airlocks' +/obj/machinery/door/airlock/proc/drag_check(mob/user) + if (user.pulling) + return FALSE + return TRUE + /obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas) SIGNAL_HANDLER @@ -963,7 +969,7 @@ security_level = AIRLOCK_SECURITY_PLASTEEL_O return . if(note) - if(user.CanReach(src)) + if(IsReachableBy(user)) user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src].")) else //telekinesis visible_message(span_notice("[tool] cuts down [note] from [src].")) @@ -1308,6 +1314,11 @@ prying_so_hard = FALSE return + if(!isnull(tool)) + if(SEND_SIGNAL(tool, COMSIG_TOOL_FORCE_OPEN_AIRLOCK, user, src) & COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN) + prying_so_hard = FALSE + return + prying_so_hard = FALSE if(check_electrified && shock(user, 100)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 43695e8dd20..306a3da3860 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -637,7 +637,13 @@ /obj/machinery/door/morgue/Initialize(mapload) . = ..() - AddComponent(/datum/component/redirect_attack_hand_from_turf) + AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(drag_check))) + +// if dragging, block redirect_Attack_hand_from_turf +/obj/machinery/door/morgue/proc/drag_check(mob/user) + if (user.pulling) + return FALSE + return TRUE /obj/machinery/door/get_dumping_location() return null diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 7923eaed436..f1d6d418c1c 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -588,7 +588,7 @@ SIGNAL_HANDLER - if(!QDELETED(crowbar_owner) && crowbar_owner.CanReach(src)) + if(!QDELETED(crowbar_owner) && IsReachableBy(crowbar_owner)) if(!ismob(crowbar_owner)) return var/mob/living/mob_user = crowbar_owner diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 429b648624a..8ede2092a4c 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -464,6 +464,13 @@ return ..() /obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user, forced = FALSE) + if(istype(I, /obj/item/crowbar/power)) + var/obj/item/crowbar/power/power_tool = I + if(power_tool.limit_jaws_access && forced) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) + user.balloon_alert(user, "cannot pry open!") + return + if(!hasPower() || forced) if(density) open(BYPASS_DOOR_CHECKS) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1d98eb41bcd..2fb6efb9d4b 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -16,7 +16,7 @@ var/flash_range = 2 //this is roughly the size of a brig cell. /// How strong Paralyze()'d targets are when flashed. - var/strength = 10 SECONDS + var/strength = 5 SECONDS COOLDOWN_DECLARE(flash_cooldown) /// Duration of time between flashes. @@ -120,8 +120,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if (get_dist(src, living_mob) > flash_range) continue - if(living_mob.flash_act(affect_silicon = TRUE)) - living_mob.log_message("was AOE flashed by an automated portable flasher", LOG_ATTACK) + if(bulb.flash_mob(living_mob, confusion_duration = strength * 1.5, extra_log = "by [src]")) living_mob.Paralyze(strength) flashed = TRUE @@ -161,7 +160,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) icon = 'icons/obj/machines/sec.dmi' icon_state = "pflash1-p" base_icon_state = "pflash" - strength = 8 SECONDS + strength = 4 SECONDS anchored = FALSE density = TRUE ///Proximity monitor associated with this atom, needed for proximity checks. @@ -175,10 +174,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if(!COOLDOWN_FINISHED(src, flash_cooldown)) return - if(iscarbon(proximity_check_mob)) - var/mob/living/carbon/proximity_carbon = proximity_check_mob - if (proximity_carbon.move_intent != MOVE_INTENT_WALK && anchored) - flash() + if(!isliving(proximity_check_mob)) + return + + var/mob/living/proximity_living = proximity_check_mob + if (proximity_living.move_intent != MOVE_INTENT_WALK && anchored) + flash() /obj/machinery/flasher/portable/vv_edit_var(vname, vval) . = ..() diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 098aacbfb8a..31b71434115 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -10,8 +10,6 @@ /// Shows if the machine is being used for a reagent scan. #define KIOSK_SCANNING_REAGENTS (1<<3) - - /obj/machinery/medical_kiosk name = "medical kiosk" desc = "A freestanding medical kiosk, which can provide a wide range of medical analysis for diagnosis." @@ -114,34 +112,40 @@ return board.custom_cost -/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", O)) - return - else if(default_deconstruction_crowbar(O)) - return +/obj/machinery/medical_kiosk/screwdriver_act(mob/living/user, obj/item/tool) + if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING - if(istype(O, /obj/item/scanner_wand)) - var/obj/item/scanner_wand/W = O - if(scanner_wand) - balloon_alert(user, "already has a wand!") - return - if(HAS_TRAIT(O, TRAIT_NODROP) || !user.transferItemToLoc(O, src)) - balloon_alert(user, "stuck to your hand!") - return - user.visible_message(span_notice("[user] snaps [O] onto [src]!")) - balloon_alert(user, "wand returned") - //This will be the scanner returning scanner_wand's selected_target variable and assigning it to the altPatient var - if(W.selected_target) - var/datum/weakref/target_ref = WEAKREF(W.return_patient()) - if(patient_ref != target_ref) - clearScans() - patient_ref = target_ref - user.visible_message(span_notice("[W.return_patient()] has been set as the current patient.")) - W.selected_target = null - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - scanner_wand = O - return - return ..() +/obj/machinery/medical_kiosk/crowbar_act(mob/living/user, obj/item/tool) + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + +/obj/machinery/medical_kiosk/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/scanner_wand)) + return NONE + + var/obj/item/scanner_wand/wand = tool + if(scanner_wand) + balloon_alert(user, "already has a wand!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + balloon_alert(user, "stuck to your hand!") + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] snaps [tool] onto [src]!")) + balloon_alert(user, "wand returned") + //This will be the scanner returning scanner_wand's selected_target variable and assigning it to the altPatient var + if(wand.selected_target) + var/datum/weakref/target_ref = WEAKREF(wand.return_patient()) + if(patient_ref != target_ref) + clearScans() + patient_ref = target_ref + user.visible_message(span_notice("[wand.return_patient()] has been set as the current patient.")) + wand.selected_target = null + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + scanner_wand = tool + return ITEM_INTERACT_SUCCESS /obj/machinery/medical_kiosk/attack_hand_secondary(mob/user, list/modifiers) . = ..() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 58123bc2323..bb33b0ae906 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -1239,7 +1239,7 @@ DEFINE_BITFIELD(turret_flags, list( /obj/machinery/porta_turret/lasertag/bullet_act(obj/projectile/projectile) . = ..() - if(!on) + if(!on || . != BULLET_ACT_HIT) return if(team_color == "blue" && istype(projectile, /obj/projectile/beam/lasertag/redtag)) set_disabled(10 SECONDS) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 224345a8f6d..726338848ec 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -69,6 +69,12 @@ if(!active) return PROCESS_KILL + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + defuse() + return + if(!isnull(next_beep) && (next_beep <= world.time)) var/volume switch(seconds_remaining()) @@ -446,7 +452,8 @@ /obj/item/bombcore/badmin/summon/detonate() var/obj/machinery/syndicatebomb/B = loc - spawn_and_random_walk(summon_path, src, amt_summon, walk_chance=50, admin_spawn=TRUE, cardinals_only = FALSE) + for(var/atom/spawned as anything in spawn_and_random_walk(summon_path, src, amt_summon, walk_chance=50, admin_spawn=TRUE, cardinals_only = FALSE)) + ADD_TRAIT(spawned, TRAIT_SPAWNED_MOB, INNATE_TRAIT) qdel(B) qdel(src) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 3babf33eb9e..2b1fdbf7389 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -351,7 +351,7 @@ * user - The mob unbuckling buckled_mob */ /atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user) - if(!(buckled_mob in buckled_mobs) || !user.CanReach(buckled_mob)) + if(!(buckled_mob in buckled_mobs) || !buckled_mob.IsReachableBy(user)) return var/mob/living/M = unbuckle_mob(buckled_mob) if(M) diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 234e5e740ff..75b07ba9c1e 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -157,8 +157,8 @@ var/obj/machinery/door/airlock/airlock = object var/obj/machinery/door/new_airlock = new_object new_airlock.unres_sides = airlock.unres_sides - new_airlock.req_access = airlock.req_access.Copy() - new_airlock.req_one_access = airlock.req_one_access.Copy() + new_airlock.req_access = airlock.req_access?.Copy() + new_airlock.req_one_access = airlock.req_one_access?.Copy() new_airlock.locked = airlock.locked new_airlock.emergency = airlock.emergency new_airlock.update_appearance() diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index 377bf58fda6..08f996081a1 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -95,12 +95,15 @@ receive_ricochet_chance_mod = INFINITY //we do ricochet a lot! initial_duration = 10 SECONDS +GLOBAL_LIST_EMPTY_TYPED(active_cosmic_fields, /obj/effect/forcefield/cosmic_field) + /// The cosmic heretics forcefield /obj/effect/forcefield/cosmic_field name = "Cosmic Field" desc = "A field that cannot be passed by people marked with a cosmic star." icon = 'icons/effects/eldritch.dmi' icon_state = "cosmic_carpet" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE layer = GIB_LAYER density = FALSE @@ -108,10 +111,27 @@ initial_duration = 30 SECONDS /// Flags for what antimagic can just ignore our forcefields var/antimagic_flags = MAGIC_RESISTANCE + /// If we are able to slow down projectiles + var/slows_projectiles = FALSE /obj/effect/forcefield/cosmic_field/Initialize(mapload, flags = MAGIC_RESISTANCE) . = ..() antimagic_flags = flags + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_loc_exited), + ) + AddElement(/datum/element/connect_loc, loc_connections) + // Make sure that if we create a field, we apply whatever effects + for(var/atom/movable/thing in get_turf(src)) + on_entered(src, thing) + +/obj/effect/forcefield/cosmic_field/Destroy(force) + // Make sure when the field goes away that the effects don't persist + for(var/atom/movable/thing in get_turf(src)) + on_loc_exited(src, thing) + GLOB.active_cosmic_fields -= src + return ..() /obj/effect/forcefield/cosmic_field/CanAllowThrough(atom/movable/mover, border_dir) if(!isliving(mover)) @@ -119,10 +139,68 @@ var/mob/living/living_mover = mover if(living_mover.can_block_magic(antimagic_flags, charge_cost = 0)) return ..() + // Being buckled/pulled by a cosmic heretic will allow you through cosmic fields EVEN IF you have a star mark + if(ismob(living_mover.buckled)) + var/mob/living/fireman = living_mover.buckled + if(fireman.has_status_effect(/datum/status_effect/heretic_passive/cosmic)) + return ..() + if(living_mover.pulledby?.has_status_effect(/datum/status_effect/heretic_passive/cosmic)) + return ..() if(living_mover.has_status_effect(/datum/status_effect/star_mark)) return FALSE return ..() +/obj/effect/forcefield/cosmic_field/proc/on_entered(datum/source, atom/movable/thing) + SIGNAL_HANDLER + if(isprojectile(thing) && slows_projectiles) + var/obj/projectile/bullet = thing + if(istype(bullet, /obj/projectile/magic/star_ball)) // Don't slow down star balls + return + bullet.speed *= 0.2 // 80% Slowdown + return + + if(!isliving(thing)) + return + var/mob/living/living_mover = thing + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = living_mover.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + living_mover.add_movespeed_modifier(/datum/movespeed_modifier/cosmic_field) + +/obj/effect/forcefield/cosmic_field/proc/on_loc_exited(datum/source, atom/movable/thing) + SIGNAL_HANDLER + if(isprojectile(thing) && slows_projectiles) + var/obj/projectile/bullet = thing + if(istype(bullet, /obj/projectile/magic/star_ball)) // Don't speed up star balls + return + bullet.speed /= 0.2 // 80% Slowdown + return + + if(!isliving(thing)) + return + var/mob/living/living_mover = thing + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = living_mover.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + living_mover.remove_movespeed_modifier(/datum/movespeed_modifier/cosmic_field) + +/// Adds the ability to slow down any projectiles that enters any turf we occupy +/obj/effect/forcefield/cosmic_field/proc/slows_projectiles() + slows_projectiles = TRUE + +/// Adds our cosmic field to the global list which bombs check to see if they have to stop exploding +/obj/effect/forcefield/cosmic_field/proc/prevents_explosions() + GLOB.active_cosmic_fields += src + +/datum/movespeed_modifier/cosmic_field + multiplicative_slowdown = -0.25 + +/obj/effect/forcefield/cosmic_field/star_blast + initial_duration = 5 SECONDS + +/obj/effect/forcefield/cosmic_field/star_touch + initial_duration = 30 SECONDS + /obj/effect/forcefield/cosmic_field/fast initial_duration = 5 SECONDS diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 84b1e5ad125..cdae1ecbe19 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -99,3 +99,8 @@ /obj/effect/abstract/marker/powernet name = "powernet run marker" var/powernet_owner + +/// Used by RangedReachCheck +/obj/effect/abstract/reach_checker + pass_flags = PASSTABLE + invisibility = INVISIBILITY_ABSTRACT diff --git a/code/game/objects/effects/particles/brimdust.dm b/code/game/objects/effects/particles/brimdust.dm new file mode 100644 index 00000000000..1b6cb338fba --- /dev/null +++ b/code/game/objects/effects/particles/brimdust.dm @@ -0,0 +1,17 @@ +/particles/brimdust + icon = 'icons/effects/particles/generic.dmi' + icon_state = "cross" + width = 100 + height = 100 + count = 1000 + color = "#88304e" + spawning = 3 + lifespan = 0.7 SECONDS + fade = 1 SECONDS + velocity = list(0, 0) + position = generator(GEN_CIRCLE, 0, 16, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(-0.2, 0), list(0.2, 0)) + gravity = list(0, -0.5) + scale = generator(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) + rotation = 30 + spin = generator(GEN_NUM, -20, 20) diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 69fe4cb2250..f2a275117da 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -82,8 +82,7 @@ /obj/effect/dummy/phased_mob/ex_act() return FALSE -/obj/effect/dummy/phased_mob/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) - SHOULD_CALL_PARENT(FALSE) +/obj/effect/dummy/phased_mob/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/relaymove(mob/living/user, direction) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8acf36f6e6f..a42cab19b02 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -135,10 +135,10 @@ return ..() return BULLET_ACT_FORCE_PIERCE -/obj/effect/portal/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) - if (!teleport(hitting_projectile, force = TRUE)) - return ..() - return BULLET_ACT_FORCE_PIERCE +/obj/effect/portal/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if (teleport(hitting_projectile, force = TRUE)) + return BULLET_ACT_FORCE_PIERCE + return ..() /obj/effect/portal/proc/teleport(atom/movable/moving, force = FALSE) if(!force && (!istype(moving) || iseffect(moving) || (ismecha(moving) && !mech_sized) || (!isobj(moving) && !ismob(moving)))) //Things that shouldn't teleport. diff --git a/code/game/objects/effects/spawners/random/bureaucracy.dm b/code/game/objects/effects/spawners/random/bureaucracy.dm index 7a6b62618e6..583d3ad95a1 100644 --- a/code/game/objects/effects/spawners/random/bureaucracy.dm +++ b/code/game/objects/effects/spawners/random/bureaucracy.dm @@ -42,6 +42,7 @@ icon_state = "paper" loot = list( /obj/item/paper = 20, + /obj/item/paperplane = 2, /obj/item/paper/crumpled = 2, /obj/item/paper/crumpled/bloody = 2, /obj/item/paper/crumpled/muddy = 2, diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 9a31772286f..409f40d5e8b 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -283,10 +283,13 @@ /obj/item/toy/plush/shark = 3, /obj/item/toy/plush/unicorn = 3, /obj/item/toy/plush/monkey = 3, + /obj/item/toy/plush/donkpocket = 3, // super rare plushies /obj/item/toy/plush/bubbleplush = 2, /obj/item/toy/plush/ratplush = 2, /obj/item/toy/plush/narplush = 2, + /obj/item/toy/plush/whiny_plushie = 2, + /obj/item/toy/plush/rouny = 2, ) /obj/effect/spawner/random/entertainment/colorful_grenades diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index 8ae1de04e9e..86de8afca29 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -7,24 +7,30 @@ name = "garbage spawner" loot = list( /obj/effect/spawner/random/trash/food_packaging = 20, - /obj/item/trash/can = 15, + /obj/effect/spawner/random/trash/crushed_can = 15, /obj/item/shard = 10, /obj/effect/spawner/random/trash/cigbutt = 10, + /obj/effect/spawner/random/trash/cigpack = 5, /obj/effect/spawner/random/trash/bacteria = 5, /obj/effect/spawner/random/trash/botanical_waste = 5, - /obj/item/reagent_containers/cup/glass/drinkingglass = 5, /obj/item/broken_bottle = 5, /obj/item/light/tube/broken = 5, /obj/item/light/bulb/broken = 5, - /obj/item/assembly/mousetrap/armed = 5, - /obj/item/stack/cable_coil = 5, - /obj/item/food/deadmouse = 1, + /obj/effect/spawner/random/bureaucracy/paper = 5, + /obj/item/assembly/mousetrap = 3, + /obj/item/assembly/mousetrap/armed = 3, + /obj/item/stack/cable_coil = 3, + /obj/item/stack/cable_coil/cut = 3, + /obj/item/reagent_containers/syringe = 3, + /obj/item/reagent_containers/cup/glass/drinkingglass = 2, + /obj/item/food/deadmouse = 2, + /obj/item/c_tube = 2, + /obj/item/plate_shard = 2, + /obj/item/lighter/greyscale/empty = 2, + /obj/item/lighter/empty = 1, /obj/item/trash/candle = 1, - /obj/item/rag = 1, /obj/item/trash/flare = 1, - /obj/item/popsicle_stick = 1, - /obj/item/reagent_containers/syringe = 1, - /obj/item/reagent_containers/cup/glass/sillycup = 1, + /obj/item/rag = 1, /obj/item/shard/plasma = 1, ) @@ -48,7 +54,7 @@ /mob/living/basic/snail = 1, /obj/item/food/grown/cannabis = 1, /obj/item/rag = 1, - /obj/effect/spawner/random/entertainment/drugs= 1, + /obj/effect/spawner/random/entertainment/drugs = 1, /obj/item/modular_computer/pda = 1, /obj/item/reagent_containers/syringe = 1, /obj/effect/spawner/random/entertainment/cigar = 1, @@ -62,6 +68,29 @@ loot -= /mob/living/basic/snail return ..() +/obj/effect/spawner/random/trash/cigpack + name = "empty cigarette pack spawner" + loot = list( + /obj/item/storage/fancy/cigarettes/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_uplift/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_robust/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_robustgold/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_carp/empty = 5, + /obj/item/storage/fancy/cigarettes/cigpack_midori/empty = 5, + /obj/item/storage/fancy/rollingpapers/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/cohiba/empty = 3, + /obj/item/storage/fancy/cigarettes/cigars/havana/empty = 3, + /obj/item/storage/fancy/cigarettes/cigpack_greytide/empty = 3, + /obj/item/storage/fancy/cigarettes/dromedaryco/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_xeno/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_candy/empty = 2, + /obj/item/storage/fancy/cigarettes/cigpack_cannabis/empty = 1, + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker/empty = 1, + /obj/item/storage/fancy/cigarettes/cigpack_syndicate/empty = 1, + ) + /obj/effect/spawner/random/trash/cigbutt name = "cigarette butt spawner" loot = list( @@ -83,20 +112,45 @@ /obj/item/trash/sosjerky = 2, /obj/item/trash/pistachios = 2, /obj/item/trash/peanuts = 2, + /obj/item/reagent_containers/cup/glass/sillycup = 2, /obj/item/trash/boritos = 1, /obj/item/trash/boritos/green = 1, /obj/item/trash/boritos/purple = 1, /obj/item/trash/boritos/red = 1, /obj/item/trash/can/food/beans = 1, /obj/item/trash/can/food/peaches = 1, - /obj/item/trash/can/food/envirochow = 1, - /obj/item/trash/popcorn = 1, - /obj/item/trash/energybar = 1, /obj/item/trash/can/food/peaches/maint = 1, + /obj/item/trash/can/food/tomatoes = 1, + /obj/item/trash/can/food/envirochow = 1, + /obj/item/trash/can/food/squid_ink = 1, + /obj/item/trash/can/food/chap = 1, + /obj/item/trash/can/food/jellyfish = 1, + /obj/item/trash/can/food/desert_snails = 1, + /obj/item/trash/can/food/larvae = 1, + /obj/item/trash/can/food/pine_nuts = 1, + /obj/item/trash/popcorn = 1, + /obj/item/trash/popcorn/salty = 1, + /obj/item/trash/energybar = 1, /obj/item/trash/semki = 1, + /obj/item/trash/semki/healthy = 1, /obj/item/trash/cnds = 1, /obj/item/trash/syndi_cakes = 1, /obj/item/trash/shrimp_chips = 1, + /obj/item/trash/hot_shots = 1, + /obj/item/trash/sticko = 1, + /obj/item/trash/sticko/matcha = 1, + /obj/item/trash/sticko/nutty = 1, + /obj/item/trash/sticko/pineapple = 1, + /obj/item/trash/sticko/yuyake = 1, + /obj/item/trash/shok_roks = 1, + /obj/item/trash/shok_roks/citrus = 1, + /obj/item/trash/shok_roks/berry = 1, + /obj/item/trash/shok_roks/tropical = 1, + /obj/item/trash/shok_roks/lanternfruit = 1, + /obj/item/trash/fleet_ration = 1, + /obj/item/trash/spacers_sidekick = 1, + /obj/item/popsicle_stick = 1, + /obj/item/trash/ready_donk = 1, /obj/item/trash/tray = 1, ) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 79d9c032676..30937c6d57a 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -245,8 +245,10 @@ setDir(mimiced_atom.dir) mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom) +/obj/effect/temp_visual/decoy/fading/Initialize(mapload, atom/mimiced_atom, start_alpha) . = ..() + if (start_alpha) + alpha = start_alpha animate(src, alpha = 0, time = duration) /obj/effect/temp_visual/decoy/fading/threesecond @@ -803,3 +805,6 @@ color = COLOR_FULL_TONER_BLACK duration = 12 SECONDS amount_to_scale = 12 + +/obj/effect/temp_visual/circle_wave/star_blast + color = COLOR_VOID_PURPLE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9aab02337cc..0522d56a8a0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -635,7 +635,7 @@ if(throwing) throwing.finalize(FALSE) if(loc == user && outside_storage) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) + if(!can_mob_unequip(user) || !user.temporarilyRemoveItemFromInventory(src)) return . = FALSE @@ -645,7 +645,9 @@ user.dropItemToGround(src) return TRUE -/obj/item/proc/allow_attack_hand_drop(mob/user) +/// Called when a mob is manually attempting to unequip the item +/// Returning FALSE will prevent the unequip from happening +/obj/item/proc/can_mob_unequip(mob/user) return TRUE /obj/item/attack_paw(mob/user, list/modifiers) @@ -765,7 +767,8 @@ item_flags &= ~IN_INVENTORY UnregisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_NO_WORN_ICON), SIGNAL_REMOVETRAIT(TRAIT_NO_WORN_ICON))) SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user) - if(!silent) + SEND_SIGNAL(user, COMSIG_MOB_DROPPED_ITEM, src) + if(!silent && drop_sound) play_drop_sound(DROP_SOUND_VOLUME) /// called just as an item is picked up (loc is not yet changed) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index ce5584892fa..bf652a484f9 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -783,6 +783,9 @@ /obj/item/card/id/click_alt(mob/living/user) if(!alt_click_can_use_id(user)) return NONE + if (registered_account.being_dumped) + registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) + return CLICK_ACTION_SUCCESS if(registered_account.account_debt) var/choice = tgui_alert(user, "Choose An Action", "Bank Account", list("Withdraw", "Pay Debt")) if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user) @@ -790,9 +793,6 @@ if(choice == "Pay Debt") pay_debt(user) return CLICK_ACTION_SUCCESS - if (registered_account.being_dumped) - registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) - return CLICK_ACTION_SUCCESS if(loc != user) to_chat(user, span_warning("You must be holding the ID to continue!")) return CLICK_ACTION_BLOCKING @@ -808,17 +808,17 @@ return CLICK_ACTION_BLOCKING if(!alt_click_can_use_id(user)) return CLICK_ACTION_BLOCKING - if(registered_account.adjust_money(-amount_to_remove, "System: Withdrawal")) - var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) - user.put_in_hands(holochip) - to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip.")) - SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove) - log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]") - return CLICK_ACTION_SUCCESS - else + if(!registered_account.adjust_money(-amount_to_remove, "System: Withdrawal")) var/difference = amount_to_remove - registered_account.account_balance registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE) return CLICK_ACTION_BLOCKING + var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) + user.put_in_hands(holochip) + to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip.")) + SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove) + log_econ("[amount_to_remove] credits were removed from [src] owned by [registered_name]") + return CLICK_ACTION_SUCCESS + /obj/item/card/id/click_alt_secondary(mob/user) if(!alt_click_can_use_id(user)) @@ -853,7 +853,7 @@ if(HAS_TRAIT(user, TRAIT_ID_APPRAISER)) . += HAS_TRAIT(src, TRAIT_JOB_FIRST_ID_CARD) ? span_boldnotice("Hmm... yes, this ID was issued from Central Command!") : span_boldnotice("This ID was created in this sector, not by Central Command.") - if(HAS_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD) && (user.is_holding(src) || (user.CanReach(src) && user.put_in_hands(src, ignore_animation = FALSE)))) + if(HAS_TRAIT(src, TRAIT_TASTEFULLY_THICK_ID_CARD) && (user.is_holding(src) || (IsReachableBy(user) && user.put_in_hands(src, ignore_animation = FALSE)))) ADD_TRAIT(src, TRAIT_NODROP, "psycho") . += span_hypnophrase("Look at that subtle coloring... The tasteful thickness of it. Oh my God, it even has a watermark...") var/sound/slowbeat = sound('sound/effects/health/slowbeat.ogg', repeat = TRUE) @@ -2138,7 +2138,7 @@ /obj/item/card/cardboard/proc/after_input_check(mob/living/user, obj/item/item, input, value) if(!input || (value && input == value)) return FALSE - if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated || !user.is_holding(item) || !user.CanReach(src) || !user.can_write(item)) + if(QDELETED(user) || QDELETED(item) || QDELETED(src) || user.incapacitated || !user.is_holding(item) || !IsReachableBy(user) || !user.can_write(item)) return FALSE return TRUE diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index e3b994bd834..5188bbb0d34 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -1,6 +1,8 @@ #define WAND_OPEN "open" #define WAND_BOLT "bolt" #define WAND_EMERGENCY "emergency" +#define WAND_SHOCK "shock" +#define WAND_DEPOWER "depower" /obj/item/door_remote icon_state = "remote" @@ -31,6 +33,7 @@ /area/station/ai_monitored/turret_protected/ai_upload_foyer, // but sometimes mappers might misconfig /area/station/ai_monitored/turret_protected/ai_upload, // their doors with our several dozen access helpers ) + COOLDOWN_DECLARE(shock_cooldown) /obj/item/door_remote/Initialize(mapload) . = ..() @@ -50,14 +53,30 @@ return TRUE return FALSE +/obj/item/door_remote/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + return FALSE + balloon_alert(user, "restricted functions unlocked") + obj_flags |= EMAGGED + update_icon_state() + return TRUE + /obj/item/door_remote/attack_self(mob/user) - var/static/list/ops = list(WAND_OPEN = "Open Door", WAND_BOLT = "Toggle Bolts", WAND_EMERGENCY = "Toggle Emergency Access") + var/static/list/ops = list(WAND_OPEN = "Open Door", WAND_BOLT = "Toggle Bolts", WAND_EMERGENCY = "Toggle Emergency Access", WAND_SHOCK = "Shock Door", WAND_DEPOWER = "Depower Door") switch(mode) if(WAND_OPEN) mode = WAND_BOLT if(WAND_BOLT) mode = WAND_EMERGENCY if(WAND_EMERGENCY) + if(!(obj_flags & EMAGGED)) + mode = WAND_OPEN + else + mode = WAND_SHOCK + if(WAND_SHOCK) + mode = WAND_DEPOWER + if(WAND_DEPOWER) mode = WAND_OPEN update_icon_state() balloon_alert(user, "mode: [ops[mode]]") @@ -176,6 +195,7 @@ door.open() else door.close() + if (WAND_BOLT) if (!istype(airlock)) interacting_with.balloon_alert(user, "only airlocks!") @@ -187,6 +207,7 @@ else airlock.bolt() log_combat(user, airlock, "bolted", src) + if (WAND_EMERGENCY) if (!istype(airlock)) interacting_with.balloon_alert(user, "only airlocks!") @@ -195,17 +216,43 @@ airlock.emergency = !airlock.emergency airlock.update_appearance(UPDATE_ICON) + if (WAND_SHOCK) + if (!istype(airlock)) + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING + if (!COOLDOWN_FINISHED(src, shock_cooldown)) + interacting_with.balloon_alert(user, "shock pulse resetting!") + return ITEM_INTERACT_BLOCKING + if (airlock.isElectrified()) + interacting_with.balloon_alert(user, "already electrified!") + else + airlock.set_electrified(MACHINE_DEFAULT_ELECTRIFY_TIME, user) + COOLDOWN_START(src, shock_cooldown, 10 SECONDS) + + if (WAND_DEPOWER) + if (!istype(airlock)) + interacting_with.balloon_alert(user, "only airlocks!") + return ITEM_INTERACT_BLOCKING + // First hit disrupts main power, backup comes back in ten seconds, if you stick around you can hit backup for 60 more seconds of downtime. + if (!airlock.main_power_timer) + airlock.loseMainPower() + else if (!airlock.backup_power_time) + airlock.loseBackupPower() + return ITEM_INTERACT_SUCCESS /obj/item/door_remote/update_icon_state() var/icon_state_mode - switch(mode) - if(WAND_OPEN) - icon_state_mode = "open" - if(WAND_BOLT) - icon_state_mode = "bolt" - if(WAND_EMERGENCY) - icon_state_mode = "emergency" + if(!(obj_flags & EMAGGED)) + switch(mode) + if(WAND_OPEN) + icon_state_mode = "open" + if(WAND_BOLT) + icon_state_mode = "bolt" + if(WAND_EMERGENCY) + icon_state_mode = "emergency" + else + icon_state_mode = "emergency" icon_state = "[base_icon_state]_[department]_[icon_state_mode]" return ..() @@ -213,3 +260,5 @@ #undef WAND_OPEN #undef WAND_BOLT #undef WAND_EMERGENCY +#undef WAND_SHOCK +#undef WAND_DEPOWER diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 2664cff95d4..b2254fa2e65 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -22,7 +22,7 @@ var/turf/targetturf = get_safe_random_station_turf_equal_weight() if (!targetturf) return FALSE - var/list/accounts_to_rob = flatten_list(SSeconomy.bank_accounts_by_id) + var/list/accounts_to_rob = assoc_to_values(SSeconomy.bank_accounts_by_id) var/mob/living/L if(isliving(user)) L = user @@ -201,7 +201,7 @@ * Grabs the accounts to be robbed and puts them in accounts_to_rob, tells the accounts they're being drained and calls dump() to start draining. */ /obj/structure/checkoutmachine/proc/start_dumping() - accounts_to_rob = flatten_list(SSeconomy.bank_accounts_by_id) + accounts_to_rob = assoc_to_values(SSeconomy.bank_accounts_by_id) accounts_to_rob -= bogdanoff?.get_bank_account() for(var/i in accounts_to_rob) var/datum/bank_account/B = i diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 30731e086b5..28065c4cead 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -809,6 +809,10 @@ ) register_context() register_item_context() + // If default crayon red colour, pick a more fun spraycan colour + if(!paint_color) + set_painting_tool_color(pick(COLOR_CRAYON_RED, COLOR_CRAYON_ORANGE, COLOR_CRAYON_YELLOW, COLOR_CRAYON_GREEN, COLOR_CRAYON_BLUE, COLOR_CRAYON_PURPLE)) + refill() /obj/item/toy/crayon/spraycan/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() @@ -859,13 +863,6 @@ reagents.trans_to(user, used, volume_multiplier, transferred_by = user, methods = VAPOR) return OXYLOSS -/obj/item/toy/crayon/spraycan/Initialize(mapload) - . = ..() - // If default crayon red colour, pick a more fun spraycan colour - if(!paint_color) - set_painting_tool_color(pick(COLOR_CRAYON_RED, COLOR_CRAYON_ORANGE, COLOR_CRAYON_YELLOW, COLOR_CRAYON_GREEN, COLOR_CRAYON_BLUE, COLOR_CRAYON_PURPLE)) - refill() - /obj/item/toy/crayon/spraycan/examine(mob/user) . = ..() if(charges != INFINITE_CHARGES) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 1754db6dc19..442e8be791f 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -56,6 +56,7 @@ paddles = new paddle_type(src) update_power() RegisterSignal(paddles, COMSIG_DEFIBRILLATOR_SUCCESS, PROC_REF(on_defib_success)) + AddElement(/datum/element/drag_pickup) /obj/item/defibrillator/loaded/Initialize(mapload) //starts with hicap . = ..() @@ -136,14 +137,6 @@ ui_action_click() //checks for this are handled in defibrillator.mount.dm return ..() -/obj/item/defibrillator/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(!ismob(loc)) - return - var/mob/living_mob = loc - if(!living_mob.incapacitated && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/hand = over_object - living_mob.putItemFromInventoryInHandIfPossible(src, hand.held_index) - /obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/tool) if(!cell || !cell_removable) return FALSE diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 6c25f9db9fa..71c9211d28e 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -5,6 +5,7 @@ //Child of carpplushie because this should do everything the toy does and more /obj/item/toy/plush/carpplushie/dehy_carp + offspring_type = /obj/item/toy/plush/carpplushie var/mob/owner = null //Carp doesn't attack owner, set when using in hand var/mobtype = /mob/living/basic/carp //So admins can change what mob spawns via var fuckery var/swelling = FALSE @@ -19,9 +20,6 @@ owner = user RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(owner_deleted)) -/obj/item/toy/plush/carpplushie/dehy_carp/plop(obj/item/toy/plush/Daddy) - return FALSE - /obj/item/toy/plush/carpplushie/dehy_carp/proc/Swell() if(swelling) return diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index e43e0a656af..647fbae0450 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -41,7 +41,7 @@ /obj/item/desynchronizer/click_alt(mob/living/user) var/new_duration = tgui_input_number(user, "Set the duration", "Desynchronizer", duration / 10, max_duration, 5) - if(!new_duration || QDELETED(user) || QDELETED(src) || !usr.can_perform_action(src, NEED_DEXTERITY)) + if(!new_duration || QDELETED(user) || QDELETED(src) || !user.can_perform_action(src, NEED_DEXTERITY)) return CLICK_ACTION_BLOCKING duration = new_duration to_chat(user, span_notice("You set the duration to [DisplayTimeText(duration)].")) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9c71566d741..0512c992370 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,9 +37,13 @@ var/start_on = FALSE /// When true, painting the flashlight won't change its light color var/ignore_base_color = FALSE + /// This simply means if the flashlight can be cuffed to your hand (why?) + var/has_closed_handle = TRUE /obj/item/flashlight/Initialize(mapload) . = ..() + if(has_closed_handle) + AddElement(/datum/element/cuffable_item) if(start_on) set_light_on(TRUE) update_brightness() @@ -328,6 +332,7 @@ light_range = 2 light_power = 0.8 light_color = "#CCFFFF" + has_closed_handle = FALSE COOLDOWN_DECLARE(holosign_cooldown) /obj/item/flashlight/pen/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) @@ -385,6 +390,7 @@ light_power = 0.8 light_color = "#99ccff" hitsound = 'sound/items/weapons/genhit1.ogg' + has_closed_handle = FALSE // the desk lamps are a bit special /obj/item/flashlight/lamp @@ -402,6 +408,7 @@ obj_flags = CONDUCTS_ELECTRICITY custom_materials = null start_on = TRUE + has_closed_handle = FALSE // green-shaded desk lamp /obj/item/flashlight/lamp/green @@ -434,6 +441,7 @@ grind_results = list(/datum/reagent/sulfur = 15) sound_on = 'sound/items/match_strike.ogg' toggle_context = FALSE + has_closed_handle = FALSE /// How many seconds of fuel we have left var/fuel = 0 /// Do we randomize the fuel when initialized @@ -770,6 +778,7 @@ light_range = 6 //luminosity when on light_color = "#ffff66" light_system = OVERLAY_LIGHT + has_closed_handle = FALSE /obj/item/flashlight/emp special_desc_requirement = EXAMINE_CHECK_SYNDICATE // SKYRAT EDIT @@ -846,6 +855,7 @@ sound_on = 'sound/effects/wounds/crack2.ogg' // the cracking sound isn't just for wounds silly toggle_context = FALSE ignore_base_color = TRUE + has_closed_handle = FALSE /// How much max fuel we have var/max_fuel = 0 /// How much oxygen gets added upon cracking the stick. Doesn't actually produce a reaction with the fluid but it does allow for bootleg chemical "grenades" @@ -1025,6 +1035,7 @@ plane = FLOOR_PLANE anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + has_closed_handle = FALSE ///Boolean that switches when a full color flip ends, so the light can appear in all colors. var/even_cycle = FALSE ///Base light_range that can be set on Initialize to use in smooth light range expansions and contractions. diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 25bae430609..2f65c72436f 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -112,9 +112,9 @@ /obj/item/geiger_counter/click_alt(mob/living/user) if(!scanning) - to_chat(usr, span_warning("[src] must be on to reset its radiation level!")) + to_chat(user, span_warning("[src] must be on to reset its radiation level!")) return CLICK_ACTION_BLOCKING - to_chat(usr, span_notice("You flush [src]'s radiation counts, resetting it to normal.")) + to_chat(user, span_notice("You flush [src]'s radiation counts, resetting it to normal.")) last_perceived_radiation_danger = null update_appearance(UPDATE_ICON) return CLICK_ACTION_SUCCESS diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 7b17efb9f79..7b8257d9ede 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -12,6 +12,9 @@ slot_flags = ITEM_SLOT_BELT obj_flags = UNIQUE_RENAME var/gpstag + var/tracking_on = TRUE + var/debug_mode = FALSE + var/overlay_icon = "working" /obj/item/gps/Initialize(mapload) . = ..() @@ -19,7 +22,7 @@ /// Adds the GPS component to this item. /obj/item/gps/proc/add_gps_component() - AddComponent(/datum/component/gps/item, gpstag) + AddComponent(/datum/component/gps/item, gpstag, tracking_on, overlay_state = overlay_icon, debug = debug_mode) /obj/item/gps/spaceruin gpstag = SPACE_SIGNAL_GPSTAG @@ -60,33 +63,8 @@ name = "visible GPS" gpstag = "ADMIN" desc = "This admin-spawn GPS unit leaves the coordinates visible \ - on any turf that it passes over, for debugging. Especially useful \ + on any turf that it passes over while being dragged on the floor. Especially useful \ for marking the area around the transition edges." - var/list/turf/tagged - -/obj/item/gps/visible_debug/Initialize(mapload) - . = ..() - tagged = list() - START_PROCESSING(SSfastprocess, src) - -/obj/item/gps/visible_debug/process() - var/turf/T = get_turf(src) - if(T) - // I assume it's faster to color,tag and OR the turf in, rather - // then checking if its there - T.color = RANDOM_COLOUR - T.maptext = MAPTEXT("[T.x],[T.y],[T.z]") - tagged |= T - -/obj/item/gps/visible_debug/proc/clear() - while(tagged.len) - var/turf/T = pop(tagged) - T.color = initial(T.color) - T.maptext = initial(T.maptext) - -/obj/item/gps/visible_debug/Destroy() - if(tagged) - clear() - tagged = null - STOP_PROCESSING(SSfastprocess, src) - . = ..() + tracking_on = FALSE + debug_mode = TRUE + overlay_icon = FALSE diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm index c815cc41ef1..44cd9fbe6ea 100644 --- a/code/game/objects/items/devices/quantum_keycard.dm +++ b/code/game/objects/items/devices/quantum_keycard.dm @@ -45,9 +45,10 @@ /obj/item/quantum_keycard/click_alt(mob/living/user) to_chat(user, span_notice("You start pressing [src]'s unlink button...")) - if(do_after(user, 4 SECONDS, target = src)) - to_chat(user, span_notice("The keycard beeps twice and disconnects the quantum link.")) - set_pad() + if(!do_after(user, 4 SECONDS, target = src)) + return CLICK_ACTION_BLOCKING + to_chat(user, span_notice("The keycard beeps twice and disconnects the quantum link.")) + set_pad() return CLICK_ACTION_SUCCESS /obj/item/quantum_keycard/proc/set_pad(obj/machinery/quantumpad/new_pad) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 2be40d6e716..3c1e452b6cf 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -21,13 +21,13 @@ throw_range = 7 custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT *2) interaction_flags_click = NEED_LITERACY|NEED_LIGHT|ALLOW_RESTING + custom_price = PAYCHECK_COMMAND /// Verbose/condensed var/mode = SCANNER_VERBOSE /// HEALTH/WOUND var/scanmode = SCANMODE_HEALTH /// Advanced health analyzer var/advanced = FALSE - custom_price = PAYCHECK_COMMAND /// If this analyzer will give a bonus to wound treatments apon woundscan. var/give_wound_treatment_bonus = FALSE var/last_scan_text @@ -190,7 +190,7 @@ render_list += "Fatigue level: [target.getStaminaLoss()]%.
" else render_list += "Subject appears to be suffering from fatigue.
" - + // Check for brain - both organic (carbon) and synthetic (cyborg MMI) var/has_brain = FALSE if(target.get_organ_slot(ORGAN_SLOT_BRAIN)) @@ -199,7 +199,7 @@ var/mob/living/silicon/robot/cyborg_target = target if(cyborg_target.mmi?.brain) has_brain = TRUE - + if(!has_brain) // kept exclusively for soul purposes render_list += "Subject lacks a brain.
" diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index aee6e25b832..0b5574de31c 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -24,6 +24,7 @@ /obj/item/transfer_valve/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) register_context() register_item_context() @@ -234,6 +235,11 @@ if(!istype(target) || (target != tank_one && target != tank_two)) return FALSE + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + return FALSE + // Throw both tanks into processing queue var/datum/gas_mixture/target_mix = target.return_air() var/datum/gas_mixture/other_mix diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index b563e70cb2c..e88d1389390 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -70,7 +70,7 @@ /obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/mob/thrown_by = throwingdatum?.get_thrower() - if(thrown_by) + if(istype(thrown_by)) diceroll(thrown_by) return ..() diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm index 7493e6da1c2..aeaaaa35084 100644 --- a/code/game/objects/items/dyespray.dm +++ b/code/game/objects/items/dyespray.dm @@ -64,7 +64,7 @@ return var/new_grad_color = input(user, "Choose a secondary hair color:", "Character Preference",human_target.grad_color) as color|null - if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !user.CanReach(target)) + if(!new_grad_color || !user.can_perform_action(src, NEED_DEXTERITY) || !target.IsReachableBy(user)) return to_chat(user, span_notice("You start applying the hair dye...")) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index b7da99fdfdb..e406dbb6f5c 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -25,7 +25,9 @@ var/lit = FALSE //on or off var/operating = FALSE//cooldown var/obj/item/weldingtool/weldtool = null + /// The igniter stored in the flamethrower var/obj/item/assembly/igniter/igniter = null + /// The plasma tank that we shoot gas from var/obj/item/tank/internals/plasma/ptank = null var/warned_admins = FALSE //for the message_admins() when lit //variables for prebuilt flamethrowers @@ -94,9 +96,9 @@ return ITEM_INTERACT_SUCCESS /obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool) - . = TRUE + . = ITEM_INTERACT_SUCCESS if(status) - return FALSE + return ITEM_INTERACT_BLOCKING tool.play_tool_sound(src) var/turf/T = get_turf(src) if(weldtool) @@ -119,34 +121,34 @@ update_appearance() return TRUE -/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(isigniter(W)) - var/obj/item/assembly/igniter/I = W - if(I.secured) - return +/obj/item/flamethrower/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(isigniter(tool)) + var/obj/item/assembly/igniter/inserting_igniter = tool + if(inserting_igniter.secured) + return ITEM_INTERACT_BLOCKING if(igniter) - return - if(!user.transferItemToLoc(W, src)) - return - igniter = I + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + igniter = inserting_igniter update_appearance() - return - - else if(istype(W, /obj/item/tank/internals/plasma)) + balloon_alert(user, "attached") + return ITEM_INTERACT_SUCCESS + if(istype(tool, /obj/item/tank/internals/plasma)) if(ptank) - if(user.transferItemToLoc(W,src)) - ptank.forceMove(get_turf(src)) - ptank = W - to_chat(user, span_notice("You swap the plasma tank in [src]!")) - return - if(!user.transferItemToLoc(W, src)) - return - ptank = W + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + ptank.forceMove(get_turf(src)) + ptank = tool + to_chat(user, span_notice("You swap the plasma tank in [src]!")) + return ITEM_INTERACT_SUCCESS + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + ptank = tool update_appearance() - return + return ITEM_INTERACT_SUCCESS - else - return ..() + return NONE /obj/item/flamethrower/return_analyzable_air() if(ptank) diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 97b59fa0475..23e9c5952d4 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -390,7 +390,7 @@ to_chat(user, span_notice("You stick the rod into the stick of butter.")) user.temporarilyRemoveItemFromInventory(src) var/obj/item/food/butter/on_a_stick/new_item = new(drop_location()) - if (user.CanReach(new_item)) + if (new_item.IsReachableBy(user)) user.put_in_hands(new_item) qdel(src) return TRUE diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm index bfb9ccc0f4e..e2f79791817 100644 --- a/code/game/objects/items/food/monkeycube.dm +++ b/code/game/objects/items/food/monkeycube.dm @@ -31,6 +31,7 @@ var/mob/spammer = get_mob_by_key(fingerprintslast) var/mob/living/bananas = new spawned_mob(drop_location(), TRUE, spammer) // funny that we pass monkey init args to non-monkey mobs, that's totally a future issue if (!QDELETED(bananas)) + ADD_TRAIT(bananas, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(faction) bananas.faction = faction diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 262a493cc75..11e7f3683e2 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -180,6 +180,13 @@ update_appearance() return FALSE + for(var/obj/effect/forcefield/cosmic_field/potential_field as anything in GLOB.active_cosmic_fields) + if(get_dist(potential_field, src) < 3) + new /obj/effect/temp_visual/revenant(get_turf(src)) + active = FALSE + update_appearance() + return FALSE + dud_flags |= GRENADE_USED // Don't detonate if we have already detonated. if(shrapnel_type && shrapnel_radius && !shrapnel_initialized) // add a second check for adding the component in case whatever triggered the grenade went straight to prime (badminnery for example) shrapnel_initialized = TRUE diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 33f0c877483..13ceb593cc0 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -106,25 +106,12 @@ /obj/effect/payload_spawner/random_slime/volatile volatile = TRUE -/obj/item/slime_extract/proc/activate_slime() - var/list/slime_chems = src.activate_reagents - if(!QDELETED(src)) - var/chem = pick(slime_chems) - var/amount = 5 - if(chem == "lesser plasma") //In the rare case we get another rainbow. - chem = /datum/reagent/toxin/plasma - amount = 4 - if(chem == "holy water and uranium") - chem = /datum/reagent/uranium - reagents.add_reagent(/datum/reagent/water/holywater) - reagents.add_reagent(chem, amount) - /obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned) for(var/_ in 1 to numspawned) var/chosen = pick(subtypesof(/obj/item/slime_extract)) var/obj/item/slime_extract/slime_extract = new chosen(loc) if(volatile) - addtimer(CALLBACK(slime_extract, TYPE_PROC_REF(/obj/item/slime_extract, activate_slime)), rand(RANDOM_DETONATE_MIN_TIME, RANDOM_DETONATE_MAX_TIME)) + addtimer(CALLBACK(slime_extract, TYPE_PROC_REF(/obj/item/slime_extract, auto_activate_reaction)), rand(RANDOM_DETONATE_MIN_TIME, RANDOM_DETONATE_MAX_TIME)) var/steps = rand(1, 4) for(var/step in 1 to steps) step_away(src, loc) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index e479d7d818a..0c796267578 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -29,6 +29,8 @@ // Spawn some hostile syndicate critters and spread them out var/list/spawned = spawn_and_random_walk(spawner_type, target_turf, deliveryamt, walk_chance = 50, admin_spawn = ((flags_1 & ADMIN_SPAWNED_1) ? TRUE : FALSE)) afterspawn(spawned) + for(var/mob/living/created as anything in spawned) + ADD_TRAIT(created, TRAIT_SPAWNED_MOB, INNATE_TRAIT) qdel(src) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 069cbcd0556..2c16b04b0a4 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -55,17 +55,16 @@ ///How long it takes to handcuff someone var/handcuff_time = 4 SECONDS - ///Multiplier for handcuff time - var/handcuff_time_mod = 1 ///Sound that plays when starting to put handcuffs on someone var/cuffsound = 'sound/items/weapons/handcuffs.ogg' ///Sound that plays when restrain is successful var/cuffsuccesssound = 'sound/items/handcuff_finish.ogg' - ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. - var/trashtype = null /// How strong the cuffs are. Weak cuffs can be broken with wirecutters or boxcutters. var/restraint_strength = HANDCUFFS_TYPE_STRONG + /// Is this pair of cuff being actually used? + var/used = FALSE + /obj/item/restraints/handcuffs/apply_fantasy_bonuses(bonus) . = ..() handcuff_time = modify_fantasy_variable("handcuff_time", handcuff_time, -bonus * 2, minimum = 0.3 SECONDS) @@ -79,7 +78,7 @@ acid = 50 /obj/item/restraints/handcuffs/attack(mob/living/target_mob, mob/living/user) - if(!iscarbon(target_mob)) + if(!iscarbon(target_mob) || used) return attempt_to_cuff(target_mob, user) @@ -90,9 +89,7 @@ victim.balloon_alert(user, "can't be handcuffed!") return - if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) //Clumsy people have a 50% chance to handcuff themselves instead of their target. - to_chat(user, span_warning("Uh... how do those things work?!")) - apply_cuffs(user, user) + if(handcuffs_clumsiness_check(user)) return if(!isnull(victim.handcuffed)) @@ -114,12 +111,7 @@ playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, victim, "attempted to handcuff") - if(HAS_TRAIT(user, TRAIT_FAST_CUFFING)) - handcuff_time_mod = 0.75 - else - handcuff_time_mod = 1 - - if(!do_after(user, handcuff_time * handcuff_time_mod, victim, timed_action_flags = IGNORE_SLOWDOWNS) || !victim.canBeHandcuffed()) + if(!do_after(user, get_handcuff_time(user), victim, timed_action_flags = IGNORE_SLOWDOWNS) || !victim.canBeHandcuffed()) victim.balloon_alert(user, "failed to handcuff!") to_chat(user, span_warning("You fail to handcuff [victim]!")) log_combat(user, victim, "failed to handcuff") @@ -136,7 +128,16 @@ log_combat(user, victim, "successfully handcuffed") SSblackbox.record_feedback("tally", "handcuffs", 1, type) +///Return the amount of time the user would spend cuffing someone or something +/obj/item/restraints/handcuffs/proc/get_handcuff_time(mob/user) + return handcuff_time * (HAS_TRAIT(user, TRAIT_FAST_CUFFING) ? 0.75 : 1) +/obj/item/restraints/handcuffs/proc/handcuffs_clumsiness_check(mob/user) + if(!iscarbon(user) || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50)) //Clumsy people have a 50% chance to handcuff themselves instead of their target. + return FALSE + to_chat(user, span_warning("Uh... how do those things work?!")) + apply_cuffs(user, user) + return TRUE /** * When called, this instantly puts handcuffs on someone (if actually possible) * @@ -153,17 +154,25 @@ return var/obj/item/restraints/handcuffs/cuffs = src - if(trashtype) - cuffs = new trashtype() - else if(dispense) + if(dispense) cuffs = new type() target.equip_to_slot(cuffs, ITEM_SLOT_HANDCUFFED) SEND_SIGNAL(target, COMSIG_MOB_HANDCUFFED) //BUBBER EDIT ADDITION - if(trashtype && !dispense) + if(dispense) qdel(src) +/obj/item/restraints/handcuffs/equipped(mob/living/user, slot) + . = ..() + if(slot == ITEM_SLOT_HANDCUFFED) + RegisterSignal(src, COMSIG_ITEM_DROPPED, PROC_REF(on_uncuffed)) //Make sure zipties are no longer usable the next time someone removes them + +/obj/item/restraints/handcuffs/proc/on_uncuffed(datum/source, mob/living/wearer) + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + UnregisterSignal(src, COMSIG_ITEM_DROPPED) + /** * # Alien handcuffs * @@ -343,10 +352,15 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' custom_materials = null breakouttime = 45 SECONDS - trashtype = /obj/item/restraints/handcuffs/cable/zipties/used color = null cable_color = null +/obj/item/restraints/handcuffs/cable/zipties/on_uncuffed(datum/source, mob/living/wearer) + . = ..() + desc = "A pair of broken zipties." + icon_state = "cuff_used" + used = TRUE + /** * # Used zipties * @@ -355,9 +369,7 @@ /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cuff_used" - -/obj/item/restraints/handcuffs/cable/zipties/used/attack() - return + used = TRUE /** * # Fake Zipties @@ -373,6 +385,21 @@ /obj/item/restraints/handcuffs/cable/zipties/fake/used desc = "A pair of broken fake zipties." icon_state = "cuff_used" + used = TRUE + +///handcuffs applied by cult magic and heretics sacrifice +/obj/item/restraints/handcuffs/cult + name = "shadow shackles" + desc = "Shackles that bind the wrists with sinister magic." + breakouttime = 45 SECONDS + icon_state = "cult_shackles" + flags_1 = NONE + +/obj/item/restraints/handcuffs/cult/on_uncuffed(datum/source, mob/living/wearer) + . = ..() + wearer.visible_message(span_danger("[wearer]'s shackles shatter in a discharge of dark magic!"), span_userdanger("Your [src] shatters in a discharge of dark magic!")) + qdel(src) + /** * # Generic leg cuffs diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm index 178dfcae2a6..d957100ce70 100644 --- a/code/game/objects/items/implants/security/implant_chem.dm +++ b/code/game/objects/items/implants/security/implant_chem.dm @@ -95,9 +95,7 @@ desc = "A glass case containing a remote chemical implant." imp_type = /obj/item/implant/chem -/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/reagent_containers/syringe) && imp) - W.interact_with_atom(imp, user, modifiers) - return TRUE - else - return ..() +/obj/item/implantcase/chem/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/reagent_containers/syringe) && imp) + return NONE + return tool.interact_with_atom(imp, user, modifiers) diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index d0feef1471e..2f96f3fb737 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -462,11 +462,13 @@ var/datum/action/innate/origami/origami_action = locate() in user.actions if(origami_action?.active) //Origami masters can fold water make_plane(user, /obj/item/paperplane/syndicate) - else if(do_after(user, 1 SECONDS, target = src, progress=TRUE)) - var/turf/open/target = get_turf(src) - target.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) - to_chat(user, span_notice("As you try to fold [src] into the shape of a plane, it disintegrates into water!")) - qdel(src) + return CLICK_ACTION_SUCCESS + if(!do_after(user, 1 SECONDS, target = src, progress=TRUE)) + return CLICK_ACTION_BLOCKING + var/turf/open/target = get_turf(src) + target.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) + to_chat(user, span_notice("As you try to fold [src] into the shape of a plane, it disintegrates into water!")) + qdel(src) return CLICK_ACTION_SUCCESS #undef ENERGY_TO_SPEAK diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index e08080504dd..b2190cdc886 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -98,7 +98,6 @@ /obj/item/latexballoon/bullet_act(obj/projectile/projectile) if(projectile.damage > 0) burst() - return ..() /obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm index 650405f467f..63e539302b5 100644 --- a/code/game/objects/items/lighter.dm +++ b/code/game/objects/items/lighter.dm @@ -37,11 +37,14 @@ "thirteen", "snake", ) + /// Whether the lighter starts with fuel + var/spawns_with_reagent = TRUE /obj/item/lighter/Initialize(mapload) . = ..() create_reagents(maximum_fuel, REFILLABLE | DRAINABLE) - reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) + if(spawns_with_reagent) + reagents.add_reagent(/datum/reagent/fuel, maximum_fuel) if(!overlay_state) overlay_state = pick(overlay_list) AddComponent(\ @@ -227,12 +230,11 @@ /obj/item/lighter/process(seconds_per_tick) if(lit) + open_flame(heat) burned_fuel_for += seconds_per_tick if(burned_fuel_for >= TOOL_FUEL_BURN_INTERVAL) use(used = 0.25) - open_flame(heat) - /obj/item/lighter/get_temperature() return lit * heat @@ -367,3 +369,9 @@ /obj/item/lighter/mime, /obj/item/lighter/bright, ) + +/obj/item/lighter/empty + spawns_with_reagent = FALSE + +/obj/item/lighter/greyscale/empty + spawns_with_reagent = FALSE diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 5c883ddda08..600d8c72cae 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -776,7 +776,7 @@ /obj/item/melee/baton/security/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() - if(!. && active && prob(throw_stun_chance) && isliving(hit_atom)) + if(!. && active && prob(throw_stun_chance) && hit_atom) finalize_baton_attack(hit_atom, throwingdatum?.get_thrower()) /obj/item/melee/baton/security/emp_act(severity) @@ -808,6 +808,42 @@ /obj/item/melee/baton/security/loaded/hos preload_cell_type = /obj/item/stock_parts/power_store/cell/super +///Stun Sword +/obj/item/melee/baton/security/stunsword + name = "\improper NT-20 'Excalibur' Stunsword" + desc = "It's a sword. It stuns. What more could you want?" + icon_state = "stunsword" + inhand_icon_state = "stunsword" + base_icon_state = "stunsword" + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + hitsound = 'sound/items/weapons/bladeslice.ogg' + attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") + inhand_x_dimension = 64 + inhand_y_dimension = 64 + w_class = WEIGHT_CLASS_HUGE + sharpness = SHARP_EDGED + force = 30 + throwforce = 10 + wound_bonus = 0 + exposed_wound_bonus = 30 + stun_armour_penetration = 40 + throw_stun_chance = 60 + convertible = FALSE + tip_changes_color = FALSE + + obj_flags = UNIQUE_RENAME + unique_reskin = list( + "Default" = "stunsword", + "Energy Stunsword" = "stunsword_energy", + ) + unique_reskin_changes_inhand = TRUE + unique_reskin_changes_base_icon_state = TRUE + +/obj/item/melee/baton/security/stunsword/loaded + preload_cell_type = /obj/item/stock_parts/power_store/cell/bluespace // 40% stun_armour_penetration + //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/security/cattleprod name = "stunprod" diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 675ac2c1a50..a867ee98890 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -339,6 +339,10 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' light_color = COLOR_RED +/obj/item/melee/energy/sword/pirate/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard + /// Energy blades, which are effectively perma-extended energy swords /obj/item/melee/energy/blade name = "energy blade" @@ -391,12 +395,8 @@ /obj/item/melee/energy/sword/surplus name = "\improper Type I 'Iaito' energy sword" - desc = "Oversized, overengineered, and mass-produced. The two blades help make up for the poor cutting plane the emitter generates. Hopefully. \ - Supposedly, this version of the energy sword was a Waffle Corp prototype that was first trialed in a variety of armed conflicts around the interstellar \ - frontier. The success rate, and survival of its users, were abysmally low. To make matters worse, they had made so many of these swords (accidentally) that \ - it would cost the company more disposing of them than trying to offload them to raise a quick buck. Thus, the 'Iaito' was 'born'. Often found in the hands of \ - grunts, mooks, goons, criminals, wannabe assassins or lunatics. You may or may not fit into one of these categories if you are genuinely attempting to kill someone\ - with this sword." + desc = "Oversized, overengineered, and somehow still mass-produced. The twin energy blades, theoretically, help make up for the poor cutting plane the emitter generates. \ + When there are no more heroes in a desperate struggle, it's kill or be killed." icon_state = "surplus_e_sword" inhand_icon_state = "surplus_e_sword" base_icon_state = "surplus_e_sword" @@ -423,6 +423,19 @@ /obj/item/melee/energy/sword/surplus/Initialize(mapload) . = ..() RegisterSignal(src, COMSIG_TRANSFORMING_PRE_TRANSFORM, PROC_REF(check_power)) + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "This early iteration of the now infamous energy sword was, supposedly, a Waffle Corp prototype first trialed in a variety of armed conflicts \ + around the interstellar frontier.
\ +
\ + Unfortunately, the success rate of the platform, along with the survival rate of its users, was abysmally low. \ + To make matters worse, initial overestimation of its effectiveness meant that by the time its myriad flaws reared their heads, production had already \ + reached such a level that the company behind its manufacture would have to pay more to properly disassemble and dispose of the swords, \ + than if they started offloading them onto markets of various legitimacy to try and recoup costs. Thus, the Iaito was 'born'.

\ + As a consequence of its haphazard proliferation and its low market price compared to later, improved energy sword models, examples of the Iaito are \ + typically found in the hands of various grunts, mooks, goons, criminals, wannabe assassins, lunatics, or those otherwise embroiled in \ + a desperate struggle. If you're actually trying to kill someone with this sword, you may or may not fit into one or more of those categories." \ + ) /obj/item/melee/energy/sword/surplus/examine(mob/user) . = ..() @@ -516,3 +529,52 @@ playsound(src, 'sound/items/baton/telescopic_baton_folded_pickup.ogg', 40, TRUE) COOLDOWN_START(src, jiggle_cooldown, 1 SECONDS) return TRUE + +// Null rod variants + +/obj/item/melee/energy/sword/nullrod + name = "light energy sword" + desc = "If you strike me down, I shall become more robust than you can possibly imagine." + throw_speed = 3 + throw_range = 4 + block_chance = 30 + armour_penetration = 0 + wound_bonus = -10 + demolition_mod = 1 + embed_type = /datum/embedding/holy_esword + sword_color_icon = "blue" + light_color = LIGHT_COLOR_LIGHT_CYAN + active_force = 18 + active_throwforce = 10 + alt_force_mod = -3 + +/obj/item/melee/energy/sword/nullrod/Initialize(mapload) + . = ..() + AddElement(/datum/element/nullrod_core) + +/datum/embedding/holy_esword + embed_chance = 0 + +/obj/item/melee/energy/sword/nullrod/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) + if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) + return FALSE + + if(attack_type == PROJECTILE_ATTACK || attack_type == LEAP_ATTACK || attack_type == OVERWHELMING_ATTACK) + final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword. Or a road roller, if one happened to hit you. + + return ..() + +/obj/item/melee/energy/sword/nullrod/red + name = "dark energy sword" + desc = "Woefully ineffective when used on steep terrain." + sword_color_icon = "red" + light_color = COLOR_SOFT_RED + +/obj/item/melee/energy/sword/nullrod/pirate + name = "nautical energy cutlass" + desc = "Convincing HR that your religion involved piracy was no mean feat." + icon_state = "e_cutlass" + inhand_icon_state = "e_cutlass" + base_icon_state = "e_cutlass" + sword_color_icon = null + light_color = COLOR_RED diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 323bcce548a..028d6fead81 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -60,6 +60,7 @@ /obj/item/melee/sabre/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard AddComponent(/datum/component/jousting) //fast and effective, but as a sword, it might damage the results. AddComponent(/datum/component/butchering, \ @@ -172,6 +173,7 @@ /obj/item/melee/parsnip_sabre/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard AddComponent(/datum/component/jousting) /obj/item/melee/parsnip_sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) @@ -510,7 +512,7 @@ material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color. custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4.5, /datum/material/wood = SHEET_MATERIAL_AMOUNT * 1.5) //Defaults to an Iron Mace. slot_flags = ITEM_SLOT_BELT - force = 14 + force = 16 w_class = WEIGHT_CLASS_BULKY throwforce = 8 block_chance = 10 diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index c9b69f05b15..0965f73da9f 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -47,6 +47,7 @@ /obj/item/pet_carrier/Initialize(mapload) . = ..() register_context() + AddElement(/datum/element/cuffable_item) /obj/item/pet_carrier/Destroy() if(occupants.len) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index f733481ae9b..48e5f14d0c6 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -19,13 +19,12 @@ var/obj/item/toy/plush/plush_child var/obj/item/toy/plush/paternal_parent //who initiated creation var/obj/item/toy/plush/maternal_parent //who owns, see love() - var/static/list/breeding_blacklist = typecacheof(/obj/item/toy/plush/carpplushie/dehy_carp) // you cannot have sexual relations with this plush var/list/scorned = list() //who the plush hates var/list/scorned_by = list() //who hates the plush, to remove external references on Destroy() var/heartbroken = FALSE var/vowbroken = FALSE var/young = FALSE -///Prevents players from cutting stuffing out of a plushie if true + ///Prevents players from cutting stuffing out of a plushie if true var/divine = FALSE var/mood_message var/list/love_message @@ -34,6 +33,9 @@ var/list/vowbroken_message var/list/parent_message var/normal_desc + /// The type of offspring this plush generates. If not set, it'll default to the type itself on init. + var/offspring_type + //--end of love :'(-- /* @@ -47,6 +49,7 @@ AddComponent(/datum/component/squeak, squeak_override) AddElement(/datum/element/bed_tuckable, mapload, 6, -5, 90) AddElement(/datum/element/toy_talk) + AddElement(/datum/element/cuffable_item) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) @@ -55,6 +58,9 @@ else gender = MALE + if(!offspring_type) + offspring_type = type + love_message = list("\n[src] is so happy, \he could rip a seam!") partner_message = list("\n[src] has a ring on \his finger! It says bound to my dear [partner].") heartbroken_message = list("\n[src] looks so sad.") @@ -290,19 +296,15 @@ mood_message = pick(partner_message) update_desc() -/obj/item/toy/plush/proc/plop(obj/item/toy/plush/Daddy) - if(partner != Daddy) +/obj/item/toy/plush/proc/plop(obj/item/toy/plush/daddy) + if(partner != daddy) return FALSE //we do not have bastards in our toyshop - if(is_type_in_typecache(Daddy, breeding_blacklist)) - return FALSE // some love is forbidden + // Ask the RNG if it looks more like mommy or daddy. + var/chosen_type = pick(offspring_type, daddy.offspring_type) - if(prob(50)) //it has my eyes - plush_child = new type(get_turf(loc)) - else //it has your eyes - plush_child = new Daddy.type(get_turf(loc)) - - plush_child.make_young(src, Daddy) + plush_child = new chosen_type(get_turf(loc)) + plush_child.make_young(src, daddy) /obj/item/toy/plush/proc/make_young(obj/item/toy/plush/Mama, obj/item/toy/plush/Dada) if(Mama == Dada) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 5d1c23caa75..f5ac5553c87 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -404,8 +404,8 @@ /obj/item/claymore/weak desc = "This one is rusted." - force = 24 - armour_penetration = 10 + force = 30 + armour_penetration = 15 /obj/item/claymore/weak/make_stabby() AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -9) diff --git a/code/game/objects/items/robot/items/hypo.dm b/code/game/objects/items/robot/items/hypo.dm index 3a9dd2896af..23ab286004c 100644 --- a/code/game/objects/items/robot/items/hypo.dm +++ b/code/game/objects/items/robot/items/hypo.dm @@ -198,6 +198,7 @@ to_chat(injectee, span_warning("You feel a tiny prick!")) to_chat(user, span_notice("You inject [injectee] with the injector ([selected_reagent.name]).")) + user.changeNext_move(CLICK_CD_MELEE) if(injectee.reagents) hypospray_injector.trans_to(injectee, amount_per_transfer_from_this, transferred_by = user, methods = INJECT) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 19727a38a23..a54c3bf46eb 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -43,6 +43,7 @@ /obj/item/shield/Initialize(mapload) . = ..() AddElement(/datum/element/disarm_attack) + AddElement(/datum/element/cuffable_item) //I mean, it has a closed handle, right? /obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) var/effective_block_chance = final_block_chance diff --git a/code/game/objects/items/skateboards.dm b/code/game/objects/items/skateboards.dm new file mode 100644 index 00000000000..f03189ec012 --- /dev/null +++ b/code/game/objects/items/skateboards.dm @@ -0,0 +1,63 @@ + +/obj/item/melee/skateboard + name = "skateboard" + desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." + icon = 'icons/mob/rideables/vehicles.dmi' + icon_state = "skateboard_held" + inhand_icon_state = "skateboard" + force = 12 + throwforce = 4 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("smacks", "whacks", "slams", "smashes") + attack_verb_simple = list("smack", "whack", "slam", "smash") + ///The vehicle counterpart for the board + var/board_item_type = /obj/vehicle/ridden/scooter/skateboard + +/obj/item/melee/skateboard/attack_self(mob/user) + var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault + S.buckle_mob(user) + qdel(src) + +/obj/item/melee/skateboard/improvised + name = "improvised skateboard" + desc = "A jury-rigged skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." + board_item_type = /obj/vehicle/ridden/scooter/skateboard/improvised + +/obj/item/melee/skateboard/pro + name = "skateboard" + desc = "An EightO brand professional skateboard. It looks sturdy and well made." + icon_state = "skateboard2_held" + inhand_icon_state = "skateboard2" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro + custom_premium_price = PAYCHECK_COMMAND * 5 + +/obj/item/melee/skateboard/hoverboard + name = "hoverboard" + desc = "A blast from the past, so retro!" + icon_state = "hoverboard_red_held" + inhand_icon_state = "hoverboard_red" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard + custom_premium_price = PAYCHECK_COMMAND * 5.4 //If I can't make it a meme I'll make it RAD + +/obj/item/melee/skateboard/hoverboard/admin + name = "Board Of Directors" + desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." + icon_state = "hoverboard_nt_held" + inhand_icon_state = "hoverboard_nt" + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin + +/obj/item/melee/skateboard/holyboard + name = "holy skateboard" + desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." + icon_state = "hoverboard_holy_held" + inhand_icon_state = "hoverboard_holy" + force = 18 + throwforce = 6 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") + attack_verb_simple = list("bash", "crash", "grind", "skate") + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded + +/obj/item/melee/skateboard/holyboard/Initialize(mapload) + . = ..() + AddElement(/datum/element/nullrod_core) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index b9a907f8b32..ba18ab8e06d 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -501,7 +501,7 @@ balloon_alert(user, "not enough gauze!") return new /obj/item/stack/sheet/cloth(I.drop_location()) - if(user.CanReach(src)) + if(IsReachableBy(user)) user.visible_message(span_notice("[user] cuts [src] into pieces of cloth with [I]."), \ span_notice("You cut [src] into pieces of cloth with [I]."), \ span_hear("You hear cutting.")) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index dc62221ed00..0156dadf69c 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -123,14 +123,14 @@ /obj/item/stack/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() if((!throwing || throwing.target_turf == loc) && old_loc != loc && (flags_1 & INITIALIZED_1)) - merge_with_loc() + merge_with_loc(merge_into_ourselves = !isnull(pulledby)) ///Called to lazily update the materials of the item whenever the used or if more is added /obj/item/stack/proc/update_custom_materials() if(length(mats_per_unit)) set_custom_materials(mats_per_unit, amount) -/obj/item/stack/proc/find_other_stack(list/already_found) +/obj/item/stack/proc/find_other_stack(list/already_found, merge_into_ourselves = FALSE) if(QDELETED(src) || isnull(loc)) return for(var/obj/item/stack/item_stack in loc) @@ -141,20 +141,23 @@ var/stack_ref = REF(item_stack) if(already_found[stack_ref]) continue - if(can_merge(item_stack)) + if(merge_into_ourselves ? item_stack.can_merge(src) : can_merge(item_stack)) already_found[stack_ref] = TRUE return item_stack /// Tries to merge the stack with everything on the same tile. -/obj/item/stack/proc/merge_with_loc() +/obj/item/stack/proc/merge_with_loc(merge_into_ourselves = FALSE) var/list/already_found = list() // change to alist whenever dreamchecker and such finally supports that - var/obj/item/other_stack = find_other_stack(already_found) + var/obj/item/stack/other_stack = find_other_stack(already_found, merge_into_ourselves) var/sanity = max_amount // just in case while(other_stack && sanity > 0) sanity-- - if(merge(other_stack)) + if(!merge_into_ourselves) + if(merge(other_stack)) + return FALSE + else if (other_stack.merge(src) && !QDELETED(other_stack)) return FALSE - other_stack = find_other_stack(already_found) + other_stack = find_other_stack(already_found, TRUE) return TRUE /obj/item/stack/apply_material_effects(list/materials) @@ -208,12 +211,14 @@ return list() //empty list /obj/item/stack/proc/update_weight() - if(amount <= (max_amount * (1/3))) - update_weight_class(clamp(full_w_class-2, WEIGHT_CLASS_TINY, full_w_class)) - else if (amount <= (max_amount * (2/3))) - update_weight_class(clamp(full_w_class-1, WEIGHT_CLASS_TINY, full_w_class)) - else - update_weight_class(full_w_class) + update_weight_class(get_weight_from_size(amount)) + +/obj/item/stack/proc/get_weight_from_size(stack_amount) + if(stack_amount <= (max_amount * (1/3))) + return clamp(full_w_class - 2, WEIGHT_CLASS_TINY, full_w_class) + if(stack_amount <= (max_amount * (2/3))) + return clamp(full_w_class - 1, WEIGHT_CLASS_TINY, full_w_class) + return full_w_class /obj/item/stack/update_icon_state() if(novariants) @@ -674,8 +679,35 @@ transfer = min(transfer, round((target_stack.source.max_energy - target_stack.source.energy) / target_stack.cost)) else transfer = min(transfer, (limit ? limit : target_stack.max_amount) - target_stack.amount) - if(pulledby) + // Ensure that we're not bloating the target stack to the point where it falls out of storage + if(target_stack.loc?.atom_storage) + var/datum/storage/target_storage = target_stack.loc?.atom_storage + var/cur_size = target_stack.w_class + var/new_size = target_stack.get_weight_from_size(target_stack.amount + transfer) + var/real_new_size = new_size + var/real_cur_size = cur_size + + // Ensure that we don't end up with two mergeable stacks if our own size gets reduced enough from the merge and we share the space + if (!is_cyborg && loc == target_stack.loc) + real_cur_size += w_class + if (amount > transfer) + real_new_size += get_weight_from_size(amount - transfer) + + // If total size changed, check for overflows + if(new_size > cur_size) + var/size_limit = max(new_size - target_storage.max_specific_storage, target_storage.get_total_weight() + real_new_size - real_cur_size - target_storage.max_total_storage) + // If we're over the stack limit the storage container can support, reduce the transferred amount + // to the nearest size threshold, then by a third of the target stack per excess size + if(size_limit > 0) + var/to_threshold = FLOOR(target_stack.amount + transfer, floor(target_stack.max_amount / 3)) + transfer = clamp(to_threshold - floor(target_stack.max_amount / 3) * (size_limit - 1) - target_stack.amount, 0, transfer) + + if(!transfer) + return + + if(pulledby && is_zero_amount(delete_if_zero = FALSE)) pulledby.start_pulling(target_stack) + target_stack.copy_evidences(src) use(transfer, transfer = TRUE, check = FALSE) target_stack.add(transfer) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 12405255be3..c3ef87b9ddf 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -140,6 +140,12 @@ icon_state = "backpack-medical" inhand_icon_state = "medicalpack" +/obj/item/storage/backpack/chief_medic + name = "chief medical officer's backpack" + desc = "A backpack with just enough pockets to carry the chief medical officer's equipment." + icon_state = "backpack-chiefmedical" + inhand_icon_state = "medicalpack" + /obj/item/storage/backpack/coroner name = "coroner backpack" desc = "It's a backpack especially designed for use in an undead environment." @@ -315,6 +321,12 @@ icon_state = "satchel-medical" inhand_icon_state = "satchel-med" +/obj/item/storage/backpack/satchel/chief_medic + name = "chief medical officer's satchel" + desc = "A satchel with barely enough pockets to carry the chief medical officer's equipment." + icon_state = "satchel-chiefmedical" + inhand_icon_state = "satchel-med" + /obj/item/storage/backpack/satchel/vir name = "virologist satchel" desc = "A sterile satchel with virologist colours." @@ -420,6 +432,12 @@ icon_state = "messenger_medical" inhand_icon_state = "messenger_medical" +/obj/item/storage/backpack/messenger/chief_medic + name = "chief medical officer's messenger bag" + desc = "A slim messenger bag appreciated by chief medical officers for staying out of their way while working - unlike their chemists." + icon_state = "messenger_chiefmedical" + inhand_icon_state = "messenger_medical" + /obj/item/storage/backpack/messenger/vir name = "virologist messenger bag" desc = "A sterile messenger bag with virologist colours, useful for deploying biohazards in record times." diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index b9da9b34bb3..5916524f9dd 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -158,14 +158,20 @@ RegisterSignal(tile, COMSIG_ATOM_ENTERED, PROC_REF(on_obj_entered)) RegisterSignal(tile, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(on_atom_initialized_on)) + INVOKE_ASYNC(src, PROC_REF(handle_move), user) + +/obj/item/storage/bag/ore/proc/handle_move(mob/living/user) + var/turf/tile = get_turf(user) var/obj/structure/ore_box/box = null if(istype(user.pulling, /obj/structure/ore_box)) box = user.pulling var/show_message = FALSE for(var/atom/thing as anything in tile) - if(is_type_in_typecache(thing, atom_storage.can_hold)) - show_message ||= pickup_ore(thing, user, box) + if(!is_type_in_typecache(thing, atom_storage.can_hold)) + continue + if(pickup_ore(thing, user, box)) + show_message = TRUE if (!show_message) spam_protection = FALSE @@ -197,9 +203,18 @@ box = user.pulling if (box) - user.transferItemToLoc(ore, box) + user.transferItemToLoc(ore, box, animated = FALSE) return TRUE + if (istype(ore, /obj/item/stack/ore)) + var/obj/item/stack/ore/real_ore = ore + for(var/obj/item/stack/ore/stored_ore as anything in src) + if(!real_ore.can_merge(stored_ore)) + continue + real_ore.merge(stored_ore) + if(QDELETED(real_ore)) + return TRUE + if (atom_storage.attempt_insert(ore, user)) return TRUE @@ -210,13 +225,13 @@ /obj/item/storage/bag/ore/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc) SIGNAL_HANDLER - if(is_type_in_list(arrived, atom_storage.can_hold) && !dropping_ores) - pickup_ore(arrived, listening_to) + if(is_type_in_list(arrived, atom_storage.can_hold) && !dropping_ores && old_loc != loc) + INVOKE_ASYNC(src, PROC_REF(pickup_ore), arrived, listening_to) /obj/item/storage/bag/ore/proc/on_atom_initialized_on(atom/loc, atom/new_atom) SIGNAL_HANDLER if(is_type_in_list(new_atom, atom_storage.can_hold)) - pickup_ore(new_atom, listening_to) + INVOKE_ASYNC(src, PROC_REF(pickup_ore), new_atom, listening_to) /obj/item/storage/bag/ore/cyborg name = "cyborg mining satchel" diff --git a/code/game/objects/items/storage/basket.dm b/code/game/objects/items/storage/basket.dm index ab33ea67d84..4859bd6b598 100644 --- a/code/game/objects/items/storage/basket.dm +++ b/code/game/objects/items/storage/basket.dm @@ -7,3 +7,6 @@ resistance_flags = FLAMMABLE storage_type = /datum/storage/basket +/obj/item/storage/basket/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 74504a779fa..da44e6cb497 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -621,13 +621,13 @@ . += span_notice("Alt-click it to quickly draw the blade.") /obj/item/storage/belt/sheath/click_alt(mob/user) - if(length(contents)) - var/obj/item/I = contents[1] - user.visible_message(span_notice("[user] takes [I] out of [src]."), span_notice("You take [I] out of [src].")) - user.put_in_hands(I) - update_appearance() - else + if(!length(contents)) balloon_alert(user, "it's empty!") + return CLICK_ACTION_BLOCKING + var/obj/item/stored_item = contents[1] + user.visible_message(span_notice("[user] takes [stored_item] out of [src]."), span_notice("You take [stored_item] out of [src].")) + user.put_in_hands(stored_item) + update_appearance() return CLICK_ACTION_SUCCESS /obj/item/storage/belt/sheath/update_icon_state() diff --git a/code/game/objects/items/storage/boxes/engineering_boxes.dm b/code/game/objects/items/storage/boxes/engineering_boxes.dm index 66e9887039e..f2b0fcc97b2 100644 --- a/code/game/objects/items/storage/boxes/engineering_boxes.dm +++ b/code/game/objects/items/storage/boxes/engineering_boxes.dm @@ -41,6 +41,7 @@ /obj/item/uplink/nuclear/debug=1, /obj/item/clothing/ears/earmuffs/debug=1, /obj/item/gps/visible_debug=1, + /obj/item/clothing/glasses/meson/engine/admin=1, ) generate_items_inside(items_inside, src) diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index dc710870c56..16c6a02468b 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -21,6 +21,10 @@ /// The path of the folder that gets spawned in New() var/folder_path = /obj/item/folder +/obj/item/storage/briefcase/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/storage/briefcase/PopulateContents() new /obj/item/pen(src) var/obj/item/folder/folder = new folder_path(src) diff --git a/code/game/objects/items/storage/dufflebags.dm b/code/game/objects/items/storage/dufflebags.dm index de80f3e782b..cc58e52a505 100644 --- a/code/game/objects/items/storage/dufflebags.dm +++ b/code/game/objects/items/storage/dufflebags.dm @@ -132,6 +132,12 @@ icon_state = "duffel-medical" inhand_icon_state = "duffel-med" +/obj/item/storage/backpack/duffelbag/chief_medic + name = "chief medical officer's duffel bag" + desc = "A large duffel bag for handling the duties of the entire medical department at once." + icon_state = "duffel-chiefmedical" + inhand_icon_state = "duffel-med" + /obj/item/storage/backpack/duffelbag/coroner name = "coroner duffel bag" desc = "A large duffel bag for holding large amounts of organs at once." diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 8470c084136..14c5c626fe7 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -231,6 +231,8 @@ . = ..() register_context() + if(!spawn_count) + update_appearance() /obj/item/storage/fancy/cigarettes/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) . = ..() @@ -294,6 +296,11 @@ . += "[use_icon_state]_[cig_position]" cig_position++ +/obj/item/storage/fancy/cigarettes/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/dromedaryco name = "\improper DromedaryCo packet" desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" @@ -301,6 +308,11 @@ base_icon_state = "dromedary" spawn_type = /obj/item/cigarette/dromedary +/obj/item/storage/fancy/cigarettes/dromedaryco/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_uplift name = "\improper Uplift Smooth packet" desc = "Your favorite brand, now menthol flavored." @@ -308,6 +320,11 @@ base_icon_state = "uplift" spawn_type = /obj/item/cigarette/uplift +/obj/item/storage/fancy/cigarettes/cigpack_uplift/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_robust name = "\improper Robust packet" desc = "Smoked by the robust." @@ -315,6 +332,11 @@ base_icon_state = "robust" spawn_type = /obj/item/cigarette/robust +/obj/item/storage/fancy/cigarettes/cigpack_robust/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_robustgold name = "\improper Robust Gold packet" desc = "Smoked by the truly robust." @@ -322,6 +344,11 @@ base_icon_state = "robustg" spawn_type = /obj/item/cigarette/robustgold +/obj/item/storage/fancy/cigarettes/cigpack_robustgold/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_greytide name = "\improper Mainthol Grey packet" desc = "The thin grey line." @@ -329,6 +356,11 @@ base_icon_state = "greytide" spawn_type = /obj/item/cigarette/greytide +/obj/item/storage/fancy/cigarettes/cigpack_greytide/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_carp name = "\improper Carp Classic packet" desc = "Since 2313." @@ -336,6 +368,11 @@ base_icon_state = "carp" spawn_type = /obj/item/cigarette/carp +/obj/item/storage/fancy/cigarettes/cigpack_carp/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_syndicate name = "cigarette packet" desc = "An obscure brand of cigarettes." @@ -343,6 +380,11 @@ base_icon_state = "syndie" spawn_type = /obj/item/cigarette/syndicate +/obj/item/storage/fancy/cigarettes/cigpack_syndicate/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_midori name = "\improper Midori Tabako packet" desc = "You can't understand the runes, but the packet smells funny." @@ -350,6 +392,11 @@ base_icon_state = "midori" spawn_type = /obj/item/cigarette/rollie/nicotine +/obj/item/storage/fancy/cigarettes/cigpack_midori/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_candy name = "\improper Timmy's First Candy Smokes packet" desc = "Unsure about smoking? Want to bring your children safely into the family tradition? Look no more with this special packet! Includes 100%* Nicotine-Free candy cigarettes." @@ -365,6 +412,11 @@ if(prob(7)) spawn_type = /obj/item/cigarette/candy/nicotine //uh oh! +/obj/item/storage/fancy/cigarettes/cigpack_candy/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_shadyjims name = "\improper Shady Jim's Super Slims packet" desc = "Is your weight slowing you down? Having trouble running away from gravitational singularities? Can't stop stuffing your mouth? Smoke Shady Jim's Super Slims and watch all that fat burn away. Guaranteed results!" @@ -372,6 +424,11 @@ base_icon_state = "shadyjim" spawn_type = /obj/item/cigarette/shadyjims +/obj/item/storage/fancy/cigarettes/cigpack_shadyjims/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_xeno name = "\improper Xeno Filtered packet" desc = "Loaded with 100% pure slime. And also nicotine." @@ -379,6 +436,11 @@ base_icon_state = "slime" spawn_type = /obj/item/cigarette/xeno +/obj/item/storage/fancy/cigarettes/cigpack_xeno/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_cannabis name = "\improper Freak Brothers' Special packet" desc = "A label on the packaging reads, \"Endorsed by Phineas, Freddy and Franklin.\"" @@ -386,6 +448,11 @@ base_icon_state = "midori" spawn_type = /obj/item/cigarette/rollie/cannabis +/obj/item/storage/fancy/cigarettes/cigpack_cannabis/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker name = "\improper Leary's Delight packet" desc = "Banned in over 36 galaxies." @@ -393,6 +460,11 @@ base_icon_state = "shadyjim" spawn_type = /obj/item/cigarette/rollie/mindbreaker +/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker/empty + spawn_count = 0 + spawn_coupon = FALSE + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/rollingpapers name = "rolling paper pack" desc = "A pack of Nanotrasen brand rolling papers." @@ -407,11 +479,20 @@ has_open_closed_states = FALSE storage_type = /datum/storage/rolling_paper_pack +/obj/item/storage/fancy/rollingpapers/Initialize(mapload) + . = ..() + + if(!spawn_count) + update_appearance() + /obj/item/storage/fancy/rollingpapers/update_overlays() . = ..() if(!contents.len) . += "[base_icon_state]_empty" +/obj/item/storage/fancy/rollingpapers/empty + spawn_count = 0 + ///////////// //CIGAR BOX// ///////////// @@ -435,6 +516,10 @@ //reset any changes the parent call may have made icon_state = base_icon_state +/obj/item/storage/fancy/cigarettes/cigars/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigars/update_overlays() . = ..() if(!open_status) @@ -451,6 +536,10 @@ base_icon_state = "cohibacase" spawn_type = /obj/item/cigarette/cigar/cohiba +/obj/item/storage/fancy/cigarettes/cigars/cohiba/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /obj/item/storage/fancy/cigarettes/cigars/havana name = "\improper premium Havanian cigar case" desc = "A case of classy Havanian cigars." @@ -458,6 +547,10 @@ base_icon_state = "cohibacase" spawn_type = /obj/item/cigarette/cigar/havana +/obj/item/storage/fancy/cigarettes/cigars/havana/empty + spawn_count = 0 + open_status = FANCY_CONTAINER_OPEN + /* * Heart Shaped Box w/ Chocolates */ diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index 750b97437b9..a9dd7ac62ac 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -54,6 +54,10 @@ new /obj/item/clothing/head/hats/caphat/parade(src) new /obj/item/clothing/neck/cloak/cap(src) new /obj/item/clothing/shoes/laceup(src) + new /obj/item/storage/backpack/captain(src) + new /obj/item/storage/backpack/satchel/cap(src) + new /obj/item/storage/backpack/duffelbag/captain(src) + new /obj/item/storage/backpack/messenger/cap(src) /obj/item/storage/bag/garment/hop/PopulateContents() new /obj/item/clothing/under/rank/civilian/head_of_personnel(src) @@ -179,7 +183,11 @@ new /obj/item/clothing/head/beret/medical/cmo(src) new /obj/item/clothing/head/utility/surgerycap/cmo(src) new /obj/item/clothing/neck/cloak/cmo(src) - new /obj/item/clothing/shoes/sneakers/blue (src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/storage/backpack/chief_medic(src) + new /obj/item/storage/backpack/satchel/chief_medic(src) + new /obj/item/storage/backpack/duffelbag/chief_medic(src) + new /obj/item/storage/backpack/messenger/chief_medic(src) //Duplication from Commdrobe new /obj/item/clothing/head/beret/medical/cmo/alt(src) new /obj/item/clothing/head/hats/imperial/cmo(src) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 69b46013a3a..7cb0e4c9d06 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -22,6 +22,7 @@ register_context() update_icon_state() + AddElement(/datum/element/cuffable_item) ///screentips for lockboxes /obj/item/storage/lockbox/add_context(atom/source, list/context, obj/item/held_item, mob/user) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 3d929779b99..0cf2631fd47 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -27,6 +27,10 @@ /// Defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses var/damagetype_healed +/obj/item/storage/medkit/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/storage/medkit/regular icon_state = "medkit" desc = "A first aid kit with the ability to heal common types of injuries." diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index d9e2fe3ae67..957d6f2e355 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -19,9 +19,6 @@ PopulateContents() - for (var/obj/item/item in src) - item.item_flags |= IN_STORAGE - /obj/item/storage/create_storage( max_slots, max_specific_storage, diff --git a/code/game/objects/items/storage/toolboxes/_toolbox.dm b/code/game/objects/items/storage/toolboxes/_toolbox.dm index 1a078bebec8..538dc79f373 100644 --- a/code/game/objects/items/storage/toolboxes/_toolbox.dm +++ b/code/game/objects/items/storage/toolboxes/_toolbox.dm @@ -46,6 +46,7 @@ latches = "quad_latch" // like winning the lottery, but worse update_appearance() AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound) + AddElement(/datum/element/cuffable_item) /obj/item/storage/toolbox/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if (user.combat_mode || !user.has_hand_for_held_index(user.get_inactive_hand_index())) @@ -99,7 +100,7 @@ picked_tool.melee_attack_chain(user, interacting_with, modifiers) current_interactions -= 1 - if (QDELETED(picked_tool) || picked_tool.loc != user || !user.CanReach(picked_tool)) + if (QDELETED(picked_tool) || picked_tool.loc != user || !picked_tool.IsReachableBy(user)) current_interactions = 0 return diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index a704d49a7f3..3891f34bd09 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -28,6 +28,7 @@ create_reagents(volume, OPENCONTAINER) noz = make_noz() RegisterSignal(noz, COMSIG_MOVABLE_MOVED, PROC_REF(noz_move)) + AddElement(/datum/element/drag_pickup) /obj/item/watertank/Destroy() QDEL_NULL(noz) @@ -90,12 +91,6 @@ else return ..() -/obj/item/watertank/mouse_drop_dragged(atom/over_object) - var/mob/M = loc - if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item == noz) remove_noz() diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index ab9acd207a9..c13d621036d 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -204,7 +204,7 @@ if(victim.incorporeal_move || HAS_TRAIT(victim, TRAIT_GODMODE)) //try to keep this in sync with supermatter's consume fail conditions return ..() var/mob/thrower = throwingdatum?.get_thrower() - if(thrower) + if(istype(thrower)) log_combat(thrower, hit_atom, "consumed", src) message_admins("[src] has consumed [key_name_admin(victim)] [ADMIN_JMP(src)], thrown by [key_name_admin(thrower)].") investigate_log("has consumed [key_name(victim)], thrown by [key_name(thrower)]", INVESTIGATE_ENGINE) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 731fd3e6f0a..6b154b20f72 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -132,9 +132,32 @@ var/snap_time_weak_handcuffs = 0 SECONDS /// Used on Initialize, how much time to cut real handcuffs. Null means it can't. var/snap_time_strong_handcuffs = 0 SECONDS + /// The text used for our jaws tool description while active + var/active_text = "cutting" + /// The text used for our jaws tool description while inactive + var/inactive_text = "prying" + /// The default tool behavior. This should match tool_behavior + var/first_tool_behavior = TOOL_CROWBAR + /// The active tool behavior. This should not match tool_behavior on init. + var/second_tool_behavior = TOOL_WIRECUTTER + /// Determines if we want to limit our jaws of life from opening certain doors or not. + var/limit_jaws_access = FALSE + /// The access on doors that block our jaws of life from opening if limit_jaws_access is TRUE. Does nothing if FALSE. + var/list/blacklisted_access = list() + /// Whether or not our jaws throw out an alert when we pry open a door. Default alert sends out a message to security comms. + var/radio_alert = FALSE + /// If radio_alert is TRUE, access in this list that is found on our pried open door is ignored. + var/list/ignored_access = list( + ACCESS_MAINT_TUNNELS, + ACCESS_AUX_BASE, + ACCESS_EXTERNAL_AIRLOCKS, + ) + COOLDOWN_DECLARE(alert_cooldown) + /// How long between announcements from our jaws of life. Keeps the jaws from getting too radio spammy. + var/alert_cooldown_time = 1 MINUTES /obj/item/crowbar/power/get_all_tool_behaviours() - return list(TOOL_CROWBAR, TOOL_WIRECUTTER) + return list(first_tool_behavior, second_tool_behavior) /obj/item/crowbar/power/Initialize(mapload) . = ..() @@ -148,6 +171,11 @@ inhand_icon_change = FALSE, \ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + RegisterSignal(src, COMSIG_TOOL_FORCE_OPEN_AIRLOCK, PROC_REF(on_force_open)) + +/obj/item/crowbar/power/examine() + . = ..() + . += " It's fitted with a [tool_behaviour == first_tool_behavior ? inactive_text : active_text] head." /* * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. @@ -157,27 +185,68 @@ /obj/item/crowbar/power/proc/on_transform(obj/item/source, mob/user, active) SIGNAL_HANDLER - tool_behaviour = (active ? TOOL_WIRECUTTER : TOOL_CROWBAR) + tool_behaviour = (active ? second_tool_behavior : first_tool_behavior) if(user) - balloon_alert(user, "attached [active ? "cutting" : "prying"]") + balloon_alert(user, "attached [tool_behaviour == first_tool_behavior ? inactive_text : active_text]") playsound(src, 'sound/items/tools/change_jaws.ogg', 50, TRUE) - if(tool_behaviour == TOOL_CROWBAR) + if(tool_behaviour != TOOL_WIRECUTTER) RemoveElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) else AddElement(/datum/element/cuffsnapping, snap_time_weak_handcuffs, snap_time_strong_handcuffs) return COMPONENT_NO_DEFAULT_MESSAGE -/obj/item/crowbar/power/syndicate - name = "jaws of death" - desc = "An improved, faster, and smaller copy of Nanotrasen's standard jaws of life. Can be used to force open airlocks in its crowbar configuration." - icon_state = "jaws_syndie" - w_class = WEIGHT_CLASS_SMALL - toolspeed = 0.5 - force_opens = TRUE +/* + * Signal proc for [COMSIG_TOOL_FORCE_OPEN_AIRLOCK]. + * + * Determines if our jaws of life is restricted from opening some doors, and whether or not we need to alert over the radio whenever they are used to + * pry open a door. Useful if you want to restrict jaws of life in some fashion. + */ -/obj/item/crowbar/power/examine() - . = ..() - . += " It's fitted with a [tool_behaviour == TOOL_CROWBAR ? "prying" : "cutting"] head." +/obj/item/crowbar/power/proc/on_force_open(obj/item/source, mob/user, obj/machinery/door/airlock/target) + SIGNAL_HANDLER + + var/list/collective_access = list() + collective_access += target.req_access + collective_access += target.req_one_access + + if(limit_jaws_access) + for(var/possible_blacklisted_access in collective_access) + if(possible_blacklisted_access in blacklisted_access) + playsound(src.loc, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) + user.balloon_alert(user, "cannot pry open!") + return COMPONENT_TOOL_DO_NOT_ALLOW_FORCE_OPEN + + if(radio_alert && COOLDOWN_FINISHED(src, alert_cooldown)) + + if(!collective_access) //Return if the door has literally no access at all + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + + for(var/possible_public_access in collective_access) //Return if the door has otherwise unimportant access + if((possible_public_access in ignored_access)) + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + + sound_the_alarms(user, target) + COOLDOWN_START(src, alert_cooldown, alert_cooldown_time) + return COMPONENT_TOOL_ALLOW_FORCE_OPEN + +///Our alert for our jaws of life. +/obj/item/crowbar/power/proc/sound_the_alarms(mob/user, obj/machinery/door/airlock/target) + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_SECURITY), RADIO_CHANNEL_SECURITY) + +/datum/aas_config_entry/jaws_entry_alert + // This tool screams into the radio whenever the user successfully pries open an airlock. + name = "Door Forced Entry Alert" + announcement_lines_map = list( + RADIO_CHANNEL_SECURITY = "SECURITY ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + ) + vars_and_tooltips_map = list( + "PERSON" = "will be replaced with the name of the user", + "LOCATION" = "with the area of the door", + "TOOL" = "replaced with the tool used", + ) /obj/item/crowbar/power/suicide_act(mob/living/user) if(tool_behaviour == TOOL_CROWBAR) @@ -194,6 +263,69 @@ playsound(loc, SFX_DESECRATION, 50, TRUE, -1) return BRUTELOSS +/obj/item/crowbar/power/syndicate + name = "jaws of death" + desc = "An improved, faster, and smaller copy of Nanotrasen's standard jaws of life. Can be used to force open airlocks in its crowbar configuration." + icon_state = "jaws_syndie" + w_class = WEIGHT_CLASS_SMALL + toolspeed = 0.5 + +/obj/item/crowbar/power/paramedic + name = "jaws of recovery" + desc = "A specialized version of the jaws of life, primarily to be used by paramedics to recover the injured and the recently deceased. Rather than a cutting arm, this tool has a bonesetting apparatus. \ + Cannot access certain high security areas due to safety concerns." + icon_state = "jaws_paramedic" + inhand_icon_state = "jawsparamedic" + worn_icon_state = "jawsparamedic" + w_class = WEIGHT_CLASS_BULKY + toolspeed = 1 + slot_flags = null + active_text = "bonesetting" + second_tool_behavior = TOOL_BONESET + limit_jaws_access = TRUE + blacklisted_access = list( + ACCESS_COMMAND, + ACCESS_AI_UPLOAD, + ACCESS_CAPTAIN, + ACCESS_HOP, + ACCESS_SECURITY, + ACCESS_BRIG, + ACCESS_ARMORY, + ACCESS_HOS, + ACCESS_DETECTIVE, + ACCESS_CE, + ACCESS_CMO, + ACCESS_QM, + ACCESS_VAULT, + ACCESS_RD, + ACCESS_SYNDICATE, + ) + radio_alert = TRUE + +/obj/item/crowbar/power/paramedic/sound_the_alarms(mob/user, obj/machinery/door/airlock/target) + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert_paramedic, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_SECURITY), RADIO_CHANNEL_SECURITY) + + aas_config_announce(/datum/aas_config_entry/jaws_entry_alert_paramedic, list( + "PERSON" = user.name, + "LOCATION" = get_area_name(target), + "TOOL" = name), src, list(RADIO_CHANNEL_MEDICAL), RADIO_CHANNEL_MEDICAL) + +/datum/aas_config_entry/jaws_entry_alert_paramedic + // This tool screams into the radio whenever the user successfully pries open an airlock. + name = "Door Forced Entry Medical Alert" + announcement_lines_map = list( + RADIO_CHANNEL_SECURITY = "SECURITY ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + RADIO_CHANNEL_MEDICAL = "MEDICAL ALERT: %PERSON has forced open a door at %LOCATION using %TOOL. Confirm that this was done during an emergency by authorized staff.", + ) + vars_and_tooltips_map = list( + "PERSON" = "will be replaced with the name of the user", + "LOCATION" = "with the area of the door", + "TOOL" = "replaced with the tool used", + ) + /obj/item/crowbar/cyborg name = "hydraulic crowbar" desc = "A hydraulic prying tool, simple but powerful." diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3f48cad55fc..63ee92212ec 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -173,6 +173,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_range = 5 armour_penetration = 35 +/obj/item/claymore/cutlass/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed sword guard + /obj/item/claymore/cutlass/old name = "old cutlass" desc = parent_type::desc + " This one seems a tad old." @@ -672,6 +676,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("bludgeons", "whacks", "thrashes") attack_verb_simple = list("bludgeon", "whack", "thrash") +/obj/item/cane/crutch/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/cane/crutch/examine(mob/user, thats) . = ..() // tacked on after the cane string @@ -724,6 +732,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/cane/white/Initialize(mapload) . = ..() + AddElement(/datum/element/cuffable_item) AddComponent( \ /datum/component/transforming, \ force_on = 7, \ @@ -836,87 +845,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb_continuous = list("clubs", "bludgeons") attack_verb_simple = list("club", "bludgeon") -/obj/item/melee/skateboard - name = "skateboard" - desc = "A skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." - icon = 'icons/mob/rideables/vehicles.dmi' - icon_state = "skateboard_held" - inhand_icon_state = "skateboard" - force = 12 - throwforce = 4 - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("smacks", "whacks", "slams", "smashes") - attack_verb_simple = list("smack", "whack", "slam", "smash") - ///The vehicle counterpart for the board - var/board_item_type = /obj/vehicle/ridden/scooter/skateboard - -/obj/item/melee/skateboard/attack_self(mob/user) - var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault - S.buckle_mob(user) - qdel(src) - -/obj/item/melee/skateboard/improvised - name = "improvised skateboard" - desc = "A jury-rigged skateboard. It can be placed on its wheels and ridden, or used as a radical weapon." - board_item_type = /obj/vehicle/ridden/scooter/skateboard/improvised - -/obj/item/melee/skateboard/pro - name = "skateboard" - desc = "An EightO brand professional skateboard. It looks sturdy and well made." - icon_state = "skateboard2_held" - inhand_icon_state = "skateboard2" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/pro - custom_premium_price = PAYCHECK_COMMAND * 5 - -/obj/item/melee/skateboard/hoverboard - name = "hoverboard" - desc = "A blast from the past, so retro!" - icon_state = "hoverboard_red_held" - inhand_icon_state = "hoverboard_red" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard - custom_premium_price = PAYCHECK_COMMAND * 5.4 //If I can't make it a meme I'll make it RAD - -/obj/item/melee/skateboard/hoverboard/admin - name = "Board Of Directors" - desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." - icon_state = "hoverboard_nt_held" - inhand_icon_state = "hoverboard_nt" - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin - -/obj/item/melee/skateboard/holyboard - name = "holy skateboard" - desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." - icon_state = "hoverboard_holy_held" - inhand_icon_state = "hoverboard_holy" - force = 18 - throwforce = 6 - w_class = WEIGHT_CLASS_NORMAL - attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") - attack_verb_simple = list("bash", "crash", "grind", "skate") - board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded - -/obj/item/melee/skateboard/holyboard/Initialize(mapload) - . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) - AddComponent(/datum/component/effect_remover, \ - success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ - success_forcesay = "BEGONE FOUL MAGICKS!!", \ - tip_text = "Clear rune", \ - on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ - effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) - -/obj/item/melee/skateboard/holyboard/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) - SIGNAL_HANDLER - if(!istype(target, /obj/effect/rune)) - return - - var/obj/effect/rune/target_rune = target - if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE - /obj/item/melee/baseball_bat name = "baseball bat" desc = "There ain't a skull in the league that can withstand a swatter." diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 1da18a19b6a..456ff3dc88e 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -27,7 +27,7 @@ return TRUE -/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) +/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE, blocked = null) . = ..() if(. != BULLET_ACT_HIT) return . diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 6dfd07aafa7..bbe77c2af16 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -434,6 +434,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) // What structure type does this chair become when placed? var/obj/structure/chair/origin_type = /obj/structure/chair +/obj/item/chair/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/chair/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins hitting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) playsound(src,hitsound,50,TRUE) @@ -448,25 +452,28 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) plant(user) /obj/item/chair/proc/plant(mob/user) - var/turf/T = get_turf(loc) - if(isgroundlessturf(T)) + var/turf/turf = user.loc + if(!istype(turf) || isgroundlessturf(turf)) to_chat(user, span_warning("You need ground to plant this on!")) return + if(!user.dropItemToGround(src)) + to_chat(user, span_warning("[src] is stuck to your hand!")) + return if(flags_1 & HOLOGRAM_1) to_chat(user, span_notice("You try to place down \the [src], but it fades away!")) qdel(src) return - for(var/obj/A in T) - if(istype(A, /obj/structure/chair)) + for(var/obj/object in turf) + if(istype(object, /obj/structure/chair)) to_chat(user, span_warning("There is already a chair here!")) return - if(A.density && !(A.flags_1 & ON_BORDER_1)) + if(object.density && !(object.flags_1 & ON_BORDER_1)) to_chat(user, span_warning("There is already something here!")) return user.visible_message(span_notice("[user] rights \the [src.name]."), span_notice("You right \the [name].")) - var/obj/structure/chair/chair = new origin_type(get_turf(loc)) + var/obj/structure/chair/chair = new origin_type(turf) chair.set_custom_materials(custom_materials) TransferComponents(chair) chair.setDir(user.dir) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 01536a2518a..6e5a1528d2a 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -92,7 +92,7 @@ LINEN BINS return ITEM_INTERACT_SUCCESS /obj/item/bedsheet/attack_self(mob/living/user) - if(!user.CanReach(src)) //No telekinetic grabbing. + if(!IsReachableBy(user)) //No telekinetic grabbing. return if(user.body_position != LYING_DOWN) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 255774e3d07..d2852bcce57 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -91,7 +91,6 @@ new /obj/item/door_remote/chief_medical_officer(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) - new /obj/item/wallframe/defib_mount(src) new /obj/item/circuitboard/machine/techfab/department/medical(src) new /obj/item/storage/photo_album/cmo(src) new /obj/item/storage/lockbox/medal/med(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 5d231cadfc1..76380fdff1c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -5,11 +5,6 @@ /obj/structure/closet/secure_closet/captains/PopulateContents() ..() - - new /obj/item/storage/backpack/captain(src) - new /obj/item/storage/backpack/satchel/cap(src) - new /obj/item/storage/backpack/duffelbag/captain(src) - new /obj/item/storage/backpack/messenger/cap(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/storage/bag/garment/captain(src) diff --git a/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm new file mode 100644 index 00000000000..9301a93a3f5 --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates.dm @@ -0,0 +1,227 @@ +//Originally coded by ISaidNo, later modified by Kelenius. Ported from Baystation12. + +/obj/structure/closet/crate/secure/loot + name = "abandoned crate" + desc = "What could be inside?" + icon_state = "securecrate" + base_icon_state = "securecrate" + integrity_failure = 0 //no breaking open the crate + var/code = null + var/last_attempt = null + var/attempts = 10 + var/code_length = 4 + var/qdel_on_open = FALSE + var/spawned_loot = FALSE + tamperproof = 90 + + divable = FALSE // Stop people from "diving into" the crate accidentally, and then detonating it. + + /// Possible loot from the crate, selected according to a weighted list: [typepath] = probability % + var/list/possible_loot = list( + list( // Toys & Entertainment + /obj/item/melee/skateboard/pro = 5, + /obj/effect/spawner/abandoned_crate/snappop = 5, + /obj/effect/spawner/abandoned_crate/posters = 5, + /obj/item/toy/balloon/corgi = 2, + /obj/effect/spawner/abandoned_crate/mecha = 2, + /obj/item/toy/balloon/syndicate = 2, + /obj/item/toy/plush/snakeplushie = 2, + /obj/item/bikehorn/airhorn = 2, + /obj/item/toy/plush/beeplushie = 2, + /obj/item/toy/plush/lizard_plushie = 2, + /obj/item/toy/plush/nukeplushie = 1, + /obj/effect/spawner/abandoned_crate/bwoink = 1, + /obj/effect/spawner/abandoned_crate/pay_day = 1, + /obj/item/melee/skateboard/hoverboard = 1, + /obj/item/implanter/sad_trombone = 1, + ) = 34, // sum of weights inside list + + list( // Weapons & Combat + /obj/item/melee/baton = 2, + /obj/item/clothing/gloves/boxing/evil = 1, + /obj/item/melee/energy/sword/bananium = 1, + /obj/item/katana = 1, + ) = 5, + + list( // Clothing + /obj/item/storage/box/syndie_kit/chameleon/broken = 5, + /obj/item/clothing/shoes/kindle_kicks = 2, + /obj/effect/spawner/abandoned_crate/kitty = 2, + /obj/effect/spawner/abandoned_crate/space_suit = 2, + /obj/effect/spawner/abandoned_crate/fursuit = 2, + ) = 13, + + list( // Tools & Equipment + /obj/item/modular_computer/pda/clear = 5, + /obj/item/defibrillator/compact = 2, + ) = 7, + + list( // Materials + /obj/effect/spawner/abandoned_crate/diamonds = 5, + /obj/effect/spawner/abandoned_crate/bluespace_crystal = 2, + /obj/effect/spawner/abandoned_crate/bananium = 2, + ) = 9, + + list( // Seed & Plants + /obj/item/seeds/firelemon = 5, + /obj/effect/spawner/abandoned_crate/weed = 1, + ) = 6, + + list( // Consumables + /obj/effect/spawner/abandoned_crate/booze = 5, + /obj/effect/spawner/abandoned_crate/boda = 5, + /obj/item/reagent_containers/cup/glass/bottle/lizardwine = 1, + ) = 11, + + list( // Mobs + /mob/living/basic/bot/honkbot = 5, + /mob/living/basic/pet/gondola = 2, + /obj/effect/spawner/abandoned_crate/bloodroaches = 1, + ) = 8, + + list( // Medical & Science + /obj/item/dnainjector/xraymut = 1, + /obj/item/dnainjector/wackymut = 1, + ) = 2, + + list( // Dangerous + /obj/effect/spawner/abandoned_crate/gibtonite = 2, + /obj/effect/spawner/abandoned_crate/mimic = 1, + /obj/effect/spawner/abandoned_crate/bees = 1, + ) = 4, + + list( // Misc + /obj/effect/spawner/random/structure/closet_empty/crate = 1, //crate with crate + ) = 1, + ) + +/obj/structure/closet/crate/secure/loot/Initialize(mapload) + . = ..() + code = generate_code(code_length) + +/// Generates a random code of specified length with no repeating digits +/obj/structure/closet/crate/secure/loot/proc/generate_code(length) + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") + var/list/code_digits = list() + + for(var/i in 1 to length) + if(!digits.len) + break + var/digit = pick(digits) + code_digits += digit + digits -= digit //there are never matching digits in the answer + + return code_digits.Join("") + +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, list/modifiers) + if(!locked) + return ..() + if(!user.can_perform_action(src)) + return + + var/input = tgui_input_text(user, title = "Deca-code lock", message = "Enter [code_length] digits. All digits must be unique.", max_length = code_length) + + if(input == code) + if(!spawned_loot) + spawn_loot() + tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die + togglelock(user) + return + + if(!validate_input(input)) + to_chat(user, span_notice("You leave the crate alone.")) + return + + to_chat(user, span_warning("A red light flashes.")) + last_attempt = input + attempts-- + + if(attempts <= 0) + boom(user) + +/// Checks if user input is a valid code attempt +/obj/structure/closet/crate/secure/loot/proc/validate_input(input) + if(!input || code_length != length(input)) + return FALSE + + var/list/used_digits = list() + for(var/i = 1 to length(input)) + var/char = input[i] + if(!(char >= "0" && char <= "9")) //if a non-digit is found, reject the input + return FALSE + if(char in used_digits) //if a digit is repeated, reject the input + return FALSE + used_digits += char + + return TRUE + +/obj/structure/closet/crate/secure/loot/click_alt(mob/living/user) + attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. + return CLICK_ACTION_SUCCESS + +/obj/structure/closet/crate/secure/loot/multitool_act(mob/living/user, obj/item/tool) + if(!locked) + return + + to_chat(user, span_boldnotice("DECA-CODE LOCK REPORT:")) + to_chat(user, span_warning("* Anti-Tamper Bomb will activate [attempts == 1 ? span_boldwarning("on next failed access attempt") : "after [span_boldwarning("[attempts]")] failed access attempts"].")) + + if(last_attempt) + var/list/bulls_cows = bulls_and_cows(last_attempt) + to_chat(user, span_notice("Last code attempt, [last_attempt], had [bulls_cows[1]] correct digits at correct positions and [bulls_cows[2]] correct digits at incorrect positions.")) + + return ITEM_INTERACT_SUCCESS + +/// Implements bulls and cows algorithm to compare guess against actual code +/obj/structure/closet/crate/secure/loot/proc/bulls_and_cows(guess) + var/bulls = 0 + var/cows = 0 + + for(var/i = 1 to code_length) + var/guess_char = guess[i] + var/code_char = code[i] + + if(guess_char == code_char) + bulls++ + else if(findtext(code, guess_char)) + cows++ + + return list(bulls, cows) + +/obj/structure/closet/crate/secure/loot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + + if(locked) + boom(user) // no feedback since it just explodes, thats its own feedback + return TRUE + return + +/obj/structure/closet/crate/secure/loot/togglelock(mob/user, silent = FALSE) + if(!locked) + . = ..() //Run the normal code. + if(locked) //Double check if the crate actually locked itself when the normal code ran. + //reset the anti-tampering, number of attempts and last attempt when the lock is re-enabled. + tamperproof = initial(tamperproof) + attempts = initial(attempts) + last_attempt = null + return + if(tamperproof) + return + return ..() + +/obj/structure/closet/crate/secure/loot/atom_deconstruct(disassembled = TRUE) + if(locked) + boom() + return + return ..() + +/obj/structure/closet/crate/secure/loot/after_open(mob/living/user, force) + . = ..() + if(qdel_on_open) + qdel(src) + +/obj/structure/closet/crate/secure/loot/proc/spawn_loot() + var/loot = pick_weight_recursive(possible_loot) + new loot(src) + spawned_loot = TRUE diff --git a/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm new file mode 100644 index 00000000000..490b280c66c --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/abandoned_crates/abandoned_crates_loot.dm @@ -0,0 +1,163 @@ +/** + * Abandoned Crate Loot Spawner + * + * Base spawner for generating loot contents in abandoned crates + */ +/obj/effect/spawner/abandoned_crate + name = "abandoned crate loot spawner" + desc = "i feel lucky" + /// Associative list with actual loot: item_type = quantity + var/list/loot + +/obj/effect/spawner/abandoned_crate/Initialize(mapload) + . = ..() + + if(LAZYLEN(loot)) + for(var/atom in loot) + for(var/i in 1 to loot[atom]) + new atom(loc) + +/obj/effect/spawner/abandoned_crate/booze + loot = list( + /obj/item/reagent_containers/cup/glass/bottle/rum = 1, + /obj/item/reagent_containers/cup/glass/bottle/whiskey = 2, + /obj/item/lighter = 1, + /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium = 1, + /obj/item/cigarette/rollie = 3 + ) + +/obj/effect/spawner/abandoned_crate/diamonds + loot = list( + /obj/item/stack/ore/diamond = 10 + ) + +/obj/effect/spawner/abandoned_crate/posters + loot = list( + /obj/item/poster/random_contraband = 5 + ) + +/obj/effect/spawner/abandoned_crate/boda + loot = list( + /obj/item/vending_refill/sovietsoda = 1, + /obj/item/circuitboard/machine/vendor = 1 + ) + +/obj/effect/spawner/abandoned_crate/boda/Initialize(mapload) + . = ..() + + for(var/obj/item/circuitboard/machine/vendor/board in loc) + board.set_type(/obj/machinery/vending/sovietsoda) + +/obj/effect/spawner/abandoned_crate/snappop + loot = list( + /obj/item/toy/snappop/phoenix = 5 + ) + +/obj/effect/spawner/abandoned_crate/mecha + loot = list() + +/obj/effect/spawner/abandoned_crate/mecha/Initialize(mapload) + var/mecha = pick(subtypesof(/obj/item/toy/mecha)) + loot[mecha] = 1 + + return ..() + +/obj/effect/spawner/abandoned_crate/space_suit + loot = list( + /obj/item/borg/upgrade/modkit/aoe/mobs = 1, + /obj/item/clothing/suit/space = 1, + /obj/item/clothing/head/helmet/space = 1 + ) + +/obj/effect/spawner/abandoned_crate/kitty + loot = list( + /obj/item/clothing/head/costume/kitty = 5, + /obj/item/clothing/neck/petcollar = 5 + ) + +/obj/effect/spawner/abandoned_crate/fursuit + loot = list( + /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian = 1, + /obj/item/clothing/suit/hooded/ian_costume = 1 + ) + +/obj/effect/spawner/abandoned_crate/gibtonite + loot = list( + /obj/item/gibtonite = 1, + ) + +/obj/effect/spawner/abandoned_crate/gibtonite/Initialize(mapload) + . = ..() + + for(var/obj/item/gibtonite/free_bomb in loc) + free_bomb.quality = rand(GIBTONITE_QUALITY_LOW, GIBTONITE_QUALITY_HIGH) + free_bomb.GibtoniteReaction(null, "A secure loot closet has spawned a live") + +/obj/effect/spawner/abandoned_crate/bluespace_crystal + loot = list( + /obj/item/stack/ore/bluespace_crystal = 5 + ) + +/obj/effect/spawner/abandoned_crate/bananium + loot = list( + /obj/item/stack/sheet/mineral/bananium = 10 + ) + +/obj/effect/spawner/abandoned_crate/weed + loot = list() + +/obj/effect/spawner/abandoned_crate/weed/Initialize(mapload) + var/seed_type = pick(typesof(/obj/item/seeds/cannabis)) + var/cannabis_type= pick(typesof(/obj/item/food/grown/cannabis)) + var/weed_amount = rand(2, 4) + + for(var/i in 1 to weed_amount) + loot[seed_type] = (loot[seed_type] || 0) + 1 + loot[cannabis_type] = (loot[cannabis_type] || 0) + 1 + + return ..() + +/obj/effect/spawner/abandoned_crate/bloodroaches + loot = list( + /mob/living/basic/cockroach/bloodroach = 30 + ) + +/obj/effect/spawner/abandoned_crate/mimic + loot = list( + /mob/living/basic/mimic/crate = 1 + ) + +/obj/effect/spawner/abandoned_crate/mimic/Initialize(mapload) + . = ..() + + var/obj/structure/closet/crate/secure/loot/parent_crate = loc + if(istype(parent_crate)) + parent_crate.qdel_on_open = TRUE + +/obj/effect/spawner/abandoned_crate/bwoink + loot = list( + /obj/item/banhammer = 1, + /obj/effect/mine/sound/bwoink = 3 + ) + +/obj/effect/spawner/abandoned_crate/bwoink/Initialize(mapload) + . = ..() + + for(var/obj/effect/mine/sound/bwoink/mine in loc) + mine.set_anchored(FALSE) + mine.move_resist = MOVE_RESIST_DEFAULT + +/obj/effect/spawner/abandoned_crate/pay_day + loot = list( + /obj/item/clothing/mask/balaclava = 4, + /obj/item/gun/ballistic/shotgun/toy = 1, + /obj/item/gun/ballistic/automatic/pistol/toy = 1, + /obj/item/gun/ballistic/automatic/toy = 1, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 1, + /obj/item/ammo_box/foambox = 1 + ) + +/obj/effect/spawner/abandoned_crate/bees + loot = list( + /mob/living/basic/bee/toxin = 3 + ) diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 6114a20158c..bfe843d7f4d 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -10,13 +10,13 @@ /obj/structure/sacrificealtar/click_alt(mob/living/user) if(!has_buckled_mobs()) return CLICK_ACTION_BLOCKING - var/mob/living/L = locate() in buckled_mobs - if(!L) + var/mob/living/buckled_mob = locate() in buckled_mobs + if(!buckled_mob) return CLICK_ACTION_BLOCKING - to_chat(user, span_notice("Invoking the sacred ritual, you sacrifice [L].")) - L.investigate_log("has been sacrificially gibbed on an altar.", INVESTIGATE_DEATHS) - L.gib(DROP_ALL_REMAINS) - message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].") + to_chat(user, span_notice("Invoking the sacred ritual, you sacrifice [buckled_mob].")) + buckled_mob.investigate_log("has been sacrificially gibbed on an altar.", INVESTIGATE_DEATHS) + buckled_mob.gib(DROP_ALL_REMAINS) + message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(buckled_mob)] on the sacrificial altar at [AREACOORD(src)].") return CLICK_ACTION_SUCCESS /obj/structure/healingfountain diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index d140a2cb6db..329f9459c13 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -20,6 +20,8 @@ var/item_overlay = "axe" /// Whether we should populate our own contents on Initialize() var/populate_contents = TRUE + /// The tool behavior necessary to unlock the cabinet + var/unlocking_tool_behavior = TOOL_MULTITOOL MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) @@ -44,7 +46,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) return ..() /obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(iscyborg(user) || attacking_item.tool_behaviour == TOOL_MULTITOOL) + if(iscyborg(user) || attacking_item.tool_behaviour == unlocking_tool_behavior) toggle_lock(user) else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) if(atom_integrity < max_integrity) @@ -243,3 +245,30 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/mechremoval/empty, 32) desc = "Home to a very special crowbar. Apply to wall to use." icon_state = "mechremoval" result_path = /obj/structure/fireaxecabinet/mechremoval/empty + +/obj/structure/fireaxecabinet/jawsofrecovery + name = "jaws of recovery tool cabinet" + desc = "There is a small label that reads \"For Emergency use only\" along with details for safe use of the jaws of recovery. \ + The lock seems to require...a surgical drill bit to unlock? You have no idea who thought this was a good idea." + icon_state = "jaws_of_recovery" + item_path = /obj/item/crowbar/power/paramedic + item_overlay = "jaws" + unlocking_tool_behavior = TOOL_DRILL + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/jawsofrecovery, 32) + +/obj/structure/fireaxecabinet/jawsofrecovery/atom_deconstruct(disassembled = TRUE) + if(held_item && loc) + held_item.forceMove(loc) + new /obj/item/wallframe/fireaxecabinet/jawsofrecovery(loc) + +/obj/structure/fireaxecabinet/jawsofrecovery/empty + populate_contents = FALSE + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet/jawsofrecovery/empty, 32) + +/obj/item/wallframe/fireaxecabinet/jawsofrecovery + name = "jaws of recovery tool cabinet" + desc = "Home to the paramedic's jaws of recovery. Apply to wall to use." + icon_state = "jaws_of_recovery" + result_path = /obj/structure/fireaxecabinet/jawsofrecovery/empty diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index f01c2f3911a..3b3a4d9a9d9 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -174,13 +174,15 @@ GLOBAL_LIST_INIT(mystery_fishing, list( /obj/structure/mystery_box/proc/generate_valid_types() valid_types = get_sane_item_types(selectable_base_type) +/obj/structure/mystery_box/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + /// The box has been activated, play the sound and spawn the prop item /obj/structure/mystery_box/proc/activate(mob/living/user) box_state = MYSTERY_BOX_CHOOSING update_icon_state() presented_item = new(src) presented_item.vis_flags = VIS_INHERIT_PLANE - presented_item.flags_1 |= IS_ONTOP_1 vis_contents += presented_item presented_item.start_animation(src) current_sound_channel = SSsounds.reserve_sound_channel(src) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 580ae3f5fce..59a635ad852 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -1145,7 +1145,7 @@ tool.play_tool_sound(src, 50) balloon_alert(user, "mask detached") UnregisterSignal(breath_mask, list(COMSIG_MOVABLE_MOVED, COMSIG_ITEM_DROPPED)) - if (user.CanReach(breath_mask)) + if (breath_mask.IsReachableBy(user)) user.put_in_hands(breath_mask) breath_mask = null update_appearance() @@ -1160,7 +1160,7 @@ air_tank.forceMove(drop_location()) tool.play_tool_sound(src, 50) balloon_alert(user, "tank detached") - if (user.CanReach(air_tank)) + if (air_tank.IsReachableBy(user)) user.put_in_hands(air_tank) if (patient?.external && patient.external == air_tank) patient.close_externals() @@ -1192,7 +1192,7 @@ . += span_notice("There's a port for a breathing mask tube on its side.") /obj/structure/table/optable/proc/detach_mask(mob/living/user) - if (!istype(user) || !user.CanReach(src) || !user.can_interact_with(src)) + if (!istype(user) || !IsReachableBy(user) || !user.can_interact_with(src)) return FALSE if (!breath_mask) @@ -1208,7 +1208,7 @@ return TRUE /obj/structure/table/optable/mouse_drop_dragged(atom/over, mob/living/user, src_location, over_location, params) - if (over != patient || !istype(user) || !user.CanReach(src) || !user.can_interact_with(src)) + if (over != patient || !istype(user) || !IsReachableBy(user) || !user.can_interact_with(src)) return if (!air_tank) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index fa770dd75ee..c45e58d5845 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -78,7 +78,6 @@ update_appearance(UPDATE_ICON) /obj/structure/toiletbong/wrench_act(mob/living/user, obj/item/tool) - ..() default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index 7738a0f6473..67d24d4007a 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -165,7 +165,7 @@ grabbed_mob.adjustBruteLoss(5) return - if(cistern_open && !cover_open && user.CanReach(src)) + if(cistern_open && !cover_open && IsReachableBy(user)) if(!LAZYLEN(cistern_items)) to_chat(user, span_notice("The cistern is empty.")) return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6333fbd4ce4..4913d231f78 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -618,14 +618,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/spawner, 0) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/unanchored/spawner, 0) -// You can't rust glass! So only reinforced glass can be impacted. -/obj/structure/window/reinforced/rust_heretic_act() - add_atom_colour(COLOR_RUSTED_GLASS, FIXED_COLOUR_PRIORITY) - AddElement(/datum/element/rust) - set_armor(/datum/armor/none) - take_damage(get_integrity() * 0.5) - modify_max_integrity(initial(max_integrity) * 0.2) - /obj/structure/window/plasma name = "plasma window" desc = "A window made out of a plasma-silicate alloy. It looks insanely tough to break and burn through." diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 54031149f75..a13a2a7dbe5 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/proc/copyTurf(turf/copy_to_turf, copy_air = FALSE, flags = null) if(copy_to_turf.type != type) - copy_to_turf.ChangeTurf(type, flags) + copy_to_turf.ChangeTurf(type, null, flags) if(copy_to_turf.icon_state != icon_state) copy_to_turf.icon_state = icon_state if(copy_to_turf.icon != icon) diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index 312b3366491..4e131d0bf98 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -9,12 +9,13 @@ damaged_dmi = 'icons/turf/floors.dmi' icon_state = "asteroid" base_icon_state = "asteroid" + turf_flags = IS_SOLID footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - rust_resistance = RUST_RESISTANCE_ORGANIC + rust_resistance = RUST_RESISTANCE_BASIC /// Base turf type to be created by the tunnel var/turf_type = /turf/open/misc/asteroid /// Whether this turf has different icon states diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 13d29d4925f..4d447ab63d8 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -7,6 +7,7 @@ base_icon_state = "bcircuit" light_color = LIGHT_COLOR_BABY_BLUE floor_tile = /obj/item/stack/tile/circuit + rust_resistance = RUST_RESISTANCE_REINFORCED /// If we want to ignore our area's power status and just be always off /// Mostly for mappers doing asthetic things, or cases where the floor should be broken var/always_off = FALSE @@ -236,6 +237,7 @@ desc = "This one takes you back." icon_state = "eighties" floor_tile = /obj/item/stack/tile/eighties + rust_resistance = RUST_RESISTANCE_BASIC /turf/open/floor/eighties/broken_states() return list("eighties_damaged") diff --git a/code/game/turfs/open/sand.dm b/code/game/turfs/open/sand.dm index af583de7779..faccf7db104 100644 --- a/code/game/turfs/open/sand.dm +++ b/code/game/turfs/open/sand.dm @@ -8,7 +8,7 @@ barefootstep = FOOTSTEP_SAND clawfootstep = FOOTSTEP_SAND heavyfootstep = FOOTSTEP_GENERIC_HEAVY - rust_resistance = RUST_RESISTANCE_ORGANIC + rust_resistance = RUST_RESISTANCE_REINFORCED /turf/open/misc/beach/Initialize(mapload) . = ..() diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index e20137240db..d81f0b01ca4 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -193,6 +193,9 @@ GLOBAL_LIST_EMPTY(starlight) if (!. || isspaceturf(.)) return + if (flags & CHANGETURF_NO_AREA_CHANGE) + return + var/area/new_turf_area = get_area(.) if (istype(new_turf_area, /area/space) && !istype(new_turf_area, /area/space/nearstation)) set_turf_to_area(., GLOB.areas_by_type[/area/space/nearstation]) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3924503a4af..122ad3872c5 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/force_no_gravity = FALSE ///This turf's resistance to getting rusted - var/rust_resistance = RUST_RESISTANCE_ORGANIC + var/rust_resistance = RUST_RESISTANCE_BASIC /// How pathing algorithm will check if this turf is passable by itself (not including content checks). By default it's just density check. /// WARNING: Currently to use a density shortcircuiting this does not support dense turfs with special allow through function diff --git a/code/modules/admin/outfit_editor.dm b/code/modules/admin/outfit_editor.dm index 765fbb9999d..7a8b4f60cca 100644 --- a/code/modules/admin/outfit_editor.dm +++ b/code/modules/admin/outfit_editor.dm @@ -55,7 +55,7 @@ "name" = initial(item.name), "desc" = initial(item.desc), // at this point initializing the item is probably faster tbh - "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state))), + "sprite" = icon2base64(icon(initial(item.icon), initial(item.icon_state), frame = 1)), ) return data @@ -78,7 +78,9 @@ var/icon/dummysprite = get_flat_human_icon(null, dummy_key = dummy_key, showDirs = list(SOUTH), - outfit_override = drip) + outfit_override = drip, + no_anim = TRUE, + ) data["dummy64"] = icon2base64(dummysprite) return data diff --git a/code/modules/admin/smites/retcon.dm b/code/modules/admin/smites/retcon.dm index 461b7b330bb..33beb3542e8 100644 --- a/code/modules/admin/smites/retcon.dm +++ b/code/modules/admin/smites/retcon.dm @@ -27,7 +27,7 @@ /datum/smite/retcon/proc/delete_bank_account(mob/living/target) var/name = target.real_name - var/account_list = flatten_list(SSeconomy.bank_accounts_by_id) + var/account_list = assoc_to_values(SSeconomy.bank_accounts_by_id) for(var/datum/bank_account/account in account_list) if(account.account_holder == name) qdel(account) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 06821d9b5e0..af735b41568 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1292,9 +1292,6 @@ var/ban_id = href_list["unbanlog"] ban_log(ban_id) - else if(href_list["beakerpanel"]) - beaker_panel_act(href_list) - else if(href_list["reloadpolls"]) GLOB.polls.Cut() GLOB.poll_options.Cut() diff --git a/code/modules/admin/verbs/beakerpanel.dm b/code/modules/admin/verbs/beakerpanel.dm index 7088fba92f1..94dcb7fb171 100644 --- a/code/modules/admin/verbs/beakerpanel.dm +++ b/code/modules/admin/verbs/beakerpanel.dm @@ -1,320 +1,93 @@ -/proc/reagentsforbeakers() - . = list() - for(var/t in subtypesof(/datum/reagent)) - var/datum/reagent/R = t - . += list(list("id" = t, "text" = initial(R.name))) +/datum/beaker_panel - . = json_encode(.) +/datum/beaker_panel/ui_state(mob/user) + return ADMIN_STATE(R_ADMIN) -/proc/beakersforbeakers() - . = list() - for(var/t in subtypesof(/obj/item/reagent_containers)) - var/obj/item/reagent_containers/C = t - . += list(list("id" = t, "text" = initial(C.name), "volume" = initial(C.volume))) +/datum/beaker_panel/ui_close() + qdel(src) - . = json_encode(.) +/datum/beaker_panel/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BeakerPanel") + ui.open() -/datum/admins/proc/beaker_panel_act(list/href_list) - switch (href_list["beakerpanel"]) - if ("spawncontainer") - var/containerdata = json_decode(href_list["container"]) - var/obj/item/reagent_containers/container = beaker_panel_create_container(containerdata, get_turf(usr)) - usr.log_message("spawned a [container] containing [pretty_string_from_reagent_list(container.reagents.reagent_list)]", LOG_GAME) - if ("spawngrenade") - var/obj/item/grenade/chem_grenade/grenade = new(get_turf(usr)) - var/containersdata = json_decode(href_list["containers"]) - var/reagent_string - for (var/i in 1 to 2) - grenade.beakers += beaker_panel_create_container(containersdata[i], grenade) - reagent_string += " ([grenade.beakers[i].name] [i] : " + pretty_string_from_reagent_list(grenade.beakers[i].reagents.reagent_list) + ");" - grenade.stage_change(GRENADE_READY) - var/grenadedata = json_decode(href_list["grenadedata"]) - switch (href_list["grenadetype"]) - if ("normal") // Regular cable coil-timed grenade - var/det_time = text2num(grenadedata["grenade-timer"]) - if (det_time) - grenade.det_time = det_time - usr.log_message("spawned a [grenade] containing: [reagent_string]", LOG_GAME) +/datum/beaker_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return -/datum/admins/proc/beaker_panel_prep_assembly(obj/item/assembly/towrap, grenade) - var/obj/item/assembly/igniter/igniter = new - igniter.secured = FALSE - var/obj/item/assembly_holder/assholder = new(grenade) - towrap.forceMove(assholder) - igniter.forceMove(assholder) - assholder.assemble(igniter, towrap, usr) - assholder.master = grenade - return assholder + var/mob/user = ui.user + switch(action) + if("spawn") + var/obj/created = spawn_container_from_data(user, params["spawn_info"]) + user.log_message("spawned a [created] containing [pretty_string_from_reagent_list(created.reagents.reagent_list)]", LOG_ADMIN) + return TRUE + if("spawngrenade") + var/obj/item/grenade/chem_grenade/grenade = spawn_grenade_from_data(user, params["spawn_info"], params["grenade_info"]) + var/log_string = list() + for(var/obj/beaker as anything in grenade.beakers) + log_string += pretty_string_from_reagent_list(beaker.reagents.reagent_list) + user.log_message("spawned a [grenade] containing [english_list(log_string)]", LOG_ADMIN) + return TRUE -/datum/admins/proc/beaker_panel_create_container(list/containerdata, location) - var/containertype = text2path(containerdata["container"]) - var/obj/item/reagent_containers/container = new containertype(location) - var/datum/reagents/reagents = container.reagents - for(var/datum/reagent/R in reagents.reagent_list) // clear the container of reagents - reagents.remove_reagent(R.type,R.volume) - for (var/list/item in containerdata["reagents"]) - var/datum/reagent/reagenttype = text2path(item["reagent"]) - var/amount = text2num(item["volume"]) - if ((reagents.total_volume + amount) > reagents.maximum_volume) - reagents.maximum_volume = reagents.total_volume + amount - reagents.add_reagent(reagenttype, amount) +/datum/beaker_panel/ui_static_data(mob/user) + var/list/data = list() + + data["reagents"] = list() + data["containers"] = list() + + for(var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent)) + if(!reagent_type::name) + continue + data["reagents"] += list(list("id" = reagent_type, "text" = reagent_type::name)) + + for(var/obj/item/reagent_containers/container_type as anything in subtypesof(/obj/item/reagent_containers)) + if(!container_type::name) + continue + data["containers"] += list(list("id" = container_type, "text" = container_type::name, "volume" = container_type::volume)) + + return data + +/datum/beaker_panel/proc/spawn_container_from_data(mob/user, list/spawn_info) + var/container_type = text2path(spawn_info["container"]) + var/list/container_reagents = list() + for(var/reagent_string, reagent_amount in spawn_info["reagents"]) + container_reagents[text2path(reagent_string)] = text2num(reagent_amount) + + return spawn_container(user, container_type, container_reagents) + +/datum/beaker_panel/proc/spawn_container(mob/user, container_type, list/container_reagents) + var/obj/item/reagent_containers/container = new container_type(user.drop_location()) + container.reagents.maximum_volume = INFINITY + container.reagents.clear_reagents() + container.reagents.add_reagent_list(container_reagents) + container.reagents.maximum_volume = max(container.reagents.total_volume, initial(container.volume)) return container +/datum/beaker_panel/proc/spawn_grenade_from_data(mob/user, list/all_spawn_info, list/grenade_info) + var/list/containers = list() + for(var/list/container_info as anything in all_spawn_info) + containers += spawn_container_from_data(user, container_info) + + return spawn_grenade(user, containers, grenade_info) + +/datum/beaker_panel/proc/spawn_grenade(mob/user, list/beakers, list/grenade_info) + var/obj/item/grenade/chem_grenade/grenade = new(user.drop_location()) + grenade.beakers = beakers + grenade.stage_change(GRENADE_READY) + + for(var/obj/beaker as anything in grenade.beakers) + beaker.forceMove(grenade) + + switch(grenade_info["detonation_type"]) + if("normal") + var/det_time = text2num(grenade_info["detonation_timer"]) * 1 SECONDS + if(det_time) + grenade.det_time = det_time + + return grenade + ADMIN_VERB(beaker_panel, R_SPAWN, "Spawn Reagent Container", "Spawn a reagent container.", ADMIN_CATEGORY_EVENTS) - var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/namespaced/common) - asset_datum.send(user) - //Could somebody tell me why this isn't using the browser datum, given that it copypastes all of browser datum's html - // fuck if I know, but im not touching it - var/dat = {" - - - - - - - - - - - - - - -
-
Beaker panel
-
- -
- - - -
-
-
-note: beakers recommended, other containers may have issues -
- - "} - for (var/i in 1 to 2 ) - dat += {" -
-

- Container [i]: -

-
- - -
-
-
- -     - -     - - -
-
    -
  • - -
       - -
    -
  • -
-
- "} - - dat += {" -
-
- - - "} - - user << browse(dat, "window=beakerpanel;size=1100x720") + var/datum/beaker_panel/panel = new + panel.ui_interact(user.mob) diff --git a/code/modules/admin/verbs/hiddenprints.dm b/code/modules/admin/verbs/hiddenprints.dm index a2c5ad63f24..89834411f47 100644 --- a/code/modules/admin/verbs/hiddenprints.dm +++ b/code/modules/admin/verbs/hiddenprints.dm @@ -8,7 +8,7 @@ if(!islist(victim_hiddenprints)) victim_hiddenprints = list() - var/list/hiddenprints = flatten_list(victim_hiddenprints) + var/list/hiddenprints = assoc_to_values(victim_hiddenprints) list_clear_nulls(hiddenprints) if(!length(hiddenprints)) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 48788da7968..bbd89d54abc 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -20,7 +20,7 @@ ADMIN_VERB(play_sound, R_SOUND, "Play Global Sound", "Play a sound to all connec admin_sound.status = SOUND_STREAM admin_sound.volume = vol - var/res = tgui_alert(user, "Show the title of this song to the players?",, list("Yes","No", "Cancel")) + var/res = tgui_alert(user, "Show the title of this song to the players?", "Play Sound", list("Yes", "No", "Cancel")) switch(res) if("Yes") to_chat(world, span_boldannounce("An admin played: [sound]"), confidential = TRUE) @@ -104,34 +104,44 @@ GLOBAL_VAR_INIT(web_sound_cooldown, 0) music_extra_data["album"] = data["album"] duration = data["duration"] * 1 SECONDS if (duration > 10 MINUTES) - if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning!", list("No", "Yes", "Cancel")) != "Yes")) + if((tgui_alert(user, "This song is over 10 minutes long. Are you sure you want to play it?", "Length Warning", list("No", "Yes", "Cancel")) != "Yes")) return - var/res = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Show Info?", list("Yes", "No", "Cancel")) - switch(res) + var/include_song_data = tgui_alert(user, "Show the title of and link to this song to the players?\n[title]", "Song Info", list("Yes", "No", "Cancel")) + switch(include_song_data) if("Yes") music_extra_data["title"] = data["title"] + music_extra_data["artist"] = data["artist"] if("No") - music_extra_data["link"] = "Song Link Hidden" - music_extra_data["title"] = "Song Title Hidden" - music_extra_data["artist"] = "Song Artist Hidden" - music_extra_data["upload_date"] = "Song Upload Date Hidden" - music_extra_data["album"] = "Song Album Hidden" + music_extra_data["link"] = "\[\[HYPERLINK BLOCKED\]\]" + music_extra_data["title"] = "Untitled" + music_extra_data["artist"] = "Unknown" + music_extra_data["upload_date"] = "XX.YY.ZZZZ" + music_extra_data["album"] = "Default" if("Cancel", null) return - var/anon = tgui_alert(user, "Display who played the song?", "Credit Yourself?", list("Yes", "No", "Cancel")) - switch(anon) - if("Yes") - if(res == "Yes") - to_chat(world, span_boldannounce("[user.key] played: [webpage_url]"), confidential = TRUE) + var/stay_anonimous = tgui_alert(user, "Display who played the song?", "Credit Yourself", list("Yes", "No", "Cancel")) + + var/list/to_chat_message = list() + + switch(stay_anonimous) + if("No") + if(include_song_data == "Yes") + to_chat_message += span_notice("[user.ckey] played: [span_linkify(webpage_url)]") else - to_chat(world, span_boldannounce("[user.key] played a sound"), confidential = TRUE) - if("No") - if(res == "Yes") - to_chat(world, span_boldannounce("An admin played: [webpage_url]"), confidential = TRUE) + to_chat_message += span_notice("[user.ckey] played a sound.") + if("Yes") + if(include_song_data == "Yes") + to_chat_message += span_notice("An admin played: [span_linkify(webpage_url)]") + else + to_chat_message += span_notice("An admin played a sound.") if("Cancel", null) return + if(credit) - to_chat(world, span_boldannounce(credit), confidential = TRUE) + to_chat_message += span_notice("
[credit]") + + to_chat(world, fieldset_block("Now Playing: [span_bold(music_extra_data["title"])] by [span_bold(music_extra_data["artist"])]", jointext(to_chat_message, ""), "boxed_message")) + SSblackbox.record_feedback("nested tally", "played_url", 1, list("[user.ckey]", "[input]")) log_admin("[key_name(user)] played web sound: [input]") message_admins("[key_name(user)] played web sound: [input]") diff --git a/code/modules/admin/verbs/request_internet_sound.dm b/code/modules/admin/verbs/request_internet_sound.dm index 296c59867e4..376547fd0e4 100644 --- a/code/modules/admin/verbs/request_internet_sound.dm +++ b/code/modules/admin/verbs/request_internet_sound.dm @@ -2,32 +2,28 @@ set category = "OOC" set name = "Request Internet Sound" - if(GLOB.say_disabled) //This is here to try to identify lag problems - to_chat(usr, span_danger("Speech is currently admin-disabled."), confidential = TRUE) - return - - if (!CONFIG_GET(flag/request_internet_sound)) + if(!CONFIG_GET(flag/request_internet_sound)) to_chat(usr, span_danger("This server has disabled internet sound requests."), confidential = TRUE) return - var/request_url = tgui_input_text(usr, "Please Input a URL", "Only certain sites are allowed, such as YouTube, SoundCloud, and Bandcamp.", "") + var/request_url = tgui_input_text(usr, "Please input a URL. Supported sources: [replacetext(replacetext(CONFIG_GET(string/request_internet_allowed), "\\", ""), ",", ", ")].", "Request Intenet sound") if(!request_url) return - //regex filter var/regex/allowed_regex = regex(replacetext(CONFIG_GET(string/request_internet_allowed), ",", "|"), "i") if(!allowed_regex.Find(request_url)) - to_chat(usr, span_danger("Invalid URL. Please use a URL from one of the following sites: [replacetext(CONFIG_GET(string/request_internet_allowed), "\\", "")]"), confidential = TRUE) + to_chat(usr, span_danger("Invalid URL. Please use a URL from one of the following sites: [replacetext(CONFIG_GET(string/request_internet_allowed), "\\", " ")]"), confidential = TRUE) return var/credit = tgui_alert(usr, "Credit yourself for requesting this song? (will show up as [usr.ckey])", "Credit Yourself?", list("No", "Yes", "Cancel")) if(credit == "Cancel" || isnull(credit)) return + else if (credit == "Yes") credit = "[usr.ckey] requested this track." else - credit = "Someone requested this track." + credit = null log_internet_request("[src.key]/([src.name]): [request_url]") if(usr.client) @@ -38,10 +34,14 @@ return GLOB.requests.music_request(usr.client, request_url, credit) - to_chat(usr, span_info("You requested: \"[request_url]\" to be played."), confidential = TRUE) - request_url = span_adminnotice("MUSIC REQUEST: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]") + to_chat(usr, span_info("You requested [span_linkify(request_url)] to be played."), confidential = TRUE) + + var/list/admin_message = list() + admin_message += ("[ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] has requested the following to be played:
") + admin_message += ("[span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]") + for(var/client/admin_client in GLOB.admins) if(get_chat_toggles(admin_client) & CHAT_PRAYER) - to_chat(admin_client, request_url, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) + to_chat(admin_client, fieldset_block("Internet sound requested", jointext(admin_message, ""), "boxed_message"), type = MESSAGE_TYPE_PRAYER, confidential = TRUE) SSblackbox.record_feedback("tally", "music_request", 1, "Music Request") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 1fb078f39ab..69ed6ba935c 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -231,9 +231,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w log_admin("[key_name(holder)] turned all humans into [result]") message_admins("\blue [key_name_admin(holder)] turned all humans into [result]") var/newtype = GLOB.species_list[result] - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - H.set_species(newtype) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + human_mob.set_species(newtype) if("power") if(!is_funmin) return @@ -518,9 +517,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Monkeyize All Humans")) message_admins("[key_name_admin(holder)] made everyone into monkeys.") log_admin("[key_name_admin(holder)] made everyone into monkeys.") - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon, monkeyize)) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + INVOKE_ASYNC(human_mob, TYPE_PROC_REF(/mob/living/carbon, monkeyize)) if("antag_all") if(!is_funmin) return @@ -554,9 +552,9 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage")) - for(var/mob/living/carbon/human/H in GLOB.player_list) - to_chat(H, span_bolddanger("You suddenly feel stupid."), confidential = TRUE) - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80) + for(var/mob/living/carbon/human/human_mob in GLOB.player_list) + to_chat(human_mob, span_bolddanger("You suddenly feel stupid."), confidential = TRUE) + human_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80) message_admins("[key_name_admin(holder)] made everybody brain damaged") if("floorlava") SSweather.run_weather(/datum/weather/floor_is_lava) @@ -573,33 +571,32 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons")) message_admins("[key_name_admin(holder)] made everything kawaii.") - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/H = i - SEND_SOUND(H, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES])) + for(var/mob/living/carbon/human/human_mob as anything in GLOB.human_list) + SEND_SOUND(human_mob, sound(SSstation.announcer.event_sounds[ANNOUNCER_ANIMES])) - if(H.dna.species.id == SPECIES_HUMAN) - if(H.dna.features[FEATURE_TAIL] == "None" || H.dna.features[FEATURE_EARS] == "None") + if(human_mob.dna.species.id == SPECIES_HUMAN) + if(human_mob.dna.features[FEATURE_TAIL_CAT] == "None" || human_mob.dna.features[FEATURE_EARS] == "None") var/obj/item/organ/ears/cat/ears = new var/obj/item/organ/tail/cat/tail = new - ears.Insert(H, movement_flags = DELETE_IF_REPLACED) - tail.Insert(H, movement_flags = DELETE_IF_REPLACED) + ears.Insert(human_mob, movement_flags = DELETE_IF_REPLACED) + tail.Insert(human_mob, movement_flags = DELETE_IF_REPLACED) var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun - var/list/names = splittext(H.real_name," ") + var/list/names = splittext(human_mob.real_name," ") var/forename = names.len > 1 ? names[2] : names[1] - var/newname = "[forename]-[pick(honorifics["[H.gender]"])]" - H.fully_replace_character_name(H.real_name,newname) - H.update_body_parts() + var/newname = "[forename]-[pick(honorifics["[human_mob.gender]"])]" + human_mob.fully_replace_character_name(human_mob.real_name,newname) + human_mob.update_body_parts() if(animetype == "Yes") var/seifuku = pick(typesof(/obj/item/clothing/under/costume/seifuku)) - var/obj/item/clothing/under/costume/seifuku/I = new seifuku - var/olduniform = H.w_uniform - H.temporarilyRemoveItemFromInventory(H.w_uniform, TRUE, FALSE) - H.equip_to_slot_or_del(I, ITEM_SLOT_ICLOTHING) + var/obj/item/clothing/under/costume/seifuku/anime_uniform = new seifuku + var/olduniform = human_mob.w_uniform + human_mob.temporarilyRemoveItemFromInventory(human_mob.w_uniform, TRUE, FALSE) + human_mob.equip_to_slot_or_del(anime_uniform, ITEM_SLOT_ICLOTHING) qdel(olduniform) if(droptype == "Yes") - ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) + ADD_TRAIT(anime_uniform, TRAIT_NODROP, ADMIN_TRAIT) else - to_chat(H, span_warning("You're not kawaii enough for this!"), confidential = TRUE) + to_chat(human_mob, span_warning("You're not kawaii enough for this!"), confidential = TRUE) if("masspurrbation") if(!is_funmin) return @@ -709,16 +706,16 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w /// portal_appearance is a list in the form (turf's plane offset + 1) -> appearance to use /proc/do_portal_spawn(turf/loc, mobtype, numtospawn, list/portal_appearance, players, humanoutfit) for (var/i in 1 to numtospawn) - var/mob/spawnedMob = new mobtype(loc) + var/mob/spawned_mob = new mobtype(loc) if (length(players)) var/mob/chosen = players[1] if (chosen.client) - chosen.client.prefs.safe_transfer_prefs_to(spawnedMob, is_antag = TRUE) - spawnedMob.PossessByPlayer(chosen.key) + chosen.client.prefs.safe_transfer_prefs_to(spawned_mob, is_antag = TRUE) + spawned_mob.PossessByPlayer(chosen.key) players -= chosen - if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit)) - var/mob/living/carbon/human/H = spawnedMob - H.equipOutfit(humanoutfit) + if (ishuman(spawned_mob) && ispath(humanoutfit, /datum/outfit)) + var/mob/living/carbon/human/human_mob = spawned_mob + human_mob.equipOutfit(humanoutfit) var/turf/T = get_step(loc, SOUTHWEST) T.flick_overlay_static(portal_appearance[GET_TURF_PLANE_OFFSET(T) + 1], 15) playsound(T, 'sound/effects/magic/lightningbolt.ogg', rand(80, 100), TRUE) diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 7586726c48e..5731702e6ca 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -107,7 +107,9 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(select_equipment, R_FUN, "Select Equipment", mob/ta var/icon/dummysprite = get_flat_human_icon(null, dummy_key = dummy_key, - outfit_override = selected_outfit) + outfit_override = selected_outfit, + no_anim = TRUE, + ) data["icon64"] = icon2base64(dummysprite) data["name"] = target_mob diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 45f6f58cb35..ebec3cd7a5a 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -191,7 +191,8 @@ GLOBAL_LIST_EMPTY(antagonists) old_body.remove_from_current_living_antags() var/datum/action/antag_info/info_button = info_button_ref?.resolve() if(info_button) - info_button.Remove(old_body) + if(old_body) + info_button.Remove(old_body) info_button.Grant(new_body) apply_innate_effects(new_body) if(new_body.stat != DEAD) @@ -475,6 +476,7 @@ GLOBAL_LIST_EMPTY(antagonists) dummy = dummy || new /mob/living/carbon/human/dummy/consistent dummy.equipOutfit(outfit, visuals_only = TRUE) dummy.wear_suit?.update_greyscale() + dummy.set_combat_mode(TRUE) var/icon = getFlatIcon(dummy) // We don't want to qdel the dummy right away, since its items haven't initialized yet. diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index febfa8758a4..6fb876a07c2 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -445,7 +445,7 @@ Return to step 11 of normal process."} span_userdanger("[user] begins shaping an energy field around your hands!")) if(do_after(user, time_to_cuff, carbon_victim) && carbon_victim.canBeHandcuffed()) if(!carbon_victim.handcuffed) - carbon_victim.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(carbon_victim)) + carbon_victim.set_handcuffed(new /obj/item/restraints/handcuffs/energy(carbon_victim)) to_chat(user, span_notice("You restrain [carbon_victim].")) log_combat(user, carbon_victim, "handcuffed") else @@ -481,22 +481,16 @@ Return to step 11 of normal process."} name = "hard-light energy field" desc = "A hard-light field restraining the hands." icon_state = "cuff" // Needs sprite - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' breakouttime = 45 SECONDS - trashtype = /obj/item/restraints/handcuffs/energy/used flags_1 = NONE -/obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s [name] breaks in a discharge of energy!"), \ - span_userdanger("[user]'s [name] breaks in a discharge of energy!")) - var/datum/effect_system/spark_spread/sparks = new - sparks.set_up(4,0,user.loc) - sparks.start() +/obj/item/restraints/handcuffs/energy/on_uncuffed(datum/source, mob/living/wearer) . = ..() + wearer.visible_message(span_danger("[wearer]'s [name] breaks in a discharge of energy!"), span_userdanger("[wearer]'s [name] breaks in a discharge of energy!")) + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(4,0,wearer.loc) + sparks.start() + qdel(src) /obj/item/melee/baton/abductor/examine(mob/user) . = ..() diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 3273087a692..e2841ceb019 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -26,8 +26,6 @@ // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob - name = "Unknown" - description = "" color = COLOR_WHITE taste_description = "bad code and slime" chemical_flags = NONE diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 5a420d35883..d3e67400091 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -54,7 +54,7 @@ if (!istype(carbon_owner)) return carbon_owner.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind) - RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_mob_successful_flashed_carbon)) + RegisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_mob_successful_flashed_mob)) /// Take away the ability to add more brothers /datum/antagonist/brother/proc/remove_conversion_skills() @@ -62,12 +62,12 @@ return var/mob/living/carbon/carbon_owner = owner.current carbon_owner.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) - UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON) + UnregisterSignal(carbon_owner, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB) -/datum/antagonist/brother/proc/on_mob_successful_flashed_carbon(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash) +/datum/antagonist/brother/proc/on_mob_successful_flashed_mob(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash) SIGNAL_HANDLER - if (flashed.stat == DEAD) + if (flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed)) return if (flashed.stat != CONSCIOUS) diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 23658907cd2..0988b9c6b15 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -1,7 +1,10 @@ +#define LAST_RESORT_EXPLOSION_RANGE 2 +#define LAST_RESORT_BLIND_RANGE 4 + /datum/action/changeling/headcrab name = "Last Resort" - desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals." - helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." + desc = "We sacrifice our current body in a moment of need, violently expanding to break through obstacles and reforming as a headslug. Costs 20 chemicals." + helptext = "We will violently expand, destroying obstacles around us, then be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us." button_icon_state = "last_resort" chemical_cost = 20 dna_cost = 1 @@ -19,34 +22,66 @@ /datum/action/changeling/headcrab/sting_action(mob/living/user) set waitfor = FALSE var/confirm = tgui_alert(user, "Are we sure we wish to destroy our body and create a headslug?", "Last Resort", list("Yes", "No")) - if(confirm != "Yes") + if(active || confirm != "Yes") return - + active = TRUE ..() + user.visible_message(span_boldwarning("[user]'s body begins to pulsate and swell unnaturally!")) + playsound(user, 'sound/effects/wounds/crack1.ogg', 100, TRUE) + animate(user, transform = user.transform * 1.5, color = COLOR_RED, time = 1 SECONDS) + if(is_walled(user)) + user.Immobilize(1.5 SECONDS) // to prevent the breaking of the wrong walls (who would think of using the antistun after the last resort) + escaping_prison(user) + addtimer(CALLBACK(src, PROC_REF(gibbing), user), 1.1 SECONDS) + +/datum/action/changeling/headcrab/proc/gibbing(mob/living/user) + if(QDELETED(user)) + active = FALSE + return + gore_explosion(user) + var/datum/mind/stored_mind = user.mind var/list/organs = user.get_organs_for_zone(BODY_ZONE_HEAD, TRUE) - - explosion(user, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) - for(var/mob/living/carbon/human/blinded_human in range(2, user)) - var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) - if(!eyes || blinded_human.is_blind()) - continue - to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) - blinded_human.Stun(4 SECONDS) - blinded_human.set_eye_blur_if_lower(40 SECONDS) - blinded_human.adjust_confusion(12 SECONDS) - - for(var/mob/living/silicon/blinded_silicon in range(2,user)) - to_chat(blinded_silicon, span_userdanger("Your sensors are disabled by a shower of blood!")) - blinded_silicon.Paralyze(6 SECONDS) - var/turf/user_turf = get_turf(user) + user.transfer_observers_to(user_turf) // user is about to be deleted, store orbiters on the turf if(user.stat != DEAD) user.investigate_log("has been gibbed by headslug burst.", INVESTIGATE_DEATHS) user.gib(DROP_ALL_REMAINS) - . = TRUE - addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(spawn_headcrab), stored_mind, user_turf, organs), 0.5 SECONDS) // without this delay the worm will be almost dead due to the explosion :( + +/// Creates a light explosion, blinds and confuses mobs in range +/datum/action/changeling/headcrab/proc/gore_explosion(mob/living/user) + var/list/user_DNA = user.get_blood_dna_list() + user.visible_message(span_boldwarning("[user]'s body ruptures in a violent explosion of biomass!")) + playsound(user, 'sound/effects/goresplat.ogg', 100, TRUE) //yuck!! + explosion(user, light_impact_range = LAST_RESORT_EXPLOSION_RANGE, flame_range = 0, flash_range = 0, adminlog = TRUE, silent = TRUE, explosion_cause = src) + user.spawn_gibs() + + for(var/turf/bloody_turf in view(LAST_RESORT_BLIND_RANGE, user)) + var/obj/effect/decal/cleanable/blood/blood_spot = new(bloody_turf) + blood_spot.add_blood_DNA(user_DNA) + + for(var/mob/living/blinded in view(LAST_RESORT_BLIND_RANGE, user)) + if(blinded == user) + continue + blinded.visible_message(span_danger("[blinded] is splattered with blood!"), span_userdanger("You're splattered with blood!")) + blinded.add_blood_DNA(user_DNA) + playsound(blinded, 'sound/effects/splat.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE) + + if(ishuman(blinded)) + var/mob/living/carbon/human/blinded_human = blinded + var/obj/item/organ/eyes/eyes = blinded_human.get_organ_slot(ORGAN_SLOT_EYES) + if(!eyes || blinded_human.is_blind()) + continue + to_chat(blinded_human, span_userdanger("You are blinded by a shower of blood!")) + blinded_human.Stun(4 SECONDS) + blinded_human.set_eye_blur_if_lower(40 SECONDS) + blinded_human.adjust_confusion(12 SECONDS) + if(issilicon(blinded)) + var/mob/living/silicon/blinded_silicon = blinded + to_chat(blinded_silicon, span_userdanger("Your sensors are disabled by a shower of blood!")) + blinded_silicon.Paralyze(6 SECONDS) /// Creates the headrab to occupy /datum/action/changeling/headcrab/proc/spawn_headcrab(datum/mind/stored_mind, turf/spawn_location, list/organs) @@ -56,4 +91,53 @@ stored_mind.transfer_to(crab, force_key_move = TRUE) spawn_location.transfer_observers_to(crab) - to_chat(crab, span_warning("You burst out of the remains of your former body in a shower of gore!")) + to_chat(crab, span_warning("We burst out of the remains of our former body in a shower of gore!")) + active = FALSE + +/// Ruptures nearby walls using the torn_wall component. Also it destroys objects with density. +/datum/action/changeling/headcrab/proc/escaping_prison(mob/living/user) + user.visible_message(span_boldwarning("[user]'s expanding form begins crushing the surrounding obstacles!")) + var/list/walls_to_destroy = list() + + for(var/turf/nearby_turf in range(1, user)) + if(iswallturf(nearby_turf)) + var/turf/closed/wall/nearby_wall = nearby_turf + var/datum/component/torn_wall/torn_comp = nearby_wall.GetComponent(/datum/component/torn_wall) + if(!torn_comp) + nearby_wall.AddComponent(/datum/component/torn_wall, current_stage = 1) + else + torn_comp.current_stage = 1 + walls_to_destroy += nearby_wall + continue + for(var/obj/obj_obstacle in nearby_turf) + if(!obj_obstacle.density || (obj_obstacle.resistance_flags & INDESTRUCTIBLE) || !obj_obstacle.anchored) + continue + if(obj_obstacle.uses_integrity) + obj_obstacle.take_damage(300) + + addtimer(CALLBACK(src, PROC_REF(finalize_destruction), walls_to_destroy, user, user.loc), 1 SECONDS) + +/// Completes the destruction of the walls after a 1-second delay for more drama +/datum/action/changeling/headcrab/proc/finalize_destruction(list/affected_walls, mob/living/user, atom/user_prev_loc) + if(QDELETED(user) || (user.loc != user_prev_loc)) + active = FALSE + return + for(var/turf/closed/wall/wall in affected_walls) + if(QDELETED(wall)) + continue + wall.AddComponent(/datum/component/torn_wall) + +/datum/action/changeling/headcrab/proc/is_walled(mob/living/user) + var/turf/ling_turf = get_turf(user) + if(!ling_turf) + return FALSE + var/blocked_directions + + for(var/dir in GLOB.cardinals) + var/turf/neighbor = get_step(ling_turf, dir) + if(!neighbor || neighbor.is_blocked_turf(exclude_mobs = TRUE)) + blocked_directions++ + return blocked_directions >= 3 //1x2 cage won't be able to contain linga + +#undef LAST_RESORT_EXPLOSION_RANGE +#undef LAST_RESORT_BLIND_RANGE diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 77dfc92c81e..d2d80e2bbeb 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -581,7 +581,7 @@ span_userdanger("[user] begins shaping dark magic shackles around your wrists!")) if(do_after(user, 3 SECONDS, C)) if(!C.handcuffed) - C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) + C.equip_to_slot_or_del(new /obj/item/restraints/handcuffs/cult, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) C.adjust_silence(10 SECONDS) to_chat(user, span_notice("You shackle [C].")) log_combat(user, C, "shackled") @@ -593,19 +593,6 @@ else to_chat(user, span_warning("[C] is already bound.")) - -/obj/item/restraints/handcuffs/energy/cult //For the shackling spell - name = "shadow shackles" - desc = "Shackles that bind the wrists with sinister magic." - trashtype = /obj/item/restraints/handcuffs/energy/used - item_flags = DROPDEL - -/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user) - user.visible_message(span_danger("[user]'s shackles shatter in a discharge of dark magic!"), \ - span_userdanger("Your [src] shatters in a discharge of dark magic!")) - . = ..() - - //Construction: Converts 50 iron to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell /obj/item/melee/blood_magic/construction name = "Twisting Aura" diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ca4bb86cc97..0554e2cae7c 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -222,7 +222,7 @@ Striking a noncultist, however, will tear their flesh."} // Moon PATH_MOON = list( WIELDER_SPELLS = list(/datum/action/cooldown/spell/pointed/projectile/moon_parade), - SWORD_SPELLS = list(/datum/action/cooldown/spell/pointed/moon_smile), + SWORD_SPELLS = list(/datum/action/cooldown/spell/pointed/mind_gate), SWORD_PREFIX = "shimmering", ), // Starter @@ -412,7 +412,7 @@ Striking a noncultist, however, will tear their flesh."} fling_act.Grant(trapped_entity) // Set the sword's path for spell selection. - heretic_path = heretic_holder.heretic_path + heretic_path = heretic_holder.heretic_path.route || PATH_START // Copy the objectives to keep for roundend, remove the datum as neither us nor the heretic need it anymore var/list/copied_objectives = heretic_holder.objectives.Copy() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index de840127f88..b3dfd066fae 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1047,7 +1047,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor new_human.apply_status_effect(/datum/status_effect/cultghost) //ghosts can't summon more ghosts new_human.set_invis_see(SEE_INVISIBLE_OBSERVER) - new_human.add_traits(list(TRAIT_NOBREATH, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) // permanently mortal can be removed once this is a bespoke kind of mob + new_human.add_traits(list(TRAIT_NOBREATH, TRAIT_SPAWNED_MOB, TRAIT_PERMANENTLY_MORTAL), INNATE_TRAIT) // permanently mortal can be removed once this is a bespoke kind of mob ghosts++ playsound(src, 'sound/effects/magic/exit_blood.ogg', 50, TRUE) visible_message(span_warning("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")) diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index d6d479151c7..ca50d97b582 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -29,47 +29,63 @@ stinger_sound = 'sound/music/antag/heretic/heretic_gain.ogg' antag_flags = parent_type::antag_flags | ANTAG_OBSERVER_VISIBLE_PANEL - /// Whether we give this antagonist objectives on gain. - var/give_objectives = TRUE - /// Whether we've ascended! (Completed one of the final rituals) - var/ascended = FALSE - /// The path our heretic has chosen. Mostly used for flavor. - var/heretic_path = PATH_START - /// A sum of how many knowledge points this heretic CURRENTLY has. Used to research. - var/knowledge_points = 2 //SKYRAT EDIT - ORIGINAL 1 - /// The time between gaining influence passively. The heretic gain +1 knowledge points every this duration of time. - var/passive_gain_timer = 20 MINUTES - /// Assoc list of [typepath] = [knowledge instance]. A list of all knowledge this heretic's reserached. - var/list/researched_knowledge = list() - /// The organ slot we place our Living Heart in. - var/living_heart_organ_slot = ORGAN_SLOT_HEART - /// A list of TOTAL how many sacrifices completed. (Includes high value sacrifices) - var/total_sacrifices = 0 - /// A list of TOTAL how many high value sacrifices completed. (Heads of staff) - var/high_value_sacrifices = 0 - /// Lazy assoc list of [refs to humans] to [image previews of the human]. Humans that we have as sacrifice targets. - var/list/mob/living/carbon/human/sac_targets - /// List of all sacrifice target's names, used for end of round report - var/list/all_sac_targets = list() - /// Whether we're drawing a rune or not - var/drawing_rune = FALSE + /// Contains multiple separate heretic shops so you can choose between multiple when buying. + var/list/heretic_shops = list( + HERETIC_KNOWLEDGE_START = list(), + HERETIC_KNOWLEDGE_TREE = list(), + HERETIC_KNOWLEDGE_SHOP = list(), + HERETIC_KNOWLEDGE_DRAFT = list() + ) /// A static typecache of all tools we can scribe with. var/static/list/scribing_tools = typecacheof(list(/obj/item/pen, /obj/item/toy/crayon)) /// A blacklist of turfs we cannot scribe on. var/static/list/blacklisted_rune_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm)) - /// Controls what types of turf we can spread rust to, increases as we unlock more powerful rust abilites - var/rust_strength = 0 - /// Wether we are allowed to ascend - var/feast_of_owls = FALSE - + /// A static list of all paths we can take and related info for the UI + var/static/list/path_info = list() + /// Assoc list of [typepath] = [knowledge instance]. A list of all knowledge this heretic's reserached. + var/list/researched_knowledge = list() + /// Lazy assoc list of [refs to humans] to [image previews of the human]. Humans that we have as sacrifice targets. + var/list/mob/living/carbon/human/sac_targets + /// List of all sacrifice target's names, used for end of round report + var/list/all_sac_targets = list() /// List that keeps track of which items have been gifted to the heretic after a cultist was sacrificed. Used to alter drop chances to reduce dupes. var/list/unlocked_heretic_items = list( /obj/item/melee/sickly_blade/cursed = 0, /obj/item/clothing/neck/heretic_focus/crimson_medallion = 0, /mob/living/basic/construct/harvester/heretic = 0, ) + /// Whether or not the heretic can make unlimited blades, but unable to blade break to teleport + var/unlimited_blades = FALSE + /// Whether we are allowed to ascend + var/feast_of_owls = FALSE + /// Whether we give this antagonist objectives on gain. + var/give_objectives = TRUE + /// Whether we've ascended! (Completed one of the final rituals) + var/ascended = FALSE + /// Whether we're drawing a rune or not + var/drawing_rune = FALSE + /// The path our heretic has chosen. + var/datum/heretic_knowledge_tree_column/heretic_path + /// Reference to the overlay heretics get when they get strong enough + var/static/mutable_appearance/eldritch_overlay = mutable_appearance('icons/mob/effects/heretic_aura.dmi', "heretic_aura") + /// A sum of how many knowledge points this heretic CURRENTLY has. Used to research. + var/knowledge_points = 2 //SKYRAT EDIT - ORIGINAL 1 + /// The time between gaining influence passively. The heretic gain +1 knowledge points every this duration of time. + var/passive_gain_timer = 20 MINUTES + /// Tracks how many knowledge points the heretic has aqcuired. Once you get enough points you lose the ability to blade break + var/knowledge_gained = 0 + /// The organ slot we place our Living Heart in. + var/living_heart_organ_slot = ORGAN_SLOT_HEART + /// A list of TOTAL how many sacrifices completed. (Includes high value sacrifices) + var/total_sacrifices = 0 + /// A list of TOTAL how many high value sacrifices completed. (Heads of staff) + var/high_value_sacrifices = 0 + /// Controls what types of turf we can spread rust to + var/rust_strength = 1 /// Simpler version of above used to limit amount of loot that can be hoarded var/rewards_given = 0 + /// Our heretic passive level. Tracked here in case of body moving shenanigans + var/passive_level = 1 /datum/antagonist/heretic/Destroy() LAZYNULL(sac_targets) @@ -105,13 +121,6 @@ icon_path = result_mob.icon icon_state = result_mob.icon_state - //if the knowledge is an eldritch mark, use the mark sprite - else if(ispath(knowledge,/datum/heretic_knowledge/mark)) - var/datum/heretic_knowledge/mark/mark_knowledge = knowledge - var/datum/status_effect/eldritch/mark_effect = mark_knowledge.mark_type - icon_path = mark_effect.effect_icon - icon_state = mark_effect.effect_icon_state - //if the knowledge is an ascension, use the achievement sprite else if(ispath(knowledge,/datum/heretic_knowledge/ultimate)) var/datum/heretic_knowledge/ultimate/ascension_knowledge = knowledge @@ -128,70 +137,126 @@ result_parameters["moving"] = icon_moving return result_parameters -/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, done) - +/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, list/source_list, done = FALSE, category = HERETIC_KNOWLEDGE_TREE) + if(!length(source_list)) + CRASH("get_knowledge_data called without source_list! (Got: [source_list || "empty list"])") var/list/knowledge_data = list() knowledge_data["path"] = knowledge knowledge_data["icon_params"] = get_icon_of_knowledge(knowledge) knowledge_data["name"] = initial(knowledge.name) knowledge_data["gainFlavor"] = initial(knowledge.gain_text) - knowledge_data["cost"] = initial(knowledge.cost) - knowledge_data["disabled"] = (!done) && (initial(knowledge.cost) > knowledge_points) - knowledge_data["bgr"] = GLOB.heretic_research_tree[knowledge][HKT_UI_BGR] - knowledge_data["finished"] = done - knowledge_data["ascension"] = ispath(knowledge,/datum/heretic_knowledge/ultimate) + knowledge_data["cost"] = source_list[knowledge][HKT_COST] + knowledge_data["depth"] = source_list[knowledge][HKT_DEPTH] + knowledge_data["bgr"] = source_list[knowledge][HKT_UI_BGR] + knowledge_data[HKT_CATEGORY] = category + knowledge_data["ascension"] = ispath(knowledge, /datum/heretic_knowledge/ultimate) + knowledge_data["done"] = done //description of a knowledge might change, make sure we are not shown the initial() value in that case - if(done) - var/datum/heretic_knowledge/knowledge_instance = researched_knowledge[knowledge] + var/list/knowledge_info = researched_knowledge[knowledge] + if(islist(knowledge_info)) + var/datum/heretic_knowledge/knowledge_instance = knowledge_info[HKT_INSTANCE] + knowledge_data["desc"] = knowledge_instance.desc else knowledge_data["desc"] = initial(knowledge.desc) - return knowledge_data -/datum/antagonist/heretic/ui_data(mob/user) - var/list/data = list() - data["charges"] = knowledge_points +/datum/antagonist/heretic/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui?.set_autoupdate(FALSE) + +/datum/antagonist/heretic/ui_data(mob/user) + var/list/data = list("charges" = knowledge_points) + + data["objectives"] = get_objectives() + data["can_change_objective"] = can_assign_self_objectives + + data["paths"] = path_info + data["passive_level"] = passive_level + data["total_sacrifices"] = total_sacrifices data["ascended"] = ascended - var/list/tiers = list() + var/list/tree_data = list() + var/list/shop_knowledge = list() // This should be cached in some way, but the fact that final knowledge // has to update its disabled state based on whether all objectives are complete, // makes this very difficult. I'll figure it out one day maybe - for(var/datum/heretic_knowledge/knowledge as anything in researched_knowledge) - var/list/knowledge_data = get_knowledge_data(knowledge,TRUE) + for(var/knowledge_path in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_path] + /// draft knowledges are only shown post-research + var/list/knowledge_data = get_knowledge_data(knowledge_path, researched_knowledge, TRUE, knowledge_info[HKT_CATEGORY]) + var/category = knowledge_info[HKT_CATEGORY] - while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) - tiers += list(list("nodes"=list())) + var/depth = knowledge_info[HKT_DEPTH] + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) - tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) + if(category == HERETIC_KNOWLEDGE_SHOP || category == HERETIC_KNOWLEDGE_DRAFT) + shop_knowledge += list(knowledge_data) + continue - for(var/datum/heretic_knowledge/knowledge as anything in get_researchable_knowledge()) - var/list/knowledge_data = get_knowledge_data(knowledge,FALSE) + tree_data[depth]["nodes"] += list(knowledge_data) + + // TODO: sanity for purchasing categories as bypasses are likely rn + var/list/heretic_tree = heretic_shops[HERETIC_KNOWLEDGE_TREE] + var/list/researchable_knowledges = get_researchable_knowledge() + for(var/datum/heretic_knowledge/knowledge_path as anything in heretic_tree) + if(ispath(knowledge_path, /datum/heretic_knowledge/limited_amount/starting)) + continue + var/list/knowledge_info = heretic_tree[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + var/list/knowledge_data = get_knowledge_data(knowledge_path, heretic_tree, FALSE) // Final knowledge can't be learned until all objectives are complete. - if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) - knowledge_data["disabled"] ||= !can_ascend() + if(ispath(knowledge_path, /datum/heretic_knowledge/ultimate)) + var/ascension_check = can_ascend() + if(ascension_check != HERETIC_CAN_ASCEND) + knowledge_data["disabled"] = TRUE + knowledge_data["tooltip"] = ascension_check - while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) - tiers += list(list("nodes"=list())) - tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) + var/depth = knowledge_data[HKT_DEPTH] - data["knowledge_tiers"] = tiers + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) - return data + tree_data[depth]["nodes"] += list(knowledge_data) -/datum/antagonist/heretic/ui_static_data(mob/user) - var/list/data = list() - data["objectives"] = get_objectives() - data["can_change_objective"] = can_assign_self_objectives + if(!heretic_path) + data["knowledge_tiers"] = tree_data + return data + + var/list/heretic_drafts = heretic_shops[HERETIC_KNOWLEDGE_DRAFT] + for(var/datum/heretic_knowledge/knowledge_path as anything in heretic_drafts) + var/list/knowledge_info = heretic_drafts[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + var/list/knowledge_data = get_knowledge_data(knowledge_path, heretic_drafts, FALSE, HERETIC_KNOWLEDGE_DRAFT) + + var/depth = knowledge_data[HKT_DEPTH] + while(depth > length(tree_data)) + tree_data += list(list("nodes" = list())) + + tree_data[depth]["nodes"] += list(knowledge_data) + + data["knowledge_tiers"] = tree_data + var/list/shop = heretic_shops[HERETIC_KNOWLEDGE_SHOP] + for(var/knowledge_path in shop) + var/list/knowledge_info = shop[knowledge_path] + if(!(knowledge_info[HKT_ID] in researchable_knowledges)) + continue + + var/list/knowledge_data = get_knowledge_data(knowledge_path, shop, FALSE, HERETIC_KNOWLEDGE_SHOP) + shop_knowledge += list(knowledge_data) + + data["knowledge_shop"] = shop_knowledge return data @@ -205,21 +270,27 @@ var/datum/heretic_knowledge/researched_path = text2path(params["path"]) if(!ispath(researched_path, /datum/heretic_knowledge)) CRASH("Heretic attempted to learn non-heretic_knowledge path! (Got: [researched_path || "invalid path"])") - if(!(researched_path in get_researchable_knowledge())) + var/shop_category = params["category"] + if(!researchable_knowledge(researched_path, shop_category)) message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn knowledge they can't learn!") CRASH("Heretic attempted to learn knowledge they can't learn! (Got: [researched_path])") - if(ispath(researched_path, /datum/heretic_knowledge/ultimate) && !can_ascend()) + if(ispath(researched_path, /datum/heretic_knowledge/ultimate) & can_ascend() != HERETIC_CAN_ASCEND) message_admins("Heretic [key_name(owner)] potentially attempted to href exploit to learn ascension knowledge without completing objectives!") CRASH("Heretic attempted to learn a final knowledge despite not being able to ascend!") - if(initial(researched_path.cost) > knowledge_points) - return TRUE - if(!gain_knowledge(researched_path)) - return TRUE + + if(!purchase_knowledge(researched_path, shop_category)) + return FALSE + update_data_for_all_viewers() log_heretic_knowledge("[key_name(owner)] gained knowledge: [initial(researched_path.name)]") - knowledge_points -= initial(researched_path.cost) return TRUE +/datum/antagonist/heretic/proc/researchable_knowledge(datum/heretic_knowledge/knowledge_path, shop_category = HERETIC_KNOWLEDGE_TREE) + var/list/knowledge_info = heretic_shops[shop_category][knowledge_path] + if(knowledge_info[HKT_ID] in get_researchable_knowledge()) + return TRUE + return FALSE + /datum/antagonist/heretic/submit_player_objective(retain_existing = FALSE, retain_escape = TRUE, force = FALSE) if (isnull(owner) || isnull(owner.current)) return @@ -241,7 +312,7 @@ /datum/antagonist/heretic/get_preview_icon() var/icon/icon = render_preview_outfit(preview_outfit) - // MOTHBLOCKS TOOD: Copied and pasted from cult, make this its own proc + // MOTHBLOCKS TODO: Copied and pasted from cult, make this its own proc // The sickly blade is 64x64, but getFlatIcon crunches to 32x32. // So I'm just going to add it in post, screw it. @@ -265,15 +336,20 @@ return ..() /datum/antagonist/heretic/on_gain() - if(!GLOB.heretic_research_tree) - GLOB.heretic_research_tree = generate_heretic_research_tree() + generate_heretic_starting_knowledge(heretic_shops[HERETIC_KNOWLEDGE_START]) + if(!length(path_info)) + for(var/datum/heretic_knowledge_tree_column/path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) + path = new path() + path_info += list(path.get_ui_data(src, HERETIC_KNOWLEDGE_START)) + qdel(path) if(give_objectives) - forge_primary_objectives() + forge_primary_objectives(heretic_shops[HERETIC_KNOWLEDGE_TREE]) for(var/starting_knowledge in GLOB.heretic_start_knowledge) - gain_knowledge(starting_knowledge) + gain_knowledge(starting_knowledge, HERETIC_KNOWLEDGE_START, update = FALSE) + owner.current.AddElement(/datum/element/leeching_walk/minor) ADD_TRAIT(owner, TRAIT_SEE_BLESSED_TILES, REF(src)) addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer) // Gain +1 knowledge every 20 minutes. @@ -281,12 +357,15 @@ /datum/antagonist/heretic/on_removal() if(owner.current) - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] knowledge.on_lose(owner.current, src) + QDEL_NULL(researched_knowledge[knowledge_path][HKT_INSTANCE]) REMOVE_TRAIT(owner, TRAIT_SEE_BLESSED_TILES, REF(src)) - QDEL_LIST_ASSOC_VAL(researched_knowledge) + owner.current.RemoveElement(/datum/element/leeching_walk/minor) + QDEL_NULL(heretic_path) + owner.current.cut_overlay(eldritch_overlay) return ..() /datum/antagonist/heretic/apply_innate_effects(mob/living/mob_override) @@ -294,7 +373,7 @@ handle_clown_mutation(our_mob, "Ancient knowledge described to you has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") our_mob.faction |= FACTION_HERETIC - if (!issilicon(our_mob)) + if(!issilicon(our_mob)) GLOB.reality_smash_track.add_tracked_mind(owner) ADD_TRAIT(our_mob, TRAIT_MANSUS_TOUCHED, REF(src)) @@ -302,31 +381,89 @@ RegisterSignals(our_mob, list(COMSIG_MOB_BEFORE_SPELL_CAST, COMSIG_MOB_SPELL_ACTIVATED), PROC_REF(on_spell_cast)) RegisterSignal(our_mob, COMSIG_USER_ITEM_INTERACTION, PROC_REF(on_item_use)) RegisterSignal(our_mob, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(after_fully_healed)) + RegisterSignal(our_mob, COMSIG_ATOM_EXAMINE, PROC_REF(on_heretic_examine)) + + RegisterSignals( + our_mob, + list(SIGNAL_ADDTRAIT(TRAIT_HERETIC_AURA_HIDDEN), SIGNAL_REMOVETRAIT(TRAIT_HERETIC_AURA_HIDDEN)), + PROC_REF(update_heretic_aura) + ) /datum/antagonist/heretic/remove_innate_effects(mob/living/mob_override) var/mob/living/our_mob = mob_override || owner.current handle_clown_mutation(our_mob, removing = FALSE) our_mob.faction -= FACTION_HERETIC - if (owner in GLOB.reality_smash_track.tracked_heretics) + if(owner in GLOB.reality_smash_track.tracked_heretics) GLOB.reality_smash_track.remove_tracked_mind(owner) REMOVE_TRAIT(our_mob, TRAIT_MANSUS_TOUCHED, REF(src)) - UnregisterSignal(our_mob, list( - COMSIG_MOB_BEFORE_SPELL_CAST, - COMSIG_MOB_SPELL_ACTIVATED, - COMSIG_USER_ITEM_INTERACTION, - COMSIG_LIVING_POST_FULLY_HEAL, - COMSIG_LIVING_CULT_SACRIFICED, - )) + UnregisterSignal( + our_mob, + list( + COMSIG_MOB_BEFORE_SPELL_CAST, + COMSIG_MOB_SPELL_ACTIVATED, + COMSIG_USER_ITEM_INTERACTION, + COMSIG_LIVING_POST_FULLY_HEAL, + COMSIG_LIVING_CULT_SACRIFICED, + COMSIG_ATOM_EXAMINE, + SIGNAL_ADDTRAIT(TRAIT_HERETIC_AURA_HIDDEN), + SIGNAL_REMOVETRAIT(TRAIT_HERETIC_AURA_HIDDEN) + ) + ) + +/// Removes the ability to blade break, removes cloak of shadows and removes the cap on how many blades you can craft +/datum/antagonist/heretic/proc/disable_blade_breaking() + if(unlimited_blades) + return + var/mob/heretic_mob = owner.current + unlimited_blades = TRUE + to_chat(heretic_mob, span_boldwarning("You have gained a lot of power, the mansus will no longer allow you to break your blades, but you can now make as many as you wish.")) + heretic_mob.balloon_alert(heretic_mob, "blade breaking disabled!") + update_heretic_aura() + var/datum/action/cooldown/spell/shadow_cloak/cloak_spell = locate() in heretic_mob.actions + cloak_spell.Remove(heretic_mob) + +/// Adds an overlay to the heretic +/datum/antagonist/heretic/proc/update_heretic_aura() + SIGNAL_HANDLER + var/mob/heretic_mob = owner.current + heretic_mob.cut_overlay(eldritch_overlay) + + if(!should_show_aura()) + return FALSE + + heretic_mob.add_overlay(eldritch_overlay) + return TRUE + +/datum/antagonist/heretic/proc/should_show_aura() + if(!can_assign_self_objectives) + return FALSE // We spurned the offer of the Mansus :( + if(!unlimited_blades || HAS_TRAIT(owner.current, TRAIT_HERETIC_AURA_HIDDEN)) + return FALSE // No aura if we have the trait or is too early still + if(feast_of_owls) + return FALSE // No use in giving the aura to a heretic that can't ascend + if(heretic_path?.route == PATH_LOCK) + return FALSE // Lock heretics never get this aura + return TRUE + +/datum/antagonist/heretic/proc/on_heretic_examine(datum/source, mob/user, text) + SIGNAL_HANDLER + if(!should_show_aura()) + return + var/mob/heretic_mob = owner.current + var/potential_string = "[heretic_mob.p_They()] [heretic_mob.p_are()] crackling with a swirling green vortex of energy." + if(can_ascend() == HERETIC_CAN_ASCEND) + potential_string += " [heretic_mob.p_They()] [heretic_mob.p_are()] shedding [heretic_mob.p_their()] mortal shell!" + text += span_green(potential_string) /datum/antagonist/heretic/on_body_transfer(mob/living/old_body, mob/living/new_body) . = ..() if(old_body == new_body) // if they were using a temporary body return - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] knowledge.on_lose(old_body, src) knowledge.on_gain(new_body, src) @@ -413,7 +550,7 @@ /datum/antagonist/heretic/proc/draw_rune(mob/living/user, turf/target_turf, drawing_time = 20 SECONDS, additional_checks) drawing_rune = TRUE - var/rune_colour = GLOB.heretic_path_to_color[heretic_path] + var/rune_colour = GLOB.heretic_path_to_color[heretic_path?.route || PATH_START] target_turf.balloon_alert(user, "drawing rune...") var/obj/effect/temp_visual/drawing_heretic_rune/drawing_effect if (drawing_time < (10 SECONDS)) @@ -567,8 +704,8 @@ /** * Create our objectives for our heretic. */ -/datum/antagonist/heretic/proc/forge_primary_objectives() - var/datum/objective/heretic_research/research_objective = new() +/datum/antagonist/heretic/proc/forge_primary_objectives(heretic_research_tree) + var/datum/objective/heretic_research/research_objective = new(heretic_research_tree = heretic_research_tree) research_objective.owner = owner objectives += research_objective @@ -580,7 +717,7 @@ var/datum/objective/minor_sacrifice/sac_objective = new() sac_objective.owner = owner if(num_heads < 2) // They won't get major sacrifice, so bump up minor sacrifice a bit - sac_objective.target_amount += 2 + sac_objective.target_amount = 5 sac_objective.update_explanation_text() objectives += sac_objective @@ -628,11 +765,19 @@ * Used in callbacks for passive gain over time. */ /datum/antagonist/heretic/proc/passive_influence_gain() - knowledge_points++ - if(owner.current.stat <= SOFT_CRIT) + adjust_knowledge_points(1) + if(owner?.current?.stat <= SOFT_CRIT) to_chat(owner.current, "[span_hear("You hear a whisper...")] [span_hypnophrase(pick_list(HERETIC_INFLUENCE_FILE, "drain_message"))]") addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer) +/datum/antagonist/heretic/proc/adjust_knowledge_points(amount, update = TRUE) + knowledge_points = max(0, knowledge_points + amount) // Don't allow negative knowledge points + knowledge_gained += max(0, amount) + if(knowledge_gained > 8 && !unlimited_blades) + disable_blade_breaking() + if(update) + update_data_for_all_viewers() + /datum/antagonist/heretic/roundend_report() var/list/parts = list() @@ -673,8 +818,9 @@ var/list/string_of_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_path] + var/datum/heretic_knowledge/knowledge = knowledge_info[HKT_INSTANCE] string_of_knowledge += knowledge.name parts += english_list(string_of_knowledge) @@ -766,7 +912,7 @@ if(!change_num || QDELETED(src)) return - knowledge_points += change_num + adjust_knowledge_points(change_num) /** * Admin proc for giving a heretic a focus. @@ -783,8 +929,8 @@ /datum/antagonist/heretic/antag_panel_data() var/list/string_of_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] if(istype(knowledge, /datum/heretic_knowledge/ultimate)) string_of_knowledge += span_bold(knowledge.name) else @@ -805,35 +951,72 @@ . += "None!
" . += "
" +/datum/antagonist/heretic/proc/purchase_knowledge(datum/heretic_knowledge/knowledge_type, category = HERETIC_KNOWLEDGE_TREE, update = TRUE) + var/list/shop_list = heretic_shops[category] + if(!shop_list) + stack_trace("Heretic attempted to learn knowledge from a non-existent category! (Got: [category])") + return FALSE + + var/list/knowledge_data = shop_list[knowledge_type] + if(!knowledge_data) + stack_trace("[type] purchase_knowledge was given a path that doesn't exist in the heretic [category] knowledge list! (Got: [knowledge_type])") + return FALSE + + var/cost = knowledge_data[HKT_COST] + if(cost > knowledge_points) + return FALSE + if(!gain_knowledge(knowledge_type, category, update)) + return FALSE + adjust_knowledge_points(-cost, FALSE) + return TRUE /** * Learns the passed [typepath] of knowledge, creating a knowledge datum * and adding it to our researched knowledge list. * * Returns TRUE if the knowledge was added successfully. FALSE otherwise. */ -/datum/antagonist/heretic/proc/gain_knowledge(datum/heretic_knowledge/knowledge_type) +/datum/antagonist/heretic/proc/gain_knowledge(datum/heretic_knowledge/knowledge_type, category = HERETIC_KNOWLEDGE_TREE, update = TRUE) + var/list/knowledge_list = heretic_shops[category] if(!ispath(knowledge_type)) stack_trace("[type] gain_knowledge was given an invalid path! (Got: [knowledge_type])") return FALSE + var/list/knowledge_data = knowledge_list[knowledge_type] + if(!islist(knowledge_data)) + knowledge_data = make_knowledge_entry(knowledge_type, category) + heretic_shops[category][knowledge_type] = knowledge_data if(get_knowledge(knowledge_type)) return FALSE var/datum/heretic_knowledge/initialized_knowledge = new knowledge_type() - researched_knowledge[knowledge_type] = initialized_knowledge + if(!initialized_knowledge.pre_research(owner.current, src)) + return FALSE + researched_knowledge[knowledge_type] = knowledge_data.Copy() + researched_knowledge[knowledge_type][HKT_INSTANCE] = initialized_knowledge + researched_knowledge[knowledge_type][HKT_CATEGORY] = category + + // case for letting you modify depth post-purchase + var/purchased_depth = knowledge_data[HKT_PURCHASED_DEPTH] + if(purchased_depth != 0 && isnum(purchased_depth)) + researched_knowledge[knowledge_type][HKT_DEPTH] = purchased_depth + + knowledge_list -= knowledge_type + initialized_knowledge.on_research(owner.current, src) - update_static_data(owner.current) + if(update) + update_data_for_all_viewers() + return TRUE /** - * Get a list of all knowledge TYPEPATHS that we can currently research. + * Get a list of all knowledge IDs that we can currently research. */ /datum/antagonist/heretic/proc/get_researchable_knowledge() var/list/researchable_knowledge = list() var/list/banned_knowledge = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] - researchable_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_NEXT] - banned_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_BAN] - banned_knowledge |= knowledge.type + for(var/knowledge_type in researched_knowledge) + var/list/knowledge_info = researched_knowledge[knowledge_type] + researchable_knowledge |= knowledge_info[HKT_NEXT] + banned_knowledge |= knowledge_info[HKT_BAN] + banned_knowledge |= knowledge_type researchable_knowledge -= banned_knowledge return researchable_knowledge @@ -841,7 +1024,10 @@ * Check if the wanted type-path is in the list of research knowledge. */ /datum/antagonist/heretic/proc/get_knowledge(wanted) - return researched_knowledge[wanted] + var/list/knowledge_data = researched_knowledge[wanted] + if(knowledge_data) + return knowledge_data[HKT_INSTANCE] + return null /// Makes our heretic more able to rust things. /// if side_path_only is set to TRUE, this function does nothing for rust heretics. @@ -860,8 +1046,8 @@ /datum/antagonist/heretic/proc/get_rituals() var/list/rituals = list() - for(var/knowledge_index in researched_knowledge) - var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] + for(var/knowledge_path in researched_knowledge) + var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_path][HKT_INSTANCE] if(!knowledge.can_be_invoked(src)) continue rituals[knowledge.name] = knowledge @@ -874,14 +1060,19 @@ * Returns FALSE if not all of our objectives are complete, or TRUE otherwise. */ /datum/antagonist/heretic/proc/can_ascend() - if(!can_assign_self_objectives) - return FALSE // We spurned the offer of the Mansus :( if(feast_of_owls) - return FALSE // We sold our ambition for immediate power :/ + return "The owls have taken your right of ascension (denied ascension)." // We sold our ambition for immediate power :/ + if(!can_assign_self_objectives) + return "The mansus has spurned you (denied ascension)." for(var/datum/objective/must_be_done as anything in objectives) if(!must_be_done.check_completion()) - return FALSE - return TRUE + return "Must complete all objectives before ascending." + var/config_time = CONFIG_GET(number/minimum_ascension_time) MINUTES + + var/time_passed = STATION_TIME_PASSED() + if(config_time >= time_passed) + return "Too early, must wait [DisplayTimeText(config_time - time_passed)] before ascending." + return HERETIC_CAN_ASCEND /** * Helper to determine if a Heretic @@ -909,7 +1100,7 @@ /datum/objective/minor_sacrifice/New(text) . = ..() - target_amount = rand(3, 4) + target_amount = 4 update_explanation_text() /datum/objective/minor_sacrifice/update_explanation_text() @@ -940,7 +1131,7 @@ /// The length of a main path. Calculated once in New(). var/static/main_path_length = 0 -/datum/objective/heretic_research/New(text) +/datum/objective/heretic_research/New(text, heretic_research_tree) . = ..() if(!main_path_length) @@ -948,7 +1139,8 @@ // (All the main paths are (should be) the same length, so it doesn't matter.) var/rust_paths_found = 0 for(var/datum/heretic_knowledge/knowledge as anything in subtypesof(/datum/heretic_knowledge)) - if(GLOB.heretic_research_tree[knowledge][HKT_ROUTE] == PATH_RUST) + var/list/knowledge_data = heretic_research_tree[knowledge] + if(knowledge_data && knowledge_data[HKT_ROUTE] == PATH_RUST) rust_paths_found++ main_path_length = rust_paths_found diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 726e6247dc2..5300f6d1943 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -32,6 +32,8 @@ var/priority = 0 ///If this is considered starting knowledge, TRUE if yes var/is_starting_knowledge = FALSE + /// If the spell is final knowledge, disables blade breaking and removes the cap on how many blades we can make + var/is_final_knowledge = FALSE /// In case we want to override the default UI icon getter and plug in our own icon instead. /// if research_tree_icon_path is not null, research_tree_icon_state must also be specified or things may break var/research_tree_icon_path @@ -40,6 +42,23 @@ var/research_tree_icon_dir = SOUTH ///Determines what kind of monster ghosts will ignore from here on out. Defaults to POLL_IGNORE_HERETIC_MONSTER, but we define other types of monsters for more granularity. var/poll_ignore_define = POLL_IGNORE_HERETIC_MONSTER + /// This is used for the drafting system. By default is 0 (Meaning it won't show up in the draft), also makes it show up in the shop according to this tier + var/drafting_tier = 0 + /// decides if it's added to the shop, only, and not drafts + var/is_shop_only = FALSE + +/** + * Called before the knowledge is researched, + * use this for any checks that should happen before the knowledge is researched. + * Returns TRUE if the knowledge can be researched, FALSE otherwise. + */ +/datum/heretic_knowledge/proc/pre_research(mob/user, datum/antagonist/heretic/our_heretic) + // consider moving this check to a type instead + if(is_final_knowledge && !our_heretic.unlimited_blades) + var/choice = tgui_alert(user, "THIS WILL DISABLE BLADE BREAKING, Are you ready to research this? The blade cap will also be removed.", "Get Final Spell?", list("Yes", "No")) + if(choice != "Yes") + return FALSE + return TRUE /** Called when the knowledge is first researched. * This is only ever called once per heretic. @@ -54,6 +73,8 @@ if(gain_text) to_chat(user, span_warning("[gain_text]")) on_gain(user, our_heretic) + if(is_final_knowledge && !our_heretic.unlimited_blades) + our_heretic.disable_blade_breaking() /** * Called when the knowledge is applied to a mob. @@ -210,6 +231,11 @@ return ..() /datum/heretic_knowledge/limited_amount/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/our_heretic = IS_HERETIC(user) + if(our_heretic && our_heretic.unlimited_blades) + if(length(result_atoms & typesof(/obj/item/melee/sickly_blade))) + return TRUE + for(var/datum/weakref/ref as anything in created_items) var/atom/real_thing = ref.resolve() if(QDELETED(real_thing)) @@ -230,6 +256,7 @@ /** * A knowledge subtype for limited_amount knowledge * used for base knowledge (the ones that make blades) + * Grants your path-relevant grasp upgrade, passive and grasp mark * * A heretic can only learn one /starting type knowledge, * and their ascension depends on whichever they chose. @@ -239,38 +266,55 @@ limit = 2 cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 5 + /// The status effect typepath we apply on people on mansus grasp. + var/datum/status_effect/eldritch/mark_type + /// The status effect of our passive + var/datum/status_effect/heretic_passive/eldritch_passive = /datum/status_effect/heretic_passive /datum/heretic_knowledge/limited_amount/starting/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() - our_heretic.heretic_path = GLOB.heretic_research_tree[type][HKT_ROUTE] - SSblackbox.record_feedback("tally", "heretic_path_taken", 1, our_heretic.heretic_path) + for(var/datum/heretic_knowledge_tree_column/column_path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) + if(column_path::route != our_heretic.researched_knowledge[type][HKT_ROUTE]) + continue + our_heretic.heretic_path = new column_path() + if(!our_heretic.heretic_path) + // If we don't have a path, we can't continue. + to_chat(user, span_warning("Oh shit, something broke, no path found!")) + stack_trace("failed to find valid path [our_heretic.heretic_shops[HERETIC_KNOWLEDGE_TREE][type][HKT_ROUTE]] from researching [src]") + return + SSblackbox.record_feedback("tally", "heretic_path_taken", 1, our_heretic.heretic_path.route) + our_heretic.update_heretic_aura() + our_heretic.generate_heretic_research_tree() + determine_drafted_knowledge( + our_heretic.heretic_path.route, + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_TREE], + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_SHOP], + our_heretic.heretic_shops[HERETIC_KNOWLEDGE_DRAFT], + ) + SEND_SIGNAL(src, COMSIG_HERETIC_SHOP_SETUP) -/** - * A knowledge subtype for heretic knowledge - * that applies a mark on use. - * - * A heretic can only learn one /mark type knowledge. - */ -/datum/heretic_knowledge/mark - abstract_parent_type = /datum/heretic_knowledge/mark - cost = 2 - /// The status effect typepath we apply on people on mansus grasp. - var/datum/status_effect/eldritch/mark_type -/datum/heretic_knowledge/mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignals(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_LIONHUNTER_ON_HIT), PROC_REF(on_mansus_grasp)) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(eldritch_passive) -/datum/heretic_knowledge/mark/on_lose(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/on_lose(mob/user, datum/antagonist/heretic/our_heretic) UnregisterSignal(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_HERETIC_BLADE_ATTACK)) + if(isliving(user)) + var/mob/living/living_user = user + living_user.remove_status_effect(eldritch_passive) /** * Signal proc for [COMSIG_HERETIC_MANSUS_GRASP_ATTACK]. * * Whenever we cast mansus grasp on someone, apply our mark. */ -/datum/heretic_knowledge/mark/proc/on_mansus_grasp(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/on_mansus_grasp(mob/living/source, mob/living/target) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) create_mark(source, target) @@ -279,7 +323,7 @@ * * Whenever we attack someone with our blade, attempt to trigger any marks on them. */ -/datum/heretic_knowledge/mark/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) +/datum/heretic_knowledge/limited_amount/starting/proc/on_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) SIGNAL_HANDLER if(!isliving(target)) @@ -293,7 +337,7 @@ * * Can be overriden to set or pass in additional vars of the status effect. */ -/datum/heretic_knowledge/mark/proc/create_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/create_mark(mob/living/source, mob/living/target) if(target.stat == DEAD) return return target.apply_status_effect(mark_type) @@ -303,7 +347,7 @@ * * If there is no mark, returns FALSE. Returns TRUE if a mark was triggered. */ -/datum/heretic_knowledge/mark/proc/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/proc/trigger_mark(mob/living/source, mob/living/target) var/datum/status_effect/eldritch/mark = target.has_status_effect(/datum/status_effect/eldritch) if(!istype(mark)) return FALSE @@ -319,7 +363,7 @@ */ /datum/heretic_knowledge/blade_upgrade abstract_parent_type = /datum/heretic_knowledge/blade_upgrade - cost = 2 + cost = 1 /datum/heretic_knowledge/blade_upgrade/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) @@ -416,7 +460,6 @@ var/datum/antagonist/heretic_monster/heretic_monster = summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster) heretic_monster.set_owner(user.mind) - ADD_TRAIT(heretic_monster, TRAIT_HERETIC_SUMMON, INNATE_TRAIT) var/datum/objective/heretic_summon/summon_objective = locate() in user.mind.get_all_objectives() summon_objective?.num_summoned++ @@ -467,22 +510,18 @@ ) var/static/list/potential_uncommoner_items = list( - /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/melee/baton, /obj/item/circular_saw, /obj/item/scalpel, /obj/item/clothing/gloves/color/yellow, - /obj/item/melee/baton/security, /obj/item/clothing/glasses/sunglasses, ) required_atoms = list() - // 2 organs. Can be the same. + // 1 Organ, 1 Easy, 1 Hard required_atoms[pick(potential_organs)] += 1 - required_atoms[pick(potential_organs)] += 1 - // 2-3 random easy items. - required_atoms[pick(potential_easy_items)] += rand(2, 3) - // 1 uncommon item. + required_atoms[pick(potential_easy_items)] += 1 required_atoms[pick(potential_uncommoner_items)] += 1 /datum/heretic_knowledge/knowledge_ritual/on_research(mob/user, datum/antagonist/heretic/our_heretic) @@ -508,7 +547,7 @@ /datum/heretic_knowledge/knowledge_ritual/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) - our_heretic.knowledge_points += KNOWLEDGE_RITUAL_POINTS + our_heretic.adjust_knowledge_points(KNOWLEDGE_RITUAL_POINTS) was_completed = TRUE to_chat(user, span_boldnotice("[name] completed!")) @@ -516,6 +555,7 @@ desc += " (Completed!)" log_heretic_knowledge("[key_name(user)] completed a [name] at [gameTimestamp()].") user.add_mob_memory(/datum/memory/heretic_knowledge_ritual) + SEND_SIGNAL(our_heretic, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL) return TRUE #undef KNOWLEDGE_RITUAL_POINTS @@ -540,8 +580,9 @@ /datum/heretic_knowledge/ultimate/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() var/total_points = 0 - for(var/datum/heretic_knowledge/knowledge as anything in flatten_list(our_heretic.researched_knowledge)) - total_points += knowledge.cost + for(var/datum/heretic_knowledge/knowledge as anything in our_heretic.researched_knowledge) + var/list/cost = our_heretic.researched_knowledge[knowledge][HKT_COST] + total_points += cost log_heretic_knowledge("[key_name(user)] gained knowledge of their final ritual at [gameTimestamp()]. \ They have [length(our_heretic.researched_knowledge)] knowledge nodes researched, totalling [total_points] points \ @@ -551,7 +592,7 @@ if(invoker.ascended) return FALSE - if(!invoker.can_ascend()) + if(invoker.can_ascend() != HERETIC_CAN_ASCEND) return FALSE return TRUE @@ -578,8 +619,11 @@ return (sacrifice.stat == DEAD) && !ismonkey(sacrifice) /datum/heretic_knowledge/ultimate/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) heretic_datum.ascended = TRUE + // In case we skipped ritual of knowledge + SEND_SIGNAL(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL) // Show the cool red gradiant in our UI heretic_datum.update_static_data(user) @@ -589,7 +633,7 @@ human_user.physiology.brute_mod *= 0.5 human_user.physiology.burn_mod *= 0.5 - SSblackbox.record_feedback("tally", "heretic_ascended", 1, GLOB.heretic_research_tree[type][HKT_ROUTE]) + SSblackbox.record_feedback("tally", "heretic_ascended", 1, heretic_datum.heretic_path.route) log_heretic_knowledge("[key_name(user)] completed their final ritual at [gameTimestamp()].") notify_ghosts( "[user.real_name] has completed an ascension ritual!", @@ -603,9 +647,13 @@ color_override = "pink", ) + if(EMERGENCY_IDLE_OR_RECALLED) + SSshuttle.call_evac_shuttle("Critical reality rupture detected on supranatural casuality long-range scanners. Mass crew casualty and possible station destruction determined to be beyond acceptable probability. Priority evacuation shuttle dispatched.") + SSshuttle.emergency_no_recall = TRUE + if(!isnull(ascension_achievement)) user.client?.give_award(ascension_achievement, user) - heretic_datum.increase_rust_strength() + heretic_datum.rust_strength = 4 // Ascended heretics can rust whatever they want (below RUST_RESISTANCE_ABSOLUTE) ADD_TRAIT(user, TRAIT_DESENSITIZED, type) return TRUE diff --git a/code/modules/antagonists/heretic/heretic_monsters.dm b/code/modules/antagonists/heretic/heretic_monsters.dm index 53ca3b88aac..08215531b12 100644 --- a/code/modules/antagonists/heretic/heretic_monsters.dm +++ b/code/modules/antagonists/heretic/heretic_monsters.dm @@ -23,6 +23,16 @@ master = null return ..() +/datum/antagonist/heretic_monster/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/target = mob_override || owner.current + ADD_TRAIT(target, TRAIT_HERETIC_SUMMON, REF(src)) + +/datum/antagonist/heretic_monster/remove_innate_effects(mob/living/mob_override) + var/mob/living/target = mob_override || owner.current + REMOVE_TRAIT(target, TRAIT_HERETIC_SUMMON, REF(src)) + return ..() + /* * Set our [master] var to a new mind. */ diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 42aafd03aad..20ee32f1a46 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -175,6 +175,8 @@ var/being_drained = FALSE /// The icon state applied to the image created for this influence. var/real_icon_state = "reality_smash" + /// Proximity monitor that gives any nearby heretics x-ray vision + var/datum/proximity_monitor/influence_monitor/monitor /obj/effect/heretic_influence/Initialize(mapload) . = ..() @@ -187,12 +189,14 @@ AddElement(/datum/element/block_turf_fingerprints) AddComponent(/datum/component/redirect_attack_hand_from_turf, interact_check = CALLBACK(src, PROC_REF(verify_user_can_see))) AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[/datum/fish_source/dimensional_rift]) + monitor = new(src, 7) /obj/effect/heretic_influence/proc/verify_user_can_see(mob/user) return (user.mind in GLOB.reality_smash_track.tracked_heretics) /obj/effect/heretic_influence/Destroy() GLOB.reality_smash_track.smashes -= src + QDEL_NULL(monitor) return ..() /obj/effect/heretic_influence/attack_hand_secondary(mob/user, list/modifiers) @@ -229,21 +233,29 @@ * * If successful, the influence is drained and deleted. */ -/obj/effect/heretic_influence/proc/drain_influence(mob/living/user, knowledge_to_gain, drain_speed = 10 SECONDS) +/obj/effect/heretic_influence/proc/drain_influence(mob/living/user, knowledge_to_gain, drain_speed = HERETIC_RIFT_DEFAULT_DRAIN_SPEED) being_drained = TRUE loc.balloon_alert(user, "draining influence...") + // Only gives you the dripping eye effect if you have faster drain speed than default + var/mutable_appearance/draining_overlay = mutable_appearance('icons/mob/effects/heretic_aura.dmi', "heretic_eye_dripping") + if(drain_speed < HERETIC_RIFT_DEFAULT_DRAIN_SPEED) + draining_overlay.pixel_y = 16 + user.add_overlay(draining_overlay) + if(!do_after(user, drain_speed, src, hidden = TRUE)) being_drained = FALSE loc.balloon_alert(user, "interrupted!") + user.cut_overlay(draining_overlay) return // We don't need to set being_drained back since we delete after anyways loc.balloon_alert(user, "influence drained") + user.cut_overlay(draining_overlay) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - heretic_datum.knowledge_points += knowledge_to_gain + heretic_datum.adjust_knowledge_points(knowledge_to_gain) // Aaand now we delete it after_drain(user) @@ -274,3 +286,19 @@ /datum/atom_hud/alternate_appearance/basic/has_antagonist/heretic antag_datum_type = /datum/antagonist/heretic add_ghost_version = TRUE + +/datum/proximity_monitor/influence_monitor + /// Cooldown before we can give another heretic xray + COOLDOWN_DECLARE(xray_cooldown) + +/datum/proximity_monitor/influence_monitor/on_entered(atom/source, atom/movable/arrived, turf/old_loc) + . = ..() + if(!isliving(arrived)) + return + if(!COOLDOWN_FINISHED(src, xray_cooldown)) + return + var/mob/living/arrived_living = arrived + if(!IS_HERETIC(arrived_living)) + return + arrived_living.apply_status_effect(/datum/status_effect/temporary_xray/eldritch) + COOLDOWN_START(src, xray_cooldown, 3 MINUTES) diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index 101da331241..02adc82d9fa 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -26,12 +26,13 @@ return NONE if(!isliving(target)) return NONE + user.changeNext_move(CLICK_CD_MELEE) var/mob/living/living_target = target + if(living_target == user) + return ITEM_INTERACT_BLOCKING if(reagents.total_volume >= reagents.maximum_volume) to_chat(user, span_notice("[src] is full.")) return ITEM_INTERACT_BLOCKING - if(living_target == user) - return ITEM_INTERACT_BLOCKING if(living_target.can_block_magic(MAGIC_RESISTANCE_HOLY)) to_chat(user, span_warning("You are unable to draw any blood from [living_target]!")) COOLDOWN_START(src, drain_cooldown, 5 SECONDS) diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index f42670b4cc8..c8b1b6f2737 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -44,7 +44,7 @@ return if(IS_HERETIC(viewer)) return - if(viewer.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(viewer.can_block_magic(MAGIC_RESISTANCE_MOON)) return if(viewer.reagents.has_reagent(/datum/reagent/water/holywater)) return @@ -54,7 +54,7 @@ to_chat(viewer, span_hypnophrase("Your mind is overcome! The painting leaves a mark on your psyche.")) /obj/structure/sign/painting/eldritch/wirecutter_act(mob/living/user, obj/item/I) - if(!user.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(!user.can_block_magic(MAGIC_RESISTANCE_MOON)) user.add_mood_event("ripped_eldritch_painting", /datum/mood_event/eldritch_painting) to_chat(user, span_hypnophrase("There's an itch in your brain. It's laughing at you...")) qdel(src) diff --git a/code/modules/antagonists/heretic/items/forbidden_book.dm b/code/modules/antagonists/heretic/items/forbidden_book.dm index d3c22d7b687..184bc088bb3 100644 --- a/code/modules/antagonists/heretic/items/forbidden_book.dm +++ b/code/modules/antagonists/heretic/items/forbidden_book.dm @@ -11,7 +11,7 @@ /// Helps determine the icon state of this item when it's used on self. var/book_open = FALSE /// How fast we can drain influences - var/drain_speed = 10 SECONDS + var/drain_speed = 5 SECONDS /// How fast we can draw runes var/draw_speed = 8 SECONDS @@ -79,7 +79,7 @@ desc = "A hideous, ragged book covered in separately-blinking eyes, all of them staring at you. You have no idea how to hold this thing, and to be honest you're not sure if you want to." base_icon_state = "book_morbus" icon_state = "book_morbus" - drain_speed = 7 SECONDS + drain_speed = 2.5 SECONDS draw_speed = 5 SECONDS /// List of mobs we've cursed with transmutation. When the codex is destroyed all those curses become undone var/list/transmuted_victims = list() diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 027f3fc2cf7..85e1dbf8ae2 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -1,42 +1,55 @@ +/*! + * Contains the eldritch robes for heretics, a suit of armor that they can make via a ritual + */ + // Eldritch armor. Looks cool, hood lets you cast heretic spells. -/obj/item/clothing/head/hooded/cult_hoodie/eldritch - name = "ominous hood" - icon = 'icons/obj/clothing/head/helmet.dmi' - worn_icon = 'icons/mob/clothing/head/helmet.dmi' - icon_state = "eldritch" - desc = "A torn, dust-caked hood. Strange eyes line the inside." - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - flash_protect = FLASH_PROTECTION_WELDER - -/obj/item/clothing/head/hooded/cult_hoodie/eldritch/Initialize(mapload) - . = ..() - AddElement(/datum/element/heretic_focus) - /obj/item/clothing/suit/hooded/cultrobes/eldritch name = "ominous armor" desc = "A ragged, dusty set of robes. Strange eyes line the inside." icon_state = "eldritch_armor" inhand_icon_state = null - flags_inv = HIDESHOES|HIDEJUMPSUIT - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS + flags_inv = HIDESHOES | HIDEJUMPSUIT | HIDEBELT + body_parts_covered = CHEST | GROIN | LEGS | FEET | ARMS + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION + transparent_protection = HIDEGLOVES | HIDESUITSTORAGE | HIDEJUMPSUIT | HIDESHOES | HIDENECK + cold_protection = FULL_BODY + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT allowed = list(/obj/item/melee/sickly_blade, /obj/item/gun/ballistic/rifle/lionhunter) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch - // Slightly better than normal cult robes - armor_type = /datum/armor/cultrobes_eldritch + armor_type = /datum/armor/eldritch_armor + clothing_traits = list(TRAIT_HERETIC_AURA_HIDDEN) /// Whether the hood is flipped up var/hood_up = FALSE -/datum/armor/cultrobes_eldritch - melee = 50 - bullet = 50 - laser = 50 - energy = 50 - bomb = 35 - bio = 20 - fire = 20 - acid = 20 - wound = 20 +/obj/item/clothing/suit/hooded/cultrobes/eldritch/equipped(mob/user, slot, initial) + . = ..() + if(!(slot_flags & slot)) + return + if(!IS_HERETIC(user)) + robes_side_effect(user) + return + // Heretic equipped the robes? Grant them the effects + on_robes_gained(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/dropped(mob/living/user) + . = ..() + on_robes_lost(user) + +/// Adds effects to the user when they equip their robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/on_robes_gained(mob/living/user) + return + +/// Removes any effects that our robes have, returns `TRUE` if the item dropped was not robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/on_robes_lost(mob/living/user) + return + +/// Applies a punishment to the user when the robes are equipped +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/robes_side_effect(mob/living/user) + SHOULD_NOT_SLEEP(TRUE) // sleep here would fuck over the timing + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/proc/is_equipped(mob/wearer) + return wearer.get_slot_by_item(src) & slot_flags /obj/item/clothing/suit/hooded/cultrobes/eldritch/on_hood_up(obj/item/clothing/head/hooded/hood) hood_up = TRUE @@ -54,6 +67,1000 @@ // Our hood gains the heretic_focus element. . += span_notice("Allows you to cast heretic spells while the hood is up.") +/obj/item/clothing/head/hooded/cult_hoodie/eldritch + name = "ominous hood" + icon = 'icons/obj/clothing/head/helmet.dmi' + worn_icon = 'icons/mob/clothing/head/helmet.dmi' + icon_state = "eldritch" + desc = "A torn, dust-caked hood. Strange eyes line the inside." + flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE | HIDEHAIR | HIDEFACIALHAIR | HIDESNOUT + flags_cover = HEADCOVERSEYES | PEPPERPROOF + flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | SNUG_FIT + armor_type = /datum/armor/eldritch_armor + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/Initialize(mapload) + . = ..() + AddElement(/datum/element/heretic_focus) + +/datum/armor/eldritch_armor + melee = 50 + bullet = 50 + laser = 50 + energy = 50 + bomb = 35 + bio = 20 + fire = 20 + acid = 20 + wound = 20 + +//---- Path-Specific Eldritch Robes, First is robes, then is hood + +// Ash +// Prevents fire from decaying while worn, also passively generates fire via the toggle +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash + name = "\improper Scorched Mantle" + desc = "Left to burn to tatters, what remains is naught but a blackened echo of the mantle of the Watch. \ + Yet the soot-choked folds turn blade and flame from the form within. A brief reprieve before its gaze turns inwards." + icon_state = "ash_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/ash + armor_type = /datum/armor/eldritch_armor/ash + flags_inv = HIDEBELT + body_parts_covered = FULL_BODY + heat_protection = FULL_BODY + max_heat_protection_temperature = 50000 + cold_protection = FULL_BODY + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | LAVA_PROOF | FREEZE_PROOF + actions_types = list(/datum/action/item_action/toggle/flames) + /// If our robes are actively generating flames + var/flame_generation = FALSE + /// Cooldown before our robes will create new flames + COOLDOWN_DECLARE(flame_creation) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/on_robes_gained(mob/living/user) + if(!isliving(user)) + return + var/mob/living/wearer = user + wearer.fire_stack_decay_rate = 0 + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/on_robes_lost(mob/living/user) + if(!isliving(user)) + return + var/mob/living/wearer = user + wearer.fire_stack_decay_rate = initial(wearer.fire_stack_decay_rate) + if(flame_generation) + toggle_flames(wearer) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/iteration = 0 + for(var/obj/item/bodypart/limb as anything in victim.bodyparts) + if(istype(limb, /obj/item/bodypart/head) || istype(limb, /obj/item/bodypart/chest)) + continue + iteration++ + addtimer(CALLBACK(src, PROC_REF(burn_limbs), limb), 1 SECONDS * iteration) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/proc/burn_limbs(obj/item/bodypart/limb) + if(QDELETED(limb) || !limb.owner || !is_equipped(limb.owner)) + return + limb.dismember(BURN) + +/datum/action/item_action/toggle/flames + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "fireball" + +/datum/action/item_action/toggle/flames/do_effect(trigger_flags) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/item_target = target + if(!item_target || !istype(item_target)) + return FALSE + item_target.toggle_flames(owner) + +/// Starts/Stops the passive generation of fire stacks on our wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/proc/toggle_flames(mob/living/user) + flame_generation = !flame_generation + + if(flame_generation) + START_PROCESSING(SSobj, src) + else + user.extinguish() + STOP_PROCESSING(SSobj, src) + + user.balloon_alert(user, flame_generation ? "enabled" : "disabled") + user.fire_stack_decay_rate = flame_generation ? 0 : initial(user.fire_stack_decay_rate) + // Extinguishes the wearer after they disable the flames + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, flame_creation)) + return + var/mob/living/wearer = loc + if(!isliving(wearer)) + STOP_PROCESSING(SSobj, src) + flame_generation = FALSE + return + COOLDOWN_START(src, flame_creation, 5 SECONDS) + wearer.adjust_fire_stacks(1) + wearer.ignite_mob(TRUE) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/ash + name = "\improper Scorched Mantle" + desc = "Left to burn to tatters, what remains is naught but a blackened echo of the mantle of the Watch. \ + Yet the soot-choked folds turn blade and flame from the form within. A brief reprieve before its gaze turns inwards." + icon_state = "ash_armor" + armor_type = /datum/armor/eldritch_armor/ash + +/datum/armor/eldritch_armor/ash + melee = 40 + bullet = 60 + laser = 50 + energy = 50 + bomb = 100 + bio = 20 + fire = 100 + acid = 20 + wound = 20 + +// Blade +// Is shock-proof and gives you baton resistance +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade + name = "\improper Shattered Panoply" + desc = "The sharpened edges of this ancient suit of armor assert a revelation known to aspirants of battle; \ + a true warrior can not be distinguished from the blade they wield." + icon_state = "blade_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade + armor_type = /datum/armor/eldritch_armor/blade + siemens_coefficient = 0 + var/murdering_with_blades = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/on_robes_gained(mob/living/user) + . = ..() + user.add_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(.) + return + user.remove_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/robes_side_effect(mob/living/user) + INVOKE_ASYNC(src, PROC_REF(start_throwing_blades), user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/start_throwing_blades(mob/living/target) + if(murdering_with_blades) + return + murdering_with_blades = TRUE + + var/delay = 2 SECONDS + var/knives = 100 + for(var/knife in 1 to knives) + if(!should_keep_cutting(target)) + break + addtimer(CALLBACK(src, PROC_REF(cut_em_good), target), delay * knife) + delay = max(0.5 SECONDS, delay - 0.1 SECONDS) + + murdering_with_blades = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/should_keep_cutting(mob/living/target) + if(target.stat == DEAD || !is_equipped(target)) + return FALSE + return TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/cut_em_good(mob/living/target) + if(!should_keep_cutting(target)) + return + var/list/turf/valid_turfs = get_blade_turfs(get_turf(target)) + if(!length(valid_turfs)) + var/mob/living/carbon/carbon_target = target + if(iscarbon(target)) + var/obj/item/bodypart/limb = pick(carbon_target.bodyparts) + limb.force_wound_upwards(/datum/wound/slash/flesh/severe) + return + throw_blade(pick(valid_turfs), target) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/get_blade_turfs(mob/user) + var/list/turfs_around_us = get_perimeter(user, 4) + var/list/valid_turfs = list() + for(var/turf/open/valid_turf in turfs_around_us) + if(!valid_turf.is_blocked_turf() && get_angle(valid_turf, user) != 180) + valid_turfs |= valid_turf + return valid_turfs + +/obj/item/knife/kitchen/magic + icon = 'icons/effects/eldritch.dmi' + icon_state = "dio_knife" + name = "magic knife" + throwforce = 15 + // most importantly, this ignores shields + armour_penetration = 200 + pass_flags = ALL + +/obj/item/knife/kitchen/magic/Initialize(mapload) + . = ..() + AddElement(/datum/element/movetype_handler) + add_traits(list(TRAIT_MOVE_PHASING, TRAIT_MOVE_FLOATING, TRAIT_UNCATCHABLE), INNATE_TRAIT) + add_filter("dio_knife", 2, list("type" = "outline", "color" = "#ececff", "size" = 1)) + set_embed(/datum/embedding/magic_knife) + +/obj/item/knife/kitchen/magic/get_demolition_modifier(obj/target) + if(!ismob(target)) + return 100 + return ..() + +/datum/embedding/magic_knife + + embed_chance = 150 + fall_chance = 0 + impact_pain_mult = 0 + ignore_throwspeed_threshold = TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade/proc/throw_blade(turf/target_turf, mob/user) + var/obj/item/knife/kitchen/magic/knife = new(target_turf) + knife.alpha = 0 + knife.throw_at() + + var/matrix/transform = matrix(knife.transform) + var/angle = get_angle(target_turf, user) + transform.Turn(angle) + var/appear_delay = 0.5 SECONDS + var/throw_delay = 1 SECONDS + var/delete_delay = 10 SECONDS + addtimer(CALLBACK(knife, TYPE_PROC_REF(/atom/movable, throw_at), user, 50, 5, null, FALSE), throw_delay) + animate(knife, transform = transform, time = throw_delay, ANIMATION_PARALLEL) + animate(knife, alpha = 255, time = appear_delay, ANIMATION_PARALLEL) + animate(alpha = 0, time = delete_delay) + QDEL_IN(knife, delete_delay + appear_delay + throw_delay) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/blade + name = "\improper Shattered Panoply" + desc = "The sharpened edges of this ancient suit of armor assert a revelation known to aspirants of battle; \ + a true warrior can not be distinguished from the blade they wield." + icon_state = "blade_armor" + armor_type = /datum/armor/eldritch_armor/blade + siemens_coefficient = 0 + +/datum/armor/eldritch_armor/blade + melee = 50 + bullet = 50 + laser = 50 + energy = 50 + bomb = 50 + bio = 50 + fire = 50 + acid = 50 + wound = 50 + +// Cosmic +// Allows you to toggle gravity for yourself at will +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic + name = "\improper Starwoven Cloak" + desc = "Gleaming gems conjure forth wisps of power, turning about to illuminate the wearer in a dim radiance. \ + Gazing upon the robe, you cannot help but feel noticed." + icon_state = "cosmic_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic + armor_type = /datum/armor/eldritch_armor/cosmic + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | STOPSPRESSUREDAMAGE + cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + actions_types = list(/datum/action/item_action/toggle/gravity) + /// If our robes are making us weightless + var/weightless_enabled = FALSE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +// Removes your antigravity if you lose the robes +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + if(.) + return + if(weightless_enabled) + toggle_gravity(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/robes_side_effect(mob/living/user) + var/obj/item/organ/brain/victim_brain = user.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!victim_brain) + return + + victim_brain.gain_trauma(/datum/brain_trauma/magic/stalker/cosmic, TRAUMA_RESILIENCE_MAGIC) + +/datum/action/item_action/toggle/gravity + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "magicm" + +/datum/action/item_action/toggle/gravity/do_effect(trigger_flags) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/item_target = target + if(!item_target || !istype(item_target)) + return FALSE + item_target.toggle_gravity(owner) + +/// Gives us free movement in 0 gravity when enabled +/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic/proc/toggle_gravity(mob/living/user) + if(!weightless_enabled) + user.add_traits(list(TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), REF(src)) + user.balloon_alert(user, "enabled") + else + user.remove_traits(list(TRAIT_NEGATES_GRAVITY, TRAIT_MOVE_FLYING, TRAIT_FREE_HYPERSPACE_MOVEMENT), REF(src)) + user.balloon_alert(user, "disabled") + weightless_enabled = !weightless_enabled + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic + name = "\improper Starwoven Hood" + desc = "Gleaming gems conjure forth wisps of power, turning about to illuminate the wearer in a dim radiance. \ + Gazing upon the robe, you cannot help but feel noticed." + icon_state = "cosmic_armor" + armor_type = /datum/armor/eldritch_armor/cosmic + clothing_flags = THICKMATERIAL | PLASMAMAN_PREVENT_IGNITION | STOPSPRESSUREDAMAGE + cold_protection = HEAD + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/cosmic/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/datum/armor/eldritch_armor/cosmic + melee = 20 + bullet = 30 + laser = 60 + energy = 60 + bomb = 35 + bio = 20 + fire = 20 + acid = 20 + wound = 20 + +// Flesh +// Emits a healing aura that affects any heretic summons (excluding the heretic himself) +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh + name = "Writhing Embrace" + desc = "A rotten carcass, or perhaps several, twisted into fleshy polyps, knotted intestines and cracked bone. \ + How one 'wears' this baffles reasonable understanding. It moves when it believes itself unobserved." + icon_state = "flesh_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh + armor_type = /datum/armor/eldritch_armor/flesh + /// The aura healing component. Used to delete it when taken off. + var/datum/component/healing_aura + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/on_robes_gained(mob/living/user) + healing_aura = user.AddComponent( \ + /datum/component/aura_healing, \ + range = 15, \ + brute_heal = 3, \ + burn_heal = 3, \ + blood_heal = 3, \ + suffocation_heal = 3, \ + stamina_heal = 15, \ + simple_heal = 3, \ + requires_visibility = FALSE, \ + limit_to_trait = TRAIT_HERETIC_SUMMON, \ + healing_color = COLOR_RED, \ + self_heal = FALSE, \ + ) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + QDEL_NULL(healing_aura) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/iteration = 0 + for(var/obj/item/bodypart/limb as anything in victim.bodyparts) + iteration++ + addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart, force_wound_upwards), /datum/wound/slash/flesh/critical), 1 SECONDS * iteration) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/flesh + icon_state = "flesh_armor" + armor_type = /datum/armor/eldritch_armor/flesh + clothing_traits = list(TRAIT_MEDICAL_HUD) + +/datum/armor/eldritch_armor/flesh + melee = 70 + bullet = 40 + laser = 30 + energy = 30 + bomb = 35 + bio = 100 + fire = 0 + acid = 100 + wound = 20 + +// Lock +// Gives you digital camo, silences your footsteps and makes you un-examineable +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock + name = "Shifting Guise" + icon_state = "lock_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock + armor_type = /datum/armor/eldritch_armor/lock + flags_inv = parent_type::flags_inv | HIDEMUTWINGS + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/on_robes_gained(mob/living/user) + user.AddElement(/datum/element/digitalcamo) + user.add_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN_APPEARANCE, TRAIT_UNKNOWN_VOICE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + user.RemoveElement(/datum/element/digitalcamo) + user.remove_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_UNKNOWN_APPEARANCE, TRAIT_UNKNOWN_VOICE), REF(src)) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock/robes_side_effect(mob/living/user) + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/list/things = victim.get_equipped_items(ALL) + var/turf/our_turf = get_turf(victim) + var/list/turf/nearby_turfs = RANGE_TURFS(5, our_turf) - our_turf + for(var/obj/item/to_throw in things) + if(user.dropItemToGround(to_throw)) + to_throw.safe_throw_at(pick(nearby_turfs), 2, 1, spin = TRUE) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/lock + icon_state = "lock_armor" + armor_type = /datum/armor/eldritch_armor/lock + +/datum/armor/eldritch_armor/lock + melee = 40 + bullet = 40 + laser = 40 + energy = 40 + bomb = 40 + bio = 40 + fire = 40 + acid = 40 + wound = 40 + +// Moon +// Converts all damage into brain damage, nullifying the attack in the process +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon + name = "\improper Resplendant Regalia" + desc = "The confounding nature of this opulent garb turns and twists the sight. \ + The viewer must come to a chilling revelation; \ + what they see is as true as any other face." + icon_state = "moon_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/moon + armor_type = /datum/armor/eldritch_armor/moon + flags_inv = HIDESHOES | HIDEJUMPSUIT | HIDEMUTWINGS + clothing_traits = list( + TRAIT_HERETIC_AURA_HIDDEN, + TRAIT_BATON_RESISTANCE, + TRAIT_STUNIMMUNE, + TRAIT_NEVER_WOUNDED, + TRAIT_PACIFISM, + TRAIT_NOHUNGER + ) + /// Hud that gets shown to the wearer, gives a rough estimate of their current brain damage + var/atom/movable/screen/moon_health/health_hud + /// Boolean if you are brain dead so the sound doesn't spam during the delay + var/braindead = FALSE + //---- Messages that get sent when someone wearing the moon robes is attacked + /// Visible message that nearby people see + var/static/list/visible_message_list = list( + "%USER seems to hardly register that they have been harmed by %ATTACKER, not even flinching naturally.", + "Though wounded, %USER seems oblivious to %ATTACKER.", + "You hear %USER laughing. But they have not made a single sound, even when struck by %ATTACKER.", + ) + /// Message sent to the wearer who got attacked + var/static/list/self_message_list = list( + "Your body ripples as still water freshly disturbed. The sensation is exquisite, and you have %ATTACKER to thank.", + "A bell tolls. %ATTACKER has struck the hour and you tick to that tune.", + //"You are needed in [area name]. You need to be there. %ATTACKER might want you to stay, but you are needed in [area name].", + //"You see %ATTACKER strike a [name of animal]. The face of the beast is a mirror of your own. How strange.", + "%ATTACKER bumps you and you spill your tea. It's fine. You've plenty of cups.", + "You hear a roaring crash. The waves hit the boat. The is sea vast and dark. You see %ATTACKER striking the water, cursing its master.", + "Sequins scatter into the air around %ATTACKER. The sequins...", + "You notice that a button has popped off your collar. How did that happen? Maybe %ATTACKER is to blame.", + "%ATTACKER isn't very funny, and you're struggling to see the punchline.", + ) + /// Message sent to blind people nearby + var/static/list/blind_message_list = list( + "You hear echoing laughter.", + "You hear a distance chorus.", + "You hear the sound of bells and whistles.", + "You hear the clack of a tambourine.", + ) + /// List of all signals registered, used for cleanup + var/signal_registered = list() + /// damage modifier to all incoming damage, which is also converted to brain damage + var/damage_modifier = 1.15 + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/equipped(mob/user, slot, initial) + . = ..() + if(!ishuman(user) || !(slot_flags & slot)) + return + var/mob/living/carbon/human/human_user = user + // Gives the hud to the wearer, if there's no hud, register the signal to be given on creation + if(human_user.hud_used) + on_hud_created(human_user) + else + RegisterSignal(human_user, COMSIG_MOB_HUD_CREATED, PROC_REF(on_hud_created)) + signal_registered += COMSIG_MOB_HUD_CREATED + + human_user.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/equipment_speedmod) + RegisterSignal(human_user, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(on_apply_modifiers)) + signal_registered += COMSIG_MOB_APPLY_DAMAGE_MODIFIERS + + RegisterSignal(human_user, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + signal_registered += COMSIG_LIVING_DEATH + + RegisterSignal(human_user, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, PROC_REF(item_attack_response)) + signal_registered += COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON + + var/obj/item/organ/brain/our_brain = human_user.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return + ADD_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/dropped(mob/living/user) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/wearer = user + UnregisterSignal(wearer, signal_registered) + signal_registered = list() + + wearer.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/equipment_speedmod) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + braindead = FALSE + if(health_hud in user.hud_used.infodisplay) + on_hud_remove(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_apply_modifiers(mob/living/user, damage_mods, damage, damagetype, def_zone, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + if(braindead) + return + damage_mods += 0 + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage * damage_modifier) + check_braindeath(user) + +/// Gives the health HUD to the wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_hud_created(mob/living/carbon/human/wearer) + SIGNAL_HANDLER + var/datum/hud/original_hud = wearer.hud_used + // Remove the old health elements + var/list/to_remove = list(/atom/movable/screen/stamina, /atom/movable/screen/healths, /atom/movable/screen/healthdoll/human) + for(var/removing in original_hud.infodisplay) + if(is_type_in_list(removing, to_remove)) + original_hud.infodisplay -= removing + QDEL_NULL(removing) + + wearer.mob_mood.unmodify_hud() + // Add the moon health hud element + health_hud = new(null, original_hud) + original_hud.infodisplay += health_hud + original_hud.show_hud(original_hud.hud_version) + UnregisterSignal(wearer, COMSIG_MOB_HUD_CREATED) + signal_registered -= COMSIG_MOB_HUD_CREATED + +/// Removes the HUD element from the wearer +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_hud_remove(mob/living/carbon/human/wearer) + var/datum/hud/original_hud = wearer.hud_used + original_hud.infodisplay -= health_hud + QDEL_NULL(health_hud) + // Restore the old health elements + var/atom/movable/screen/stamina/stamina_hud = new(null, original_hud) + var/atom/movable/screen/healths/old_health_hud = new(null, original_hud) + var/atom/movable/screen/healthdoll/human/health_doll_hud = new(null, original_hud) + original_hud.infodisplay += stamina_hud + original_hud.infodisplay += old_health_hud + original_hud.infodisplay += health_doll_hud + wearer.mob_mood.modify_hud() + original_hud.show_hud(original_hud.hud_version) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/can_mob_unequip(mob/user) + if(!ishuman(user)) + return ..() + var/mob/living/carbon/human/wearer = user + if(wearer.get_organ_loss(ORGAN_SLOT_BRAIN) > 0) + wearer.balloon_alert(user, "can't strip, brain damaged!") + return FALSE + return ..() + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/item_attack_response(mob/living/victim, obj/item/weapon, mob/living/attacker) + SIGNAL_HANDLER + var/visible_message = pick(visible_message_list) + visible_message = replacetext(visible_message, "%USER", victim.get_visible_name()) + visible_message = replacetext(visible_message, "%ATTACKER", attacker.get_visible_name()) + + var/self_message = pick(self_message_list) + self_message = replacetext(self_message_list, "%ATTACKER", attacker.get_visible_name()) + + var/blind_message = pick(blind_message_list) + victim.visible_message(span_danger(visible_message), span_userdanger(self_message), span_danger(blind_message)) + return SIGNAL_MESSAGE_MODIFIED + +/// Once you reach this point you're completely brain dead, so lets play our effects before you eat shit +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/kill_wearer(mob/living/carbon/human/wearer) + if(IS_HERETIC(wearer)) + var/datum/action/cooldown/spell/aoe/moon_ringleader/temp_spell = new(wearer) + temp_spell.cast(wearer) + qdel(temp_spell) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_DAMAGE_NODEATH, REF(src)) + wearer.death() + +/// Blows up your head when you die +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/on_death(mob/wearer) + SIGNAL_HANDLER + if(!ishuman(wearer)) + return + var/mob/living/carbon/human/human_wearer = wearer + var/obj/item/bodypart/head/to_explode = human_wearer.get_bodypart(BODY_ZONE_HEAD) + if(!to_explode) + return + human_wearer.visible_message(span_warning("[human_wearer]'s head splatters with a sickening crunch!"), ignored_mobs = list(human_wearer)) + new /obj/effect/gibspawner/generic(get_turf(human_wearer), human_wearer) + to_explode.dismember(dam_type = BRUTE, silent = TRUE) + to_explode.drop_organs() + qdel(to_explode) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/process(seconds_per_tick) + var/mob/living/carbon/human/wearer = loc + if(!istype(wearer) || wearer.wear_suit != src || wearer.stat == DEAD) + return ..() + if(!IS_HERETIC_OR_MONSTER(wearer)) + wearer.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) + var/brain_damage = wearer.get_organ_loss(ORGAN_SLOT_BRAIN) + var/emote_rng = 0 + var/list/emote_list = list() + switch(brain_damage) + if(0) + emote_rng = 0 + emote_list = list() + if(1 to 30) + emote_rng = 20 + emote_list = list("laugh") + if(31 to 60) + emote_rng = 40 + emote_list = list("laugh", "smile") + if(61 to 100) + emote_rng = 60 + emote_list = list("laugh", "smile", "cough") + if(101 to 150) + emote_rng = 80 + emote_list = list("laugh", "smile", "cough", "gasp") + if(151 to 200) + emote_rng = 100 + emote_list = list("laugh", "smile", "cough", "gasp", "scream") + if(!prob(emote_rng)) + return + for(var/perform in emote_list) + wearer.emote("[perform]") + check_braindeath(wearer) + +/// Checks if you are brain dead, starts the dying process once you've reached it +/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/proc/check_braindeath(mob/living/carbon/human/wearer) + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + if(braindead || our_brain.damage < our_brain.maxHealth) + return + + braindead = TRUE + wearer.setOrganLoss(ORGAN_SLOT_BRAIN, INFINITY) + playsound(wearer, 'sound/effects/pope_entry.ogg', 50) + to_chat(wearer, span_bold(span_hypnophrase("A terrible fate has befallen you."))) + addtimer(CALLBACK(src, PROC_REF(kill_wearer), wearer), 5 SECONDS) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/moon + name = "\improper Resplendant Hood" + icon_state = "moon_armor" + armor_type = /datum/armor/eldritch_armor/moon + +/datum/armor/eldritch_armor/moon + melee = 0 + bullet = 0 + laser = 0 + energy = 0 + bomb = 0 + bio = 0 + fire = 0 + acid = 0 + wound = 0 + +/atom/movable/screen/moon_health + name = "Health Level" + icon = 'icons/hud/moon_health_64x64.dmi' + icon_state = "moon_hud_1" + base_icon_state = "moon_hud" + screen_loc = "EAST-1:0, SOUTH+6:16" + +/atom/movable/screen/moon_health/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(isnull(hud_owner) || !ishuman(hud_owner.mymob)) + return INITIALIZE_HINT_QDEL + var/mob/living/carbon/human/wearer = hud_owner.mymob + var/obj/item/organ/brain/our_brain = wearer.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return INITIALIZE_HINT_QDEL + update_health(our_brain) + RegisterSignal(our_brain, COMSIG_ORGAN_ADJUST_DAMAGE, PROC_REF(update_health)) + +/// Changes the icon based on the brain health of the wearer +/atom/movable/screen/moon_health/proc/update_health(obj/item/organ/brain, damage_amount, maximum, required_organ_flag) + SIGNAL_HANDLER + if(!brain.owner || !ishuman(brain.owner)) + qdel(src) + return + var/mob/living/carbon/human/wearer = brain.owner + if(istype(wearer.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/moon)) + var/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon/robes = wearer.wear_suit + if(robes.braindead) + icon_state = base_icon_state + "_6" + return // Don't update the icon once our "dying" process has begun + switch(brain.damage) + if(0 to 20) + icon_state = base_icon_state + "_1" + if(21 to 50) + icon_state = base_icon_state + "_2" + if(51 to 100) + icon_state = base_icon_state + "_3" + if(101 to 150) + icon_state = base_icon_state + "_4" + if(151 to 189) + icon_state = base_icon_state + "_5" + if(190 to INFINITY) + icon_state = base_icon_state + "_6" + +// Rust +// Gains more armor while standing on top of rust. Has an animated overlay +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust + name = "\improper Salvaged Remains" + desc = "Touching the folds of this plain robe seem to fill you with unease. \ + Even looking fills you with a sense of vertigo. \ + Some pulse threatening to pull you within." + icon_state = "rust_armor" + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust + armor_type = /datum/armor/eldritch_armor/rust + /// Grace period timer before the + COOLDOWN_DECLARE(rust_grace_period) + /// If our armor is rusted, used to update the sprite + var/rusted = FALSE + /// Atom used to animate our overlay + var/atom/movable/rust_overlay + /// The mutable that is actually overlayed on the mob + var/mutable_appearance/rust_appearance + /// identifier for the overlay + var/static/overlay_id = 0 + /// Overlay for the armor object + var/image/object_overlay + /// Overlay for the hood object + var/image/hood_object_overlay + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/Initialize(mapload) + . = ..() + overlay_id++ + if(!object_overlay) + object_overlay = image(icon, icon_state = "rust_armor_overlay") + if(!hood_object_overlay) + hood_object_overlay = image('icons/obj/clothing/head/helmet.dmi', icon_state = "rust_armor_overlay") + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/on_robes_gained(mob/living/user) + . = ..() + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + rust_overlay = new() + rust_overlay.icon = 'icons/mob/clothing/suits/armor.dmi' + rust_overlay.render_target = "*rust_overlay_[overlay_id]" + rust_overlay.vis_flags |= VIS_INHERIT_DIR | VIS_INHERIT_LAYER | VIS_INHERIT_ID + user.vis_contents += rust_overlay // Should be invisible, we just update the sprite as needed + + rust_appearance = new /mutable_appearance() + rust_appearance.render_source = "*rust_overlay_[overlay_id]" + update_appearance(UPDATE_ICON) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(.) + return + UnregisterSignal(user, list(COMSIG_MOVABLE_MOVED)) + user.vis_contents -= rust_overlay + rusted = FALSE + set_armor(/datum/armor/eldritch_armor/rust) + + REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, REF(src)) + cut_overlay(object_overlay) + QDEL_NULL(rust_overlay) + QDEL_NULL(rust_appearance) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/robes_side_effect(mob/living/user) + . = ..() + if(!iscarbon(user)) + return + var/mob/living/carbon/victim = user + var/list/organ_list = victim.organs + if(!length(organ_list)) + return + + var/iteration = 0 + var/organs_to_puke = rand(1, 3) + for(var/obj/item/organ/to_puke as anything in organ_list) + if(iteration > organs_to_puke) + break + iteration++ + addtimer(CALLBACK(src, PROC_REF(vomit_your_guts_out), victim), 1 SECONDS * iteration) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/vomit_your_guts_out(mob/living/carbon/victim) + if(QDELETED(victim) || !is_equipped(victim)) + return + victim.vomit(MOB_VOMIT_BLOOD | MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM | MOB_VOMIT_FORCE) + victim.spew_organ(rand(4, 6)) + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if our armor values should be increased on the new turf + */ +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + set_armor(/datum/armor/eldritch_armor/rust/on_rust) + + ADD_TRAIT(source, TRAIT_PIERCEIMMUNE, REF(src)) + COOLDOWN_RESET(src, rust_grace_period) + if(rusted) // Already rusted, don't update overlay + return + rusted = TRUE + update_rust() + else + if(!rusted) // Already unrusted, don't update overlay + return + // Start the timer for the first time we step off rust + if(!COOLDOWN_STARTED(src, rust_grace_period)) + COOLDOWN_START(src, rust_grace_period, 1 SECONDS) + return + if(!COOLDOWN_FINISHED(src, rust_grace_period)) + return + + // *Actually* remove the effects after our grace period expires. + // Keep in mind since we call updates `on_move` this means you can technically stand still to keep the benefits. + COOLDOWN_RESET(src, rust_grace_period) + set_armor(/datum/armor/eldritch_armor/rust) + REMOVE_TRAIT(source, TRAIT_PIERCEIMMUNE, REF(src)) + rusted = FALSE + update_rust() + +/// Updates the icon of our overlay and applies the animation +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/proc/update_rust() + // Animation + Update the overlay sprite on our armor + if(!rusted) + rust_overlay?.icon_state = null + flick("[worn_icon_state]"+"_off", rust_overlay) + cut_overlay(object_overlay) + hood?.cut_overlay(hood_object_overlay) + return + rust_overlay?.icon_state = "[worn_icon_state]" + "_overlay" + flick("[worn_icon_state]"+"_on", rust_overlay) + add_overlay(object_overlay) + hood?.add_overlay(hood_object_overlay) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + // Should basically catch toggling the hood on/off while standing on rust + if(rusted) + rust_overlay?.icon_state = "[worn_icon_state]" + "_overlay" + else + rust_overlay?.icon_state = null + . += rust_appearance + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust + name = "\improper Salvaged Remains" + desc = "Touching the folds of this plain robe seem to fill you with unease. \ + Even looking fills you with a sense of vertigo. \ + Some pulse threatening to pull you within." + icon_state = "rust_armor" + armor_type = /datum/armor/eldritch_armor/rust + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust/equipped(mob/living/user, slot) + . = ..() + if(!(slot_flags & slot)) + UnregisterSignal(user, list(COMSIG_MOVABLE_MOVED)) + return + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if our armor values should be increased on the new turf + */ +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + set_armor(/datum/armor/eldritch_armor/rust/on_rust) + else + set_armor(/datum/armor/eldritch_armor/rust) + +/datum/armor/eldritch_armor/rust + melee = 30 + bullet = 30 + laser = 30 + energy = 30 + bomb = 50 + bio = 30 + fire = 30 + acid = 30 + wound = 30 + +/datum/armor/eldritch_armor/rust/on_rust + melee = 60 + bullet = 60 + laser = 60 + energy = 60 + bomb = 100 + bio = 60 + fire = 60 + acid = 60 + wound = 60 + +// Void +// Gives you a short stealth when you are hit +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void + name = "\improper Hollow Weave" + desc = "At first, the empty canvas of this robe seems to shimmer with a faint, cold light. \ + Yet upon tracking the shape of the folds more carefully, it is better to describe it as the absence of such a thing." + icon_state = "void_armor" + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch/void + armor_type = /datum/armor/eldritch_armor/void + /// Cooldown before we can go back into stealth + COOLDOWN_DECLARE(stealth_cooldown) + /// Timer before our stealth runs out + var/stealth_timer + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/on_robes_lost(mob/user, obj/item/clothing/suit/hooded/cultrobes/eldritch/robes) + . = ..() + if(. || !timeleft(stealth_timer)) + return + // Remove from stealth when you lose the robes + deltimer(stealth_timer) + end_stealth(user) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/robes_side_effect(mob/living/user) + . = ..() + user.adjust_bodytemperature(-INFINITY) + ADD_TRAIT(user, TRAIT_HYPOTHERMIC, REF(src)) + if(!isliving(user)) + return + var/mob/living/victim = user + victim.apply_status_effect(/datum/status_effect/frozenstasis/irresistable) + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type, damage_type) + . = ..() + if(!COOLDOWN_FINISHED(src, stealth_cooldown)) + return + COOLDOWN_START(src, stealth_cooldown, 20 SECONDS) + stealth_timer = addtimer(CALLBACK(src, PROC_REF(end_stealth), owner), 5 SECONDS, TIMER_STOPPABLE) + owner.alpha = 0 + return TRUE + +/obj/item/clothing/suit/hooded/cultrobes/eldritch/void/proc/end_stealth(mob/living/carbon/human/owner) + animate(owner, time = 1 SECONDS, alpha = initial(owner.alpha)) + +/obj/item/clothing/head/hooded/cult_hoodie/eldritch/void + name = "\improper Hollow Weave" + desc = "At first, the empty canvas of this robe seems to shimmer with a faint, cold light. \ + Yet upon tracking the shape of the folds more carefully, it is better to describe it as the absence of such a thing." + icon_state = "void_armor" + armor_type = /datum/armor/eldritch_armor/void + +/datum/armor/eldritch_armor/void + melee = 40 + bullet = 40 + laser = 50 + energy = 50 + bomb = 40 + bio = 40 + fire = 40 + acid = 40 + wound = 40 + // Void cloak. Turns invisible with the hood up, lets you hide stuff. /obj/item/clothing/head/hooded/cult_hoodie/void name = "void hood" @@ -108,6 +1115,12 @@ make_visible() ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT) +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_up(obj/item/clothing/head/hooded/hood) + hood_up = TRUE + +/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) + hood_up = FALSE + /obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot) . = ..() if(slot & ITEM_SLOT_OCLOTHING) @@ -118,12 +1131,6 @@ . = ..() UnregisterSignal(user, list(COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EQUIPPED_ITEM)) -/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_up(obj/item/clothing/head/hooded/hood) - hood_up = TRUE - -/obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) - hood_up = FALSE - /obj/item/clothing/suit/hooded/cultrobes/void/proc/hide_item(datum/source, obj/item/item, slot) SIGNAL_HANDLER if(slot & ITEM_SLOT_SUITSTORE) @@ -140,6 +1147,7 @@ // Let examiners know this works as a focus only if the hood is down . += span_notice("Allows you to cast heretic spells while the hood is down.") + . += span_notice("Is space worthy as long as the hood is down.") /obj/item/clothing/suit/hooded/cultrobes/void/on_hood_down(obj/item/clothing/head/hooded/hood) make_visible() @@ -165,6 +1173,7 @@ RemoveElement(/datum/element/heretic_focus) if(isliving(loc)) + loc.remove_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTCOLD), REF(src)) REMOVE_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) loc.balloon_alert(loc, "cloak hidden") loc.visible_message(span_notice("Light shifts around [loc], making the cloak around them invisible!")) @@ -175,6 +1184,6 @@ AddElement(/datum/element/heretic_focus) if(isliving(loc)) - ADD_TRAIT(loc, TRAIT_RESISTLOWPRESSURE, REF(src)) + loc.add_traits(list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTCOLD), REF(src)) loc.balloon_alert(loc, "cloak revealed") loc.visible_message(span_notice("A kaleidoscope of colours collapses around [loc], a cloak appearing suddenly around their person!")) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 51de634ff43..eae583f2f82 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -54,6 +54,9 @@ return . /obj/item/melee/sickly_blade/attack_self(mob/user) + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) + if(heretic_datum?.unlimited_blades) + return if(HAS_TRAIT(user, TRAIT_ELDRITCH_ARENA_PARTICIPANT)) user.balloon_alert(user, "can't escape!") if(escape_attempts > 2) @@ -170,16 +173,13 @@ if(!heretic_datum) return - //Apply our heretic mark - var/datum/heretic_knowledge/mark/blade_mark/mark_to_apply = heretic_datum.get_knowledge(/datum/heretic_knowledge/mark/blade_mark) + // Apply our heretic mark + var/datum/heretic_knowledge/limited_amount/starting/base_blade/mark_to_apply = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/starting/base_blade) if(!mark_to_apply) return mark_to_apply.create_mark(user, living_target) - - //Remove the infusion from any blades we own (and update their sprite) - for(var/obj/item/melee/sickly_blade/dark/to_infuse in user.get_all_contents_type(/obj/item/melee/sickly_blade/dark)) - to_infuse.infused = FALSE - to_infuse.update_appearance(UPDATE_ICON) + infused = FALSE + update_appearance(UPDATE_ICON) user.update_held_items() if(!check_behind(user, living_target)) diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 2dcf9b4ec1e..23df3695449 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -146,7 +146,6 @@ icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL - // The amulet conversion tool used by moon heretics /obj/item/clothing/neck/heretic_focus/moon_amulet name = "moonlight amulet" @@ -154,30 +153,158 @@ icon = 'icons/obj/antags/eldritch.dmi' icon_state = "moon_amulette" w_class = WEIGHT_CLASS_SMALL - // How much damage does this item do to the targets sanity? + /// How much damage does this item do to the targets sanity? var/sanity_damage = 20 + var/list/possible_sounds = list( + 'sound/items/sitcom_laugh/SitcomLaugh1.ogg', + 'sound/items/sitcom_laugh/SitcomLaugh2.ogg', + 'sound/items/sitcom_laugh/SitcomLaugh3.ogg', + ) + var/valid_weapon_type = /obj/item/melee/sickly_blade + var/sanity_threshold = SANITY_LEVEL_INSANE + +/obj/item/clothing/neck/heretic_focus/moon_amulet/examine(mob/user) + . = ..() + if(IS_HERETIC(user)) + . += span_notice("Wearing this amulet increases your healing speed by 50%") + +/obj/item/clothing/neck/heretic_focus/moon_amulet/equipped(mob/living/user, slot) + . = ..() + if(!IS_HERETIC(user) && (slot_flags & slot)) + channel_amulet(user) + return // Equipping the amulet as a non-heretic will give you a fat mood debuff and nothing else + if(!(slot_flags & slot)) + on_amulet_deactivate(user) + return + on_amulet_activate(user) + +/// Modifies any blades you hold/pickup/drop when the amulet is enabled +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_amulet_activate(mob/living/user) + RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(blade_channel)) + RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equip_item)) + RegisterSignal(user, COMSIG_MOB_DROPPED_ITEM, PROC_REF(on_dropped_item)) + // Just make sure we pacify blades potentially in our hands when we put on the amulet + on_equip_item(user, user.get_active_held_item(), ITEM_SLOT_HANDS) + on_equip_item(user, user.get_inactive_held_item(), ITEM_SLOT_HANDS) + ADD_TRAIT(user, TRAIT_THERMAL_VISION, REF(src)) + user.update_sight() + // If the equipper is a moon heretic, we buff their passive + var/datum/status_effect/heretic_passive/moon/moon_passive = user.has_status_effect(/datum/status_effect/heretic_passive/moon) + moon_passive?.amulet_equipped = TRUE + +/// Modifies any blades you hold/pickup/drop when the amulet is disabled +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_amulet_deactivate(mob/living/user) + // Make sure to restore the values of any blades we might be holding when our amulet is deactivated + on_dropped_item(user, user.get_active_held_item()) + on_dropped_item(user, user.get_inactive_held_item()) + UnregisterSignal(user, list(COMSIG_HERETIC_BLADE_ATTACK, COMSIG_MOB_EQUIPPED_ITEM, COMSIG_MOB_DROPPED_ITEM)) + REMOVE_TRAIT(user, TRAIT_THERMAL_VISION, REF(src)) + user.update_sight() + var/datum/status_effect/heretic_passive/moon/moon_passive = user.has_status_effect(/datum/status_effect/heretic_passive/moon) + moon_passive?.amulet_equipped = FALSE + +/obj/item/clothing/neck/heretic_focus/moon_amulet/dropped(mob/living/user) + on_amulet_deactivate(user) + return ..() /obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) - var/mob/living/carbon/human/hit = target - if(!IS_HERETIC_OR_MONSTER(user)) - user.balloon_alert(user, "you feel a presence watching you") - user.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - user.mob_mood.adjust_sanity(-50) + if(channel_amulet(user, target)) return + return ..() - if(hit.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/blade_channel(mob/living/attacker, mob/living/victim) + SIGNAL_HANDLER + channel_amulet(attacker, victim) + +/// Makes whoever the target is a bit more insane. If they are insane enough, they will be zombified into a moon zombie +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/channel_amulet(mob/user, atom/target) + + if(!isliving(user)) + return FALSE + var/mob/living/living_user = user + if(!IS_HERETIC_OR_MONSTER(living_user)) + living_user.balloon_alert(living_user, "you feel a presence watching you") + living_user.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) + living_user.mob_mood.adjust_sanity(-50) + return FALSE + if(!isliving(target)) + return FALSE + var/mob/living/living_target = target + + if(!ishuman(target)) + living_target.adjustFireLoss(30) + return TRUE + var/mob/living/carbon/human/human_target = target + if(IS_HERETIC_OR_MONSTER(human_target)) + living_user.balloon_alert(living_user, "resists effects!") + return FALSE + if(human_target.has_status_effect(/datum/status_effect/moon_slept) || human_target.has_status_effect(/datum/status_effect/moon_converted)) + human_target.balloon_alert(living_user, "causing damage!") + human_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25) + return FALSE + if(human_target.can_block_magic(MAGIC_RESISTANCE_MOON)) + return FALSE + if(!human_target.mob_mood) + return FALSE + if(human_target.mob_mood.sanity_level < sanity_threshold) + human_target.balloon_alert(living_user, "their mind is too strong!") + human_target.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) + human_target.mob_mood.adjust_sanity(-sanity_damage) + else + if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + human_target.balloon_alert(living_user, "their mind almost bends but something protects it!") + human_target.apply_status_effect(/datum/status_effect/moon_slept) + return TRUE + human_target.balloon_alert(living_user, "their mind bends to see the truth!") + human_target.apply_status_effect(/datum/status_effect/moon_converted) + living_user.log_message("made [human_target] insane.", LOG_GAME) + human_target.log_message("was driven insane by [living_user]", LOG_GAME) + return TRUE + +/// Modifies any blades that we equip while wearing the amulet +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_equip_item(mob/user, obj/item/blade, slot) + SIGNAL_HANDLER + if(!istype(blade, valid_weapon_type)) + return // We only care about modifying blades + if(slot & ITEM_SLOT_HANDS) + blade.force = 0 + blade.wound_bonus = 0 + blade.exposed_wound_bonus = 0 + blade.armour_penetration = 200 + RegisterSignal(blade, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, PROC_REF(modify_attack_message)) return + blade.force = initial(blade.force) + blade.wound_bonus = initial(blade.wound_bonus) + blade.exposed_wound_bonus = initial(blade.exposed_wound_bonus) + blade.armour_penetration = initial(blade.armour_penetration) + UnregisterSignal(blade, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT) - if(!hit.mob_mood) - return - if(hit.mob_mood.sanity_level > SANITY_LEVEL_UNSTABLE) - user.balloon_alert(user, "their mind is too strong!") - hit.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - hit.mob_mood.adjust_sanity(-sanity_damage) - return ..() +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/modify_attack_message(obj/item/weapon, mob/living/victim, mob/living/attacker) + SIGNAL_HANDLER - user.balloon_alert(user, "their mind bends to see the truth!") - hit.apply_status_effect(/datum/status_effect/moon_converted) - user.log_message("made [target] insane.", LOG_GAME) - hit.log_message("was driven insane by [user]") - . = ..() + var/list/attack_list = list( + "You sweep [weapon] towards [victim], splitting [victim.p_Their()] image in two.", + "You strike [victim] with [weapon], spilling forth a cascade from within. Immaculate.", + "As it bite deep, your [weapon] unburdens [victim] of unneeded thought.", + ) + to_chat(attacker, span_danger(pick(attack_list))) + + var/list/victim_list = list( + "You are struck by [attacker], but the [weapon] tears away something more than parts of your body.", + "You see an arch of light as [attacker]'s [weapon] twists towards you, and you see the world briefly in tetrachrome.", + "As [attacker] carves into you with [weapon], you lose something deep within. The agony is worse than any wound.", + ) + to_chat(victim, span_userdanger(pick(victim_list))) + playsound(attacker, pick(possible_sounds), 40, TRUE) + return SIGNAL_MESSAGE_MODIFIED + +/// Modifies any blades that we drop while wearing the amulet +/obj/item/clothing/neck/heretic_focus/moon_amulet/proc/on_dropped_item(mob/user, obj/item/dropped_item) + SIGNAL_HANDLER + if(!istype(dropped_item, valid_weapon_type)) + return // We only care about modifying blades + dropped_item.force = initial(dropped_item.force) + dropped_item.wound_bonus = initial(dropped_item.wound_bonus) + dropped_item.exposed_wound_bonus = initial(dropped_item.exposed_wound_bonus) + dropped_item.armour_penetration = initial(dropped_item.armour_penetration) + UnregisterSignal(dropped_item, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT) diff --git a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm index 178b8b16da5..c1f5de8c985 100644 --- a/code/modules/antagonists/heretic/items/labyrinth_handbook.dm +++ b/code/modules/antagonists/heretic/items/labyrinth_handbook.dm @@ -2,14 +2,19 @@ name = "labyrinth pages" desc = "A field of papers flying in the air, repulsing heathens with impossible force." icon_state = "lintel" - initial_duration = 8 SECONDS + initial_duration = 15 SECONDS + +/obj/effect/forcefield/wizard/heretic/CanAllowThrough(atom/movable/mover, border_dir) + if(istype(mover.throwing?.get_thrower(), /obj/effect/forcefield/wizard/heretic)) + return TRUE + return ..() /obj/effect/forcefield/wizard/heretic/Bumped(mob/living/bumpee) . = ..() if(!istype(bumpee) || IS_HERETIC_OR_MONSTER(bumpee)) return var/throwtarget = get_edge_target_turf(loc, get_dir(loc, get_step_away(bumpee, loc))) - bumpee.safe_throw_at(throwtarget, 10, 1, force = MOVE_FORCE_EXTREMELY_STRONG) + bumpee.safe_throw_at(throwtarget, 10, 10, src, force = MOVE_FORCE_EXTREMELY_STRONG) visible_message(span_danger("[src] repulses [bumpee] in a storm of paper!")) ///A heretic item that spawns a barrier at the clicked turf, 3 uses @@ -31,15 +36,21 @@ pickup_sound = 'sound/items/handling/book_pickup.ogg' ///what type of barrier do we spawn when used var/barrier_type = /obj/effect/forcefield/wizard/heretic - ///how many uses do we have left - var/uses = 3 + /// Current charges remaining + var/charges = 5 + /// Max possible amount of charges + var/max_charges = 5 + /// List that contains each timer for the charge + var/list/charge_timers = list() + /// How long before a charge is restored + var/charge_time = 15 SECONDS /obj/item/heretic_labyrinth_handbook/examine(mob/user) . = ..() if(!IS_HERETIC_OR_MONSTER(user)) return . += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.") - . += span_hypnophrase("It has [uses] uses left.") + . += span_notice("It has [charges] charge\s remaining.") /obj/item/heretic_labyrinth_handbook/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION)) @@ -56,6 +67,10 @@ human_user.dropItemToGround(src) return ITEM_INTERACT_BLOCKING + if(charges <= 0) + balloon_alert(user, "no charges!") + return ITEM_INTERACT_BLOCKING + var/turf/turf_target = get_turf(interacting_with) if(locate(barrier_type) in turf_target) user.balloon_alert(user, "already occupied!") @@ -64,8 +79,9 @@ new /obj/effect/temp_visual/paper_scatter(turf_target) playsound(turf_target, 'sound/effects/magic/smoke.ogg', 30) new barrier_type(turf_target, user) - uses-- - if(uses <= 0) - to_chat(user, span_warning("[src] falls apart, turning into ash and dust!")) - qdel(src) + charges-- + charge_timers.Add(addtimer(CALLBACK(src, PROC_REF(recharge)), charge_time, TIMER_STOPPABLE)) return ITEM_INTERACT_SUCCESS + +/obj/item/heretic_labyrinth_handbook/proc/recharge() + charges = min(charges+1, max_charges) diff --git a/code/modules/antagonists/heretic/items/madness_mask.dm b/code/modules/antagonists/heretic/items/madness_mask.dm index 1be99d41012..4e80ee862f6 100644 --- a/code/modules/antagonists/heretic/items/madness_mask.dm +++ b/code/modules/antagonists/heretic/items/madness_mask.dm @@ -4,9 +4,10 @@ desc = "A mask created from suffering. When you look into its eyes, it looks back." icon_state = "mad_mask" inhand_icon_state = null + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF w_class = WEIGHT_CLASS_SMALL - flags_cover = MASKCOVERSEYES - resistance_flags = FLAMMABLE flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT ///Who is wearing this var/mob/living/carbon/human/local_user diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index 44af5f0acb1..b9a35fc00f1 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -67,7 +67,7 @@ to_chat(wearer, span_warning("Laughter echoes in your mind....")) wearer.adjustOrganLoss(ORGAN_SLOT_BRAIN, 40) wearer.dropItemToGround(src, TRUE) - wearer.gain_trauma(pick(brain_traumas) ,TRAUMA_RESILIENCE_ABSOLUTE) + wearer.gain_trauma(pick(brain_traumas), TRAUMA_RESILIENCE_MAGIC) /obj/item/storage/belt/unfathomable_curio/examine(mob/living/carbon/user) . = ..() diff --git a/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm index 5e3583e14b3..5890e459c16 100644 --- a/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm +++ b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm @@ -1,199 +1,387 @@ -//Global typecache of all heretic knowledges -> instantiate the tree columns -> make them link themselves -> replace the old heretic stuff -//heretic research tree is a directional graph so we can use some basic graph stuff to make internally handling it easier -GLOBAL_LIST(heretic_research_tree) - -//HKT = Heretic Knowledge Tree (Heretic Research Tree :3) these objects really only exist for a short period of time at startup and then get deleted -/datum/heretic_knowledge_tree_column - ///Route that symbolizes what path this is - var/route - ///Used to determine if this is a side path or a main path - var/abstract_parent_type = /datum/heretic_knowledge_tree_column - ///IDs od neighbours (to left and right) - var/neighbour_type_left - var/neighbour_type_right - ///Tier1 knowledge (or knowledges) - var/tier1 - ///Tier2 knowledge (or knowledges) - var/tier2 - ///Tier3 knowledge (or knowledges) - var/tier3 - ///UI background - var/ui_bgr = "node_side" - -/datum/heretic_knowledge_tree_column/main - abstract_parent_type = /datum/heretic_knowledge_tree_column/main - - ///Starting knowledge - first thing you pick - var/start - ///Grasp upgrade - var/grasp - ///Mark upgrade - var/mark - ///Unique ritual of knoweldge - var/ritual_of_knowledge - ///Path specific unique ability - var/unique_ability - ///Blade upgrade - var/blade - ///Ascension - var/ascension - -/proc/generate_heretic_research_tree() - var/list/heretic_research_tree = list() - - //Initialize the data structure - for(var/type in subtypesof(/datum/heretic_knowledge)) - heretic_research_tree[type] = list() - heretic_research_tree[type][HKT_NEXT] = list() - heretic_research_tree[type][HKT_BAN] = list() - heretic_research_tree[type][HKT_DEPTH] = 1 - heretic_research_tree[type][HKT_UI_BGR] = "node_side" - - var/datum/heretic_knowledge/knowledge = type - if(initial(knowledge.is_starting_knowledge)) - heretic_research_tree[type][HKT_ROUTE] = PATH_START - continue - - heretic_research_tree[type][HKT_ROUTE] = null +/// Assoc list of heretic_route.path string -> list of knowledges in that path, see generate_heretic_path() in code/modules/antagonists/heretic/knowledge/_heretic_paths.dm +GLOBAL_LIST(heretic_path_knowledges) +GLOBAL_LIST_INIT(heretic_path_datums, init_heretic_path_datums()) +/proc/init_heretic_path_datums() var/list/paths = list() - for(var/type in subtypesof(/datum/heretic_knowledge_tree_column)) - var/datum/heretic_knowledge_tree_column/column_path = type + for(var/datum/heretic_knowledge_tree_column/column_path as anything in subtypesof(/datum/heretic_knowledge_tree_column)) if(initial(column_path.abstract_parent_type) == column_path) continue + var/datum/heretic_knowledge_tree_column/heretic_route = new column_path() + paths[heretic_route.route] += heretic_route + return paths - var/datum/heretic_knowledge_tree_column/column = new type() - paths[column.type] = column +/datum/heretic_knowledge_tree_column + ///Route that symbolizes what path this is, MUST be unique between paths + var/route = PATH_START + var/icon_state = "dark_blade" + /* + * Complexity grades: + * Easy = COLOR_GREEN + * Medium = COLOR_YELLOW + * Hard = COLOR_RED + */ + var/complexity = "Insane" + var/complexity_color = COLOR_WHITE + var/list/icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "dark_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + var/list/description = list("A heretic knowledge tree column, used to define a path of knowledge.") + var/list/pros = list("Is bad", "Is very bad", "Is extremely bad") + var/list/cons = list("Smells bad", "Looks bad", "Tastes bad") + var/list/tips = list("Don't use it", "Don't touch it", "Don't look at it") + ///Used to determine if this is a side path or a main path + var/abstract_parent_type = /datum/heretic_knowledge_tree_column + ///UI background + var/ui_bgr = BGR_SIDE - var/list/start_blacklist = list() - var/list/grasp_blacklist = list() - var/list/mark_blacklist = list() - var/list/blade_blacklist = list() - var/list/asc_blacklist = list() + //-- Knowledge in order of unlocking + ///Starting knowledge - first thing you pick. Gives you access to blades, grasp, mark and passive + var/datum/heretic_knowledge/limited_amount/starting/start + ///Tier1 knowledge + var/knowledge_tier1 + ///Tier2 knowledge + var/knowledge_tier2 + ///Path-Specific Heretic robes + var/robes + ///Tier3 knowledge + var/knowledge_tier3 + ///Blade upgrade + var/blade + ///Tier4 knowledge + var/knowledge_tier4 + ///Ascension + var/ascension + // Drafting system, if a path has any side-knowledge that is guaranteed to be one of the options + /// Knowledge guaranteed to show up in the first draft + var/guaranteed_side_tier1 + /// Knowledge guaranteed to show up in the second draft + var/guaranteed_side_tier2 + /// Knowledge guaranteed to show up in the third draft + var/guaranteed_side_tier3 - for(var/id in paths) - if(!istype(paths[id],/datum/heretic_knowledge_tree_column/main)) - continue - var/datum/heretic_knowledge_tree_column/main/column = paths[id] - start_blacklist += column.start - grasp_blacklist += column.grasp - mark_blacklist += column.mark - blade_blacklist += column.blade - asc_blacklist += column.ascension +/datum/heretic_knowledge_tree_column/proc/get_ui_data(datum/antagonist/heretic/our_heretic, category) + var/list/power_info = our_heretic.heretic_shops[category] + var/list/data = list( + "route" = route, + "icon" = icon.Copy(), + "complexity" = complexity, + "complexity_color" = complexity_color, + "description" = description.Copy(), + "pros" = pros.Copy(), + "cons" = cons.Copy(), + "tips" = tips.Copy(), + "starting_knowledge" = our_heretic.get_knowledge_data(start, power_info), + ) - heretic_research_tree[/datum/heretic_knowledge/spell/basic][HKT_NEXT] += start_blacklist + data["preview_abilities"] = list( + our_heretic.get_knowledge_data(knowledge_tier1, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier2, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier3, power_info, category = category), + our_heretic.get_knowledge_data(knowledge_tier4, power_info, category = category), + ) - for(var/id in paths) - var/datum/heretic_knowledge_tree_column/this_column = paths[id] - var/datum/heretic_knowledge_tree_column/neighbour_0 = paths[this_column.neighbour_type_left] - var/datum/heretic_knowledge_tree_column/neighbour_1 = paths[this_column.neighbour_type_right] - //horizontal (two way) - var/list/tier1 = this_column.tier1 - var/list/tier2 = this_column.tier2 - var/list/tier3 = this_column.tier3 + var/datum/status_effect/heretic_passive/passive = new start.eldritch_passive() + data["passive"] = list( + "name" = initial(passive.name), + "description" = passive.passive_descriptions.Copy(), + ) + qdel(passive) - //Tier1, 2 and 3 can technically be lists so we handle them here - if(!islist(this_column.tier1)) - tier1 = list(this_column.tier1) + return data - if(!islist(this_column.tier2)) - tier2 = list(this_column.tier2) - if(!islist(this_column.tier3)) - tier3 = list(this_column.tier3) +/** + * Modifies the 2 lists provided in the arguments and sets it up so the heretic can actually start researching stuff. + * Specifically generates the tier 1-4 knowledges + start ones for each path as well for the preview (should probably be moved to use the actual list of per-path researches) + * Importantly, this adds HKT_NEXT's for the starting knowledges so the heretic's next researches are considered valid +**/ +/proc/generate_heretic_starting_knowledge(list/starting_knowledges = list()) + for(var/knowledge in GLOB.heretic_start_knowledge) + starting_knowledges[knowledge] = make_knowledge_entry(knowledge, null, HERETIC_KNOWLEDGE_START) - for(var/t1_knowledge in tier1) - heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_0.tier1 - heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_1.tier1 - heretic_research_tree[t1_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t1_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t1_knowledge][HKT_DEPTH] = 4 + var/list/start_knowledges = list() + var/list/start_knowledge_ids = list() + for(var/route in GLOB.heretic_path_datums) + var/datum/heretic_knowledge_tree_column/column_path = GLOB.heretic_path_datums[route] + var/start_knowledge = column_path::start + // why aren't the tiered knowledges in a list?!?!? (initial() probably) + var/t1_knowledge = column_path::knowledge_tier1 + var/t2_knowledge = column_path::knowledge_tier2 + var/t3_knowledge = column_path::knowledge_tier3 + var/t4_knowledge = column_path::knowledge_tier4 + starting_knowledges[start_knowledge] = make_knowledge_entry(start_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_START) + starting_knowledges[t1_knowledge] = make_knowledge_entry(t1_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_1) + starting_knowledges[t2_knowledge] = make_knowledge_entry(t2_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_2) + starting_knowledges[t3_knowledge] = make_knowledge_entry(t3_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_3) + starting_knowledges[t4_knowledge] = make_knowledge_entry(t4_knowledge, column_path, HERETIC_KNOWLEDGE_START, HKT_DEPTH_TIER_4) + // start the HKT_NEXT chain here + starting_knowledges[/datum/heretic_knowledge/spell/basic][HKT_NEXT] += starting_knowledges[start_knowledge][HKT_ID] + // notably, the heretic's tree isn't yet generated so we have to generate the ID here instead of fetching it, hopefully this doesn't break + starting_knowledges[start_knowledge][HKT_NEXT] += make_knowledge_id(t1_knowledge, HERETIC_KNOWLEDGE_TREE) + start_knowledges += start_knowledge + start_knowledge_ids += starting_knowledges[start_knowledge][HKT_ID] - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_0.tier2 - heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_1.tier2 - heretic_research_tree[t2_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t2_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t2_knowledge][HKT_DEPTH] = 8 + // make sure to prevent starting on other paths + for(var/knowledge_path in start_knowledges) + var/list/target_knowledge = starting_knowledges[knowledge_path] + target_knowledge[HKT_BAN] += start_knowledge_ids - target_knowledge[HKT_ID] - for(var/t3_knowledge in tier3) - heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_0.tier3 - heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_1.tier3 - heretic_research_tree[t3_knowledge][HKT_ROUTE] = this_column.route - heretic_research_tree[t3_knowledge][HKT_UI_BGR] = this_column.ui_bgr - heretic_research_tree[t3_knowledge][HKT_DEPTH] = 10 +//TODO: use this to generate the globallist +/datum/antagonist/heretic/proc/generate_heretic_research_tree() + if(!heretic_path) + stack_trace("somehow called generate_heretic_research_tree with a falsey heretic_path") + return + if(!length(GLOB.heretic_path_knowledges)) + GLOB.heretic_path_knowledges = generate_global_heretic_tree() + var/list/selected_route = GLOB.heretic_path_knowledges[heretic_path.route] + if(!selected_route) + stack_trace("called generate_heretic_research_tree with a invalid heretic_path.route") + return + heretic_shops[HERETIC_KNOWLEDGE_TREE] = deep_copy_list_alt(selected_route) - //Everything below this line is considered to be a "main path" and not a side path - //Since we are handling the heretic research tree column by column this is required - if(this_column.abstract_parent_type != /datum/heretic_knowledge_tree_column/main) - continue - - var/datum/heretic_knowledge_tree_column/main/main_column = this_column - //vertical (one way) - heretic_research_tree[/datum/heretic_knowledge/spell/basic] += main_column.start - heretic_research_tree[main_column.start][HKT_NEXT] += main_column.grasp - heretic_research_tree[main_column.grasp][HKT_NEXT] += main_column.tier1 - //t1 handling - for(var/t1_knowledge in tier1) - heretic_research_tree[t1_knowledge][HKT_NEXT] += main_column.mark - - heretic_research_tree[main_column.mark][HKT_NEXT] += main_column.ritual_of_knowledge - heretic_research_tree[main_column.ritual_of_knowledge][HKT_NEXT] += main_column.unique_ability - heretic_research_tree[main_column.unique_ability][HKT_NEXT] += main_column.tier2 - //t2 handling - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += main_column.blade - - heretic_research_tree[main_column.blade][HKT_NEXT] += main_column.tier3 - //t3 handling - for(var/t3_knowledge in tier3) - heretic_research_tree[t3_knowledge][HKT_NEXT] += main_column.ascension - - //blacklist - heretic_research_tree[main_column.start][HKT_BAN] += (start_blacklist - main_column.start) + (asc_blacklist - main_column.ascension) - heretic_research_tree[main_column.grasp][HKT_BAN] += (grasp_blacklist - main_column.grasp) - heretic_research_tree[main_column.mark][HKT_BAN] += (mark_blacklist - main_column.mark) - heretic_research_tree[main_column.blade][HKT_BAN] += (blade_blacklist - main_column.blade) - - //route stuff - heretic_research_tree[main_column.start][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.grasp][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.mark][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.ritual_of_knowledge][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.unique_ability][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.blade][HKT_ROUTE] = main_column.route - heretic_research_tree[main_column.ascension][HKT_ROUTE] = main_column.route - - heretic_research_tree[main_column.start][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.grasp][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.mark][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.ritual_of_knowledge][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.unique_ability][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.blade][HKT_UI_BGR] = main_column.ui_bgr - heretic_research_tree[main_column.ascension][HKT_UI_BGR] = main_column.ui_bgr - //depth stuff - heretic_research_tree[main_column.start][HKT_DEPTH] = 2 - heretic_research_tree[main_column.grasp][HKT_DEPTH] = 3 - heretic_research_tree[main_column.mark][HKT_DEPTH] = 5 - heretic_research_tree[main_column.ritual_of_knowledge][HKT_DEPTH] = 6 - heretic_research_tree[main_column.unique_ability][HKT_DEPTH] = 7 - heretic_research_tree[main_column.blade][HKT_DEPTH] = 9 - heretic_research_tree[main_column.ascension][HKT_DEPTH] = 11 - - //Per path bullshit goes here \/\/\/ - for(var/t2_knowledge in tier2) - heretic_research_tree[t2_knowledge][HKT_NEXT] += /datum/heretic_knowledge/reroll_targets - - // If you want to do any custom bullshit put it here \/\/\/ - heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_ROUTE] = PATH_SIDE - heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_DEPTH] = 8 - - heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_NEXT] += /datum/heretic_knowledge/rifle_ammo - heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_ROUTE] = PATH_SIDE - heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_DEPTH] = heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_DEPTH] - - //and we're done - QDEL_LIST_ASSOC_VAL(paths) +/proc/generate_global_heretic_tree() + var/heretic_research_tree = list() + for(var/path in GLOB.heretic_path_datums) + var/datum/heretic_knowledge_tree_column/heretic_route = GLOB.heretic_path_datums[path] + heretic_research_tree[path] = generate_heretic_path(heretic_route) + if(!length(heretic_research_tree)) + CRASH("Somehow generated an empty heretic research tree, this should never happen.") return heretic_research_tree + +/proc/make_knowledge_entry(datum/heretic_knowledge/knowledge, datum/heretic_knowledge_tree_column/path, category = HERETIC_KNOWLEDGE_TREE, depth = 1, cost = -1) + return list( + HKT_NEXT = list(), + HKT_BAN = list(), + HKT_DEPTH = depth, + HKT_PURCHASED_DEPTH = 0, + HKT_UI_BGR = path ? path::ui_bgr : BGR_SIDE, + HKT_COST = cost != -1 ? cost : knowledge::cost, + HKT_ROUTE = path ? path::route : null, + HKT_CATEGORY = category, + HKT_ID = make_knowledge_id(knowledge, category), + ) + +/// ID's are not unique, the same knowledge with the same type in the same shop will always have the same ID. +/proc/make_knowledge_id(datum/heretic_knowledge/knowledge, shop_category = HERETIC_KNOWLEDGE_TREE) + var/type_string = replacetext("[knowledge::type]", "/", "", 1, 2) + var/our_type = replacetext(type_string, "/", "_") + return "[shop_category]/[our_type]" + +/proc/generate_heretic_path(datum/heretic_knowledge_tree_column/heretic_path) + var/list/heretic_research_tree = list() + //Initialize the data structure + var/list/tree_paths = list() + + tree_paths += list( + heretic_path.knowledge_tier1, + heretic_path.knowledge_tier2, + heretic_path.knowledge_tier3, + heretic_path.knowledge_tier4, + heretic_path.robes, + heretic_path.blade, + heretic_path.ascension, + ) + + for(var/datum/heretic_knowledge/type as anything in tree_paths) + heretic_research_tree[type] = make_knowledge_entry(type, heretic_path, depth = 1) + + var/knowledge_tier1 = heretic_path.knowledge_tier1 + var/knowledge_tier2 = heretic_path.knowledge_tier2 + var/knowledge_tier3 = heretic_path.knowledge_tier3 + var/knowledge_tier4 = heretic_path.knowledge_tier4 + + //horizontal (two way) + heretic_research_tree[knowledge_tier1][HKT_DEPTH] = HKT_DEPTH_TIER_1 + heretic_research_tree[knowledge_tier1][HKT_NEXT] += heretic_research_tree[knowledge_tier2][HKT_ID] + + heretic_research_tree[knowledge_tier2][HKT_DEPTH] = HKT_DEPTH_TIER_2 + heretic_research_tree[knowledge_tier2][HKT_NEXT] += heretic_research_tree[heretic_path.robes][HKT_ID] + + heretic_research_tree[knowledge_tier3][HKT_DEPTH] = HKT_DEPTH_TIER_3 + heretic_research_tree[knowledge_tier3][HKT_NEXT] += heretic_research_tree[heretic_path.blade][HKT_ID] + heretic_research_tree[heretic_path.robes][HKT_NEXT] += heretic_research_tree[knowledge_tier3][HKT_ID] + + heretic_research_tree[knowledge_tier4][HKT_DEPTH] = HKT_DEPTH_TIER_4 + heretic_research_tree[heretic_path.blade][HKT_NEXT] += heretic_research_tree[knowledge_tier4][HKT_ID] + heretic_research_tree[knowledge_tier4][HKT_NEXT] += heretic_research_tree[heretic_path.ascension][HKT_ID] + + //depth stuff + heretic_research_tree[heretic_path.robes][HKT_DEPTH] = HKT_DEPTH_ROBES + heretic_research_tree[heretic_path.blade][HKT_DEPTH] = HKT_DEPTH_ARMOR + heretic_research_tree[heretic_path.ascension][HKT_DEPTH] = HKT_DEPTH_ASCENSION + //and we're done + return heretic_research_tree + +/** + * Each heretic has a few drafted knowledges within their heretic knowledge tree. + * This is not during the knowledge tree creation because we want to know what path our heretic picks so we filter out dupe knowledges. + * Also generates shop knowledges as their validation is shared. + * Modifies shop_list and final_draft that are provided in the arguments. + */ +/proc/determine_drafted_knowledge(route, list/tree = list(), list/shop = list(), list/final_draft = list()) + if(!route) + stack_trace("somehow called determine_drafted_knowledge with a falsey current_path") + return + var/list/heretic_research_tree = tree + var/datum/heretic_knowledge_tree_column/heretic_path = GLOB.heretic_path_datums[route] + + /// costs by index mapped to depth + var/list/shop_costs = list(1, 2, 2, 2, 3) + + // Relevant variables that we pull from the path + var/knowledge_tier1 = heretic_path.knowledge_tier1 + var/knowledge_tier2 = heretic_path.knowledge_tier2 + var/knowledge_tier3 = heretic_path.knowledge_tier3 + var/knowledge_tier4 = heretic_path.knowledge_tier4 + + var/list/path_knowledges = list( + knowledge_tier1, + knowledge_tier2, + knowledge_tier3, + knowledge_tier4, + ) + + // Every path can have a guaranteed option that will show up in the first 3 drafts (Otherwise we just run as normal) + var/datum/heretic_knowledge/guaranteed_draft_t1 = heretic_path.guaranteed_side_tier1 + var/datum/heretic_knowledge/guaranteed_draft_t2 = heretic_path.guaranteed_side_tier2 + var/datum/heretic_knowledge/guaranteed_draft_t3 = heretic_path.guaranteed_side_tier3 + + var/list/guaranteed_drafts = list( + guaranteed_draft_t1, + guaranteed_draft_t2, + guaranteed_draft_t3, + ) + + var/list/shop_unlock_order = list( + knowledge_tier1, + knowledge_tier2, + heretic_path.robes, + knowledge_tier3, + knowledge_tier4, + ) + + var/list/draft_ineligible = path_knowledges.Copy() + draft_ineligible += guaranteed_drafts + + var/list/elligible_knowledge = list() + var/list/shop_knowledge = list() + for(var/tier in 1 to HERETIC_DRAFT_TIER_MAX) + elligible_knowledge += list(list()) + shop_knowledge += list(list()) + + for(var/datum/heretic_knowledge/potential_type as anything in subtypesof(/datum/heretic_knowledge)) + if(potential_type::drafting_tier == 0) + continue + // Don't add the knowledge if it's obtainable later in the path + if(is_path_in_list(potential_type, draft_ineligible)) + continue + if(!potential_type::is_shop_only) + elligible_knowledge[potential_type::drafting_tier] += potential_type + shop_knowledge[potential_type::drafting_tier] += potential_type + + var/list/drafts = list( + list( + "parent_knowledge" = knowledge_tier1, + "guaranteed_knowledge" = guaranteed_draft_t1, + "probabilities" = list("1" = 50, "2" = 50, "3" = 0, "4" = 0, "5" = 0), + HKT_DEPTH = HKT_DEPTH_DRAFT_1, + ), + list( + "parent_knowledge" = knowledge_tier2, + "guaranteed_knowledge" = guaranteed_draft_t2, + "probabilities" = list("1" = 50, "2" = 25, "3" = 25, "4" = 0, "5" = 0), + HKT_DEPTH = HKT_DEPTH_DRAFT_2, + ), + list( + "parent_knowledge" = knowledge_tier3, + "guaranteed_knowledge" = guaranteed_draft_t3, + "probabilities" = list("1" = 20, "2" = 20, "3" = 20, "4" = 20, "5" = 20), + HKT_DEPTH = HKT_DEPTH_DRAFT_3, + ), + list( + "parent_knowledge" = knowledge_tier4, + "probabilities" = list("1" = 0, "2" = 0, "3" = 0, "4" = 0, "5" = 100), + HKT_DEPTH = HKT_DEPTH_DRAFT_4, + ) + ) + /// generate 3 drafts for each draft tier, while banning you from picking multiple drafts + for(var/draft in drafts) + var/parent_knowledge_path = draft["parent_knowledge"] + var/datum/heretic_knowledge/guaranteed_draft = draft["guaranteed_knowledge"] + var/list/probabilities = draft["probabilities"] + var/depth = draft[HKT_DEPTH] + var/list/draft_blacklist = list() + + for(var/cycle in 1 to 3) + var/datum/heretic_knowledge/selected_knowledge + if(guaranteed_draft && cycle == 1) + selected_knowledge = guaranteed_draft + var/shop_tier = shop_knowledge[guaranteed_draft::drafting_tier] + if(shop_tier && !(guaranteed_draft in shop_tier)) + shop_tier += guaranteed_draft + else + // rng kinda not correct but like, whatever + var/chosen_tier = min(text2num(pick_weight(probabilities)), length(elligible_knowledge)) + var/list/picked_tier = elligible_knowledge[chosen_tier] + selected_knowledge = pick_n_take(picked_tier) + + if(!length(picked_tier)) + elligible_knowledge.Cut(chosen_tier, chosen_tier + 1) + + if(isnull(selected_knowledge)) + stack_trace("Failed to select a knowledge for heretic path [heretic_path] at depth [depth]. This should never happen.") + continue + + final_draft[selected_knowledge] = make_knowledge_entry( + selected_knowledge, + null, + HERETIC_KNOWLEDGE_DRAFT, + depth, + 0, + ) + final_draft[selected_knowledge][HKT_PURCHASED_DEPTH] = selected_knowledge::drafting_tier + var/draft_id = final_draft[selected_knowledge][HKT_ID] + draft_blacklist[selected_knowledge] = draft_id + heretic_research_tree[parent_knowledge_path][HKT_NEXT] |= draft_id + + var/list/blacklist_ids = assoc_to_values(draft_blacklist) + for(var/blacklist_path in draft_blacklist) + var/id = draft_blacklist[blacklist_path] + final_draft[blacklist_path][HKT_BAN] += (blacklist_ids - id) + + // all possible drafts are added to the shop, this time with costs + for(var/drafting_tier in 1 to length(shop_knowledge)) + var/unlocked_by = shop_unlock_order[drafting_tier] + var/list/eligible_tier = shop_knowledge[drafting_tier] + for(var/knowledge_type in eligible_tier) + shop[knowledge_type] = make_knowledge_entry( + knowledge_type, + null, + HERETIC_KNOWLEDGE_SHOP, + drafting_tier, + shop_costs[drafting_tier], + ) + var/shop_id = shop[knowledge_type][HKT_ID] + heretic_research_tree[unlocked_by][HKT_NEXT] |= shop_id + // ban the corresponding same knowledge from the final draft to prevent duplicates + var/found = final_draft[knowledge_type] + if(!found) + continue + found[HKT_BAN] |= shop_id + + var/gun_path = /datum/heretic_knowledge/rifle + var/ammo_path = /datum/heretic_knowledge/rifle_ammo + shop[ammo_path] = make_knowledge_entry(ammo_path, null, HERETIC_KNOWLEDGE_SHOP, 2) + var/ammo_id = shop[ammo_path][HKT_ID] + shop[gun_path][HKT_NEXT] |= ammo_id + + var/already_in = final_draft[gun_path] + if(already_in) + already_in[HKT_NEXT] |= ammo_id diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 487839580d7..77751ad6581 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -1,19 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/ash - neighbour_type_left = /datum/heretic_knowledge_tree_column/cosmic_to_ash - neighbour_type_right = /datum/heretic_knowledge_tree_column/ash_to_moon - +/datum/heretic_knowledge_tree_column/ash route = PATH_ASH ui_bgr = "node_ash" + complexity = "Easy" + complexity_color = COLOR_GREEN + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "ash_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Ash revolves around fire, mobility and brutal crowd control against single opponents.", + "Play this path if you are new to Heretic, or really enjoy hit and run playstyles.", + ) + pros = list( + "Very potent even from the beginning of the path.", + "Easy access to a mobility spells and expanded vision.", + "Very powerful mark effect.", + ) + cons = list( + "Has less power than most heretics beyond their starting abilities.", + "Lacks durability in long conflicts.", + "Reliant on hitting fast and hard before their opponents can mount proper countermeasures.", + ) + tips = list( + "Your Mansus Grasp applies a short blind and a mark that puts your opponent into stamina crit when triggered by your blade. The mark can spread to nearby opponents.", + "Selecting this path makes you immune to high temperature damage. Remember, however, that your clothes can still burn! If you want to protect yourself from your own fire, wear a Scorched Mantle.", + "Your Scorched Mantle will cause you to generate firestacks on your own body (Make sure you toggle the effect!). Upon reaching 5 fire stacks, your ashen spells will be empowered (indicated by your spells being highlighted in green).", + "Your Ashen passage is a short cooldown jaunt capable of removing restraints. If empowered, it gains a longer jaunt time, and also will remove stuns and stamina crit.", + "Volcano blast can make short work of your enemies, should they be foolish enough to stick close to each other. If empowered, it will have no cast time and generate twice the amount of firestacks. Burn the heathens to ashes!", + "Do not neglect the Mask of Madness. It will slowly sap the stamina of your enemies and make them hallucinate.", + "Make sure to set as many enemies on fire as you possibly can! Nightwatcher's Rebirth will heal you and have its cooldown reduced based on how many mobs you siphon.", + "Your ascension grants you complete immunity to environmental hazards, including bombs! But you are still vulnerable to more conventional weaponry. Do not become overconfident.", + ) + start = /datum/heretic_knowledge/limited_amount/starting/base_ash - grasp = /datum/heretic_knowledge/ashen_grasp - tier1 = /datum/heretic_knowledge/spell/ash_passage - mark = /datum/heretic_knowledge/mark/ash_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/ash - unique_ability = /datum/heretic_knowledge/spell/fire_blast - tier2 = /datum/heretic_knowledge/mad_mask + knowledge_tier1 = /datum/heretic_knowledge/spell/ash_passage + guaranteed_side_tier1 = /datum/heretic_knowledge/medallion + knowledge_tier2 = /datum/heretic_knowledge/spell/fire_blast + guaranteed_side_tier2 = /datum/heretic_knowledge/rifle + robes = /datum/heretic_knowledge/armor/ash + knowledge_tier3 = /datum/heretic_knowledge/mad_mask + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/ashy blade = /datum/heretic_knowledge/blade_upgrade/ash - tier3 = /datum/heretic_knowledge/spell/flame_birth + knowledge_tier4 = /datum/heretic_knowledge/spell/flame_birth ascension = /datum/heretic_knowledge/ultimate/ash_final /datum/heretic_knowledge/limited_amount/starting/base_ash @@ -29,24 +60,11 @@ result_atoms = list(/obj/item/melee/sickly_blade/ash) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "ash_blade" + mark_type = /datum/status_effect/eldritch/ash + eldritch_passive = /datum/status_effect/heretic_passive/ash -/datum/heretic_knowledge/ashen_grasp - name = "Grasp of Ash" - desc = "Your Mansus Grasp will burn the eyes of the victim, damaging them and blurring their vision." - gain_text = "The Nightwatcher was the first of them, his treason started it all. \ - Their lantern, expired to ash - their watch, absent." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_ash" - -/datum/heretic_knowledge/ashen_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/ashen_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/ashen_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_ash/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(target.is_blind()) return @@ -58,27 +76,7 @@ target.adjustOrganLoss(ORGAN_SLOT_EYES, 15) target.set_eye_blur_if_lower(20 SECONDS) -/datum/heretic_knowledge/spell/ash_passage - name = "Ashen Passage" - desc = "Grants you Ashen Passage, a spell that lets you phase out of reality and traverse a short distance, passing though any walls." - gain_text = "He knew how to walk between the planes." - - action_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash - cost = 1 - - -/datum/heretic_knowledge/mark/ash_mark - name = "Mark of Ash" - desc = "Your Mansus Grasp now applies the Mark of Ash. The mark is triggered from an attack with your Ashen Blade. \ - When triggered, the victim takes additional stamina and burn damage, and the mark is transferred to a nearby heathen. \ - Damage dealt is decreased with each transfer. \ - Triggering the mark will also greatly reduce the cooldown of your Mansus Grasp." - gain_text = "He was a very particular man, always watching in the dead of night. \ - But in spite of his duty, he regularly tranced through the Manse with his blazing lantern held high. \ - He shone brightly in the darkness, until the blaze begin to die." - mark_type = /datum/status_effect/eldritch/ash - -/datum/heretic_knowledge/mark/ash_mark/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_ash/trigger_mark(mob/living/source, mob/living/target) . = ..() if(!.) return @@ -89,20 +87,41 @@ grasp.next_use_time -= round(grasp.cooldown_time*0.75) grasp.build_all_button_icons() -/datum/heretic_knowledge/knowledge_ritual/ash - +/datum/heretic_knowledge/spell/ash_passage + name = "Ashen Passage" + desc = "Grants you Ashen Passage, a spell that lets you phase out of reality, allowing you to traverse a short distance, passing though any walls. \ + When empowered, it will break you out of any stuns and restraints, and will have a longer range." + gain_text = "He knew how to walk between the planes." + action_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash + cost = 2 + drafting_tier = 5 /datum/heretic_knowledge/spell/fire_blast name = "Volcano Blast" desc = "Grants you Volcano Blast, a spell that - after a short charge - fires off a beam of energy \ at a nearby enemy, setting them on fire and burning them. If they do not extinguish themselves, \ - the beam will continue to another target." + the beam will continue to another target. \ + When empowered, has instant cast time and blasts enemies with more flames." gain_text = "No fire was hot enough to rekindle them. No fire was bright enough to save them. No fire is eternal." action_to_add = /datum/action/cooldown/spell/charged/beam/fire_blast - cost = 1 + cost = 2 research_tree_icon_frame = 7 +/datum/heretic_knowledge/armor/ash + desc = "Allows you to transmute a table (or a suit), a mask and a match to create a scorched mantle. \ + It provides completes protection from fire, and is able to produce more flames passively. \ + When you have enough fire, you may cast empowered versions of your ashen spells. \ + Acts as a focus while hooded." + gain_text = "The Watch remain as they fell, crumbling away from sight. \ + Yet the winds blowing through the city call them back to service, dust kicked into the air, a drifting silhouette of the fallen." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/ash) + research_tree_icon_state = "ash_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/match = 1, + ) /datum/heretic_knowledge/mad_mask name = "Mask of Madness" @@ -117,7 +136,7 @@ /obj/item/flashlight/flare/candle = 4, ) result_atoms = list(/obj/item/clothing/mask/madness_mask) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/clothing/masks.dmi' research_tree_icon_state = "mad_mask" @@ -146,8 +165,9 @@ gain_text = "The fire was inescapable, and yet, life remained in his charred body. \ The Nightwatcher was a particular man, always watching." action_to_add = /datum/action/cooldown/spell/aoe/fiery_rebirth - cost = 1 + cost = 2 research_tree_icon_frame = 5 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/ash_final name = "Ashlord's Rite" diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 759f77a2adc..495d994f137 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -1,20 +1,53 @@ - -/datum/heretic_knowledge_tree_column/main/blade - neighbour_type_left = /datum/heretic_knowledge_tree_column/void_to_blade - neighbour_type_right = /datum/heretic_knowledge_tree_column/blade_to_rust - +/datum/heretic_knowledge_tree_column/blade route = PATH_BLADE ui_bgr = "node_blade" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "dark_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Blade is as the name suggests.", + "You are highly competent at cutting your opponents to ribbons.", + "Pick this path if you want to fight, and you want to be the best at fighting.", + ) + pros = list( + "Capable of blocking incoming attacks, retaliating with a riposte.", + "Rapidly deals damage through dual-wielded blades and channeled strikes.", + "High defense against stuns and knockdowns.", + "Highly lethal combatant in a direct combat with a single opponent.", + ) + cons = list( + "Requires a high degree of skill input.", + "Without blades, the path loses most of its fighting power.", + "Lacks mobility options.", + "Lacks environmental protections.", + ) + tips = list( + "Your Mansus Grasp will stun your opponent if they are attacked from behind or while they are prone. This also locks them in the room they are in until the mark is detonated. Triggering the mark will grant you a orbiting knife that will protect you from one melee or ranged attack.", + "You have the highest blade cap out of all paths (A total of 4). But since they require silver or titanium to craft, you might be strapped for ingredients if the miners aren't doing their job. If you need materials, shuttle walls and seats are a source of titanium metal, and surgery tables a source of silver.", + "You are highly reliant on approaching opponents in melee. Slips, bolas and beartraps are your worst enemy. You can counteract slips by crafting a pair of Greaves Of The Prophet, or remove restraints with Ashen Passage.", + "Realignment will pull you out of stuns and knockdowns, but also pacifies you for the duration.", + "With Empowered Blades, your offensive power grows considerably. You are able to fight with dual-wielded blades, and can empower them by activating your Mansus Grasp while wielding your blades. Your blades also deal additional damage to objects, silicons and mechs.", + "Maintaining a good offense also creates a good defense. With orbiting blades, you are able to block additional incoming attacks.", + "With Furious Steel, you can not only produce several knives for defensive purposes, but throw them by clicking with an empty hand. This gives you additional ranged power in a pinch.", + "Use Wolves Among Sheep with caution. Not only does it have a significant cooldown, but it also arms anyone trapped in the effect with you with blades of their own. Use it either as a last ditch defense, or when you know you have the upper hand and need an extra edge. Just don't try to flee the area before taking someone out first.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_blade - grasp = /datum/heretic_knowledge/blade_grasp - tier1 = /datum/heretic_knowledge/blade_dance - mark = /datum/heretic_knowledge/mark/blade_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/blade - unique_ability = /datum/heretic_knowledge/spell/realignment - tier2 = /datum/heretic_knowledge/spell/furious_steel + knowledge_tier1 = /datum/heretic_knowledge/spell/realignment + guaranteed_side_tier1 = /datum/heretic_knowledge/greaves_of_the_prophet + knowledge_tier2 = /datum/heretic_knowledge/duel_stance + guaranteed_side_tier2 = /datum/heretic_knowledge/essence + robes = /datum/heretic_knowledge/armor/blade + knowledge_tier3 = /datum/heretic_knowledge/spell/furious_steel + guaranteed_side_tier3 = /datum/heretic_knowledge/rune_carver blade = /datum/heretic_knowledge/blade_upgrade/blade - tier3 = /datum/heretic_knowledge/spell/wolves_among_sheep + knowledge_tier4 = /datum/heretic_knowledge/spell/wolves_among_sheep ascension = /datum/heretic_knowledge/ultimate/blade_final /datum/heretic_knowledge/limited_amount/starting/base_blade @@ -31,24 +64,11 @@ limit = 4 // It's the blade path, it's a given research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "dark_blade" + mark_type = /datum/status_effect/eldritch/blade + eldritch_passive = /datum/status_effect/heretic_passive/blade -/datum/heretic_knowledge/blade_grasp - name = "Grasp of the Blade" - desc = "Your Mansus Grasp will cause a short stun when used on someone lying down or facing away from you." - gain_text = "The story of the footsoldier has been told since antiquity. It is one of blood and valor, \ - and is championed by sword, steel and silver." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_blade" - -/datum/heretic_knowledge/blade_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/blade_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/blade_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_blade/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(!check_behind(source, target)) return @@ -59,109 +79,7 @@ target.balloon_alert(source, "backstab!") playsound(target, 'sound/items/weapons/guillotine.ogg', 100, TRUE) -/// The cooldown duration between triggers of blade dance -#define BLADE_DANCE_COOLDOWN (20 SECONDS) - -/datum/heretic_knowledge/blade_dance - name = "Dance of the Brand" - desc = "Being attacked while wielding a Heretic Blade in either hand will deliver a riposte \ - towards your attacker. This effect can only trigger once every 20 seconds." - gain_text = "The footsoldier was known to be a fearsome duelist. \ - Their general quickly appointed them as their personal Champion." - cost = 1 - research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' - research_tree_icon_state = "shatter" - /// Whether the counter-attack is ready or not. - /// Used instead of cooldowns, so we can give feedback when it's ready again - var/riposte_ready = TRUE - -/datum/heretic_knowledge/blade_dance/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_shield_reaction)) - -/datum/heretic_knowledge/blade_dance/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_LIVING_CHECK_BLOCK) - -/datum/heretic_knowledge/blade_dance/proc/on_shield_reaction( - mob/living/carbon/human/source, - atom/movable/hitby, - damage = 0, - attack_text = "the attack", - attack_type = MELEE_ATTACK, - armour_penetration = 0, - damage_type = BRUTE, -) - - SIGNAL_HANDLER - - if(attack_type != MELEE_ATTACK) - return - - if(!riposte_ready) - return - - if(INCAPACITATED_IGNORING(source, INCAPABLE_GRAB)) - return - - var/mob/living/attacker = hitby.loc - if(!istype(attacker)) - return - - if(!source.Adjacent(attacker)) - return - - // Let's check their held items to see if we can do a riposte - var/obj/item/main_hand = source.get_active_held_item() - var/obj/item/off_hand = source.get_inactive_held_item() - // This is the item that ends up doing the "blocking" (flavor) - var/obj/item/striking_with - - // First we'll check if the offhand is valid - if(!QDELETED(off_hand) && istype(off_hand, /obj/item/melee/sickly_blade)) - striking_with = off_hand - - // Then we'll check the mainhand - // We do mainhand second, because we want to prioritize it over the offhand - if(!QDELETED(main_hand) && istype(main_hand, /obj/item/melee/sickly_blade)) - striking_with = main_hand - - // No valid item in either slot? No riposte - if(!striking_with) - return - - // If we made it here, deliver the strike - INVOKE_ASYNC(src, PROC_REF(counter_attack), source, attacker, striking_with, attack_text) - - // And reset after a bit - riposte_ready = FALSE - addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), BLADE_DANCE_COOLDOWN) - -/datum/heretic_knowledge/blade_dance/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) - playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) - source.balloon_alert(source, "riposte used") - source.visible_message( - span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), - span_warning("You lean into [attack_text] and deliver a sudden riposte back at [target]!"), - span_hear("You hear a clink, followed by a stab."), - ) - weapon.melee_attack_chain(source, target) - -/datum/heretic_knowledge/blade_dance/proc/reset_riposte(mob/living/carbon/human/source) - riposte_ready = TRUE - source.balloon_alert(source, "riposte ready") - -#undef BLADE_DANCE_COOLDOWN - -/datum/heretic_knowledge/mark/blade_mark - name = "Mark of the Blade" - desc = "Your Mansus Grasp now applies the Mark of the Blade. While marked, \ - the victim will be unable to leave their current room until it expires or is triggered. \ - Triggering the mark will summon a knife that will orbit you for a short time. \ - The knife will block any attack directed towards you, but is consumed on use." - gain_text = "His general wished to end the war, but the Champion knew there could be no life without death. \ - He would slay the coward himself, and anyone who tried to run." - mark_type = /datum/status_effect/eldritch/blade - -/datum/heretic_knowledge/mark/blade_mark/create_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_blade/create_mark(mob/living/source, mob/living/target) var/datum/status_effect/eldritch/blade/blade_mark = ..() if(istype(blade_mark)) var/area/to_lock_to = get_area(target) @@ -169,16 +87,12 @@ to_chat(target, span_hypnophrase("An otherworldly force is compelling you to stay in [get_area_name(to_lock_to)]!")) return blade_mark -/datum/heretic_knowledge/mark/blade_mark/trigger_mark(mob/living/source, mob/living/target) +/datum/heretic_knowledge/limited_amount/starting/base_blade/trigger_mark(mob/living/source, mob/living/target) . = ..() if(!.) return source.apply_status_effect(/datum/status_effect/protective_blades, 60 SECONDS, 1, 20, 0 SECONDS) -/datum/heretic_knowledge/knowledge_ritual/blade - - - /datum/heretic_knowledge/spell/realignment name = "Realignment" desc = "Grants you Realignment a spell that wil realign your body rapidly for a short period. \ @@ -186,7 +100,91 @@ This spell can be cast in rapid succession, but doing so will increase the cooldown." gain_text = "In the flurry of death, he found peace within himself. Despite insurmountable odds, he forged on." action_to_add = /datum/action/cooldown/spell/realignment - cost = 1 + cost = 2 + +/// The amount of blood flow reduced per level of severity of gained bleeding wounds for Stance of the Torn Champion. +#define BLOOD_FLOW_PER_SEVEIRTY -1 + +/datum/heretic_knowledge/duel_stance + name = "Stance of the Torn Champion" + desc = "Grants resilience to blood loss from wounds and immunity to having your limbs dismembered. \ + Additionally, when damaged below 50% of your maximum health, \ + you gain increased resistance to gaining wounds and resistance to slowdown." + gain_text = "In time, it was he who stood alone among the bodies of his former comrades, awash in blood, none of it his own. \ + He was without rival, equal, or purpose." + cost = 2 + research_tree_icon_path = 'icons/effects/blood.dmi' + research_tree_icon_state = "suitblood" + research_tree_icon_dir = SOUTH + drafting_tier = 5 + /// Whether we're currently in duelist stance, gaining certain buffs (low health) + var/in_duelist_stance = FALSE + +/datum/heretic_knowledge/duel_stance/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + ADD_TRAIT(user, TRAIT_NODISMEMBER, type) + RegisterSignal(user, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(user, COMSIG_CARBON_GAIN_WOUND, PROC_REF(on_wound_gain)) + RegisterSignal(user, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_update)) + + on_health_update(user) // Run this once, so if the knowledge is learned while hurt it activates properly + +/datum/heretic_knowledge/duel_stance/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + REMOVE_TRAIT(user, TRAIT_NODISMEMBER, type) + if(in_duelist_stance) + user.remove_traits(list(TRAIT_HARDLY_WOUNDED), type) + if(isliving(user)) + var/mob/living/living_mob = user + living_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + + UnregisterSignal(user, list(COMSIG_ATOM_EXAMINE, COMSIG_CARBON_GAIN_WOUND, COMSIG_LIVING_HEALTH_UPDATE)) + +/datum/heretic_knowledge/duel_stance/proc/on_examine(mob/living/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + var/obj/item/held_item = source.get_active_held_item() + if(in_duelist_stance) + examine_list += span_warning("[source] looks unnaturally poised[held_item?.force >= 15 ? " and ready to strike out":""].") + +/datum/heretic_knowledge/duel_stance/proc/on_wound_gain(mob/living/source, datum/wound/gained_wound, obj/item/bodypart/limb) + SIGNAL_HANDLER + + if(gained_wound.blood_flow <= 0) + return + + gained_wound.adjust_blood_flow(gained_wound.severity * BLOOD_FLOW_PER_SEVEIRTY) + +/datum/heretic_knowledge/duel_stance/proc/on_health_update(mob/living/source) + SIGNAL_HANDLER + + if(in_duelist_stance && source.health > source.maxHealth * 0.5) + source.balloon_alert(source, "exited duelist stance") + in_duelist_stance = FALSE + source.remove_traits(list(TRAIT_HARDLY_WOUNDED), type) + source.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + return + + if(!in_duelist_stance && source.health <= source.maxHealth * 0.5) + source.balloon_alert(source, "entered duelist stance") + in_duelist_stance = TRUE + ADD_TRAIT(source, TRAIT_HARDLY_WOUNDED, type) + source.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown, TRUE) + return + +#undef BLOOD_FLOW_PER_SEVEIRTY + +/datum/heretic_knowledge/armor/blade + desc = "Allows you to transmute a table (or a suit), a mask and a sheet of titanium or silver to create a Shattered Panoply. \ + Provides baton resistance and shock insulation while worn. \ + Acts as a focus while hooded." + gain_text = "The echoing, directionless cacophony of violence reverberates about me. \ + Even as the Champion's steel panoply was torn from their form, each piece craves purpose still, seeking to intercept unseen or imagined attackers." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/blade) + research_tree_icon_state = "blade_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/mineral/titanium) = 1, + ) /datum/heretic_knowledge/spell/wolves_among_sheep name = "Wolves Among Sheep" @@ -199,8 +197,9 @@ I have made an enemy of all, and peace will never be known to me \ again. I have shattered bonds and severed all alliances. In this truth, \ I know now the fragility of comradery. My enemies will be all, divided." - cost = 1 + cost = 2 action_to_add = /datum/action/cooldown/spell/wolves_among_sheep + is_final_knowledge = TRUE /datum/heretic_knowledge/blade_upgrade/blade name = "Empowered Blades" @@ -221,11 +220,10 @@ . = ..() RegisterSignal(user, COMSIG_TOUCH_HANDLESS_CAST, PROC_REF(on_grasp_cast)) RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_blade_equipped)) - RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(do_melee_effects)) /datum/heretic_knowledge/blade_upgrade/blade/on_lose(mob/user, datum/antagonist/heretic/our_heretic) . = ..() - UnregisterSignal(user, list(COMSIG_TOUCH_HANDLESS_CAST, COMSIG_MOB_EQUIPPED_ITEM, COMSIG_HERETIC_BLADE_ATTACK)) + UnregisterSignal(user, list(COMSIG_TOUCH_HANDLESS_CAST, COMSIG_MOB_EQUIPPED_ITEM)) ///Tries to infuse our held blade with our mansus grasp /datum/heretic_knowledge/blade_upgrade/blade/proc/on_grasp_cast(mob/living/carbon/cast_on) @@ -296,7 +294,7 @@ /datum/heretic_knowledge/blade_upgrade/blade/proc/on_blade_equipped(mob/user, obj/item/equipped, slot) SIGNAL_HANDLER if(istype(equipped, /obj/item/melee/sickly_blade/dark)) - equipped.demolition_mod = 1.5 + equipped.demolition_mod = 2.5 /datum/heretic_knowledge/spell/furious_steel name = "Furious Steel" @@ -307,7 +305,7 @@ gain_text = "Without thinking, I took the knife of a fallen soldier and threw with all my might. My aim was true! \ The Torn Champion smiled at their first taste of agony, and with a nod, their blades became my own." action_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel - cost = 1 + cost = 2 /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" @@ -336,7 +334,7 @@ . = ..() ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, type) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) - user.apply_status_effect(/datum/status_effect/protective_blades/recharging, null, 8, 30, 0.25 SECONDS, /obj/effect/floating_blade, 1 MINUTES) + user.apply_status_effect(/datum/status_effect/protective_blades/recharging, STATUS_EFFECT_PERMANENT, 8, 30, 0.25 SECONDS, /obj/effect/floating_blade, 60 SECONDS) user.add_stun_absorption( source = name, message = span_warning("%EFFECT_OWNER throws off the stun!"), diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index ca950c8d0ea..89f21584a8d 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -1,20 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/cosmic - neighbour_type_left = /datum/heretic_knowledge_tree_column/rust_to_cosmic - neighbour_type_right = /datum/heretic_knowledge_tree_column/cosmic_to_ash - +/datum/heretic_knowledge_tree_column/cosmic route = PATH_COSMIC ui_bgr = "node_cosmos" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "cosmic_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Cosmos revolves around area denial, teleporation, and mastery over space.", + "Pick this path if you enjoy adapting to your environment and thinking outside (or inside) the box.", + ) + pros = list( + "Control the movement of foes with cosmic fields", + "Move in and around space with ease.", + "Teleport rapidly across the station.", + "Confound opponents with barriers upon barriers.", + ) + cons = list( + "Requires you spread your star mark to affect opponents with your cosmic fields.", + "Relatively low damage.", + "Relatively low direct defense, highly reliant on proper use of abilities.", + ) + tips = list( + "Your Mansus Grasp will mark your opponent with a star mark, as well as leave a mark that, when detonated, will teleport your opponent back to the place where the mark was applied and briefly paralyze them.", + "Your cosmic runes can quickly teleport you from two different locations instantly. Beware, however; non-heretics are also able to travel through them. Be creative and have your opponents teleport right into a trap. They come out star marked!", + "When standing on top of a cosmic rune, you can click on yourself with a empty hand to activate it.", + "Star marked opponents cannot cross your cosmic fields willingly. But they can be dragged through!", + "Star Blast is both a jaunt ability as well as a disabling tool. Use it to catch several people in your cosmic fields at once.", + "Star Touch will prevent your target from teleporting away. Should they fail to break the tether, they will be put to sleep and then teleport to your feet.", + "It's Always a good idea to leave one cosmic rune near your ritual rune, it will allow you to quickly kidnap your targets to sacrifice them.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_cosmic - grasp = /datum/heretic_knowledge/cosmic_grasp - tier1 = /datum/heretic_knowledge/spell/cosmic_runes - mark = /datum/heretic_knowledge/mark/cosmic_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/cosmic - unique_ability = /datum/heretic_knowledge/spell/star_touch - tier2 = /datum/heretic_knowledge/spell/star_blast + knowledge_tier1 = /datum/heretic_knowledge/spell/cosmic_runes + guaranteed_side_tier1 = /datum/heretic_knowledge/eldritch_coin + knowledge_tier2 = /datum/heretic_knowledge/spell/star_blast + guaranteed_side_tier2 = /datum/heretic_knowledge/spell/space_phase + robes = /datum/heretic_knowledge/armor/cosmic + knowledge_tier3 = /datum/heretic_knowledge/spell/star_touch + guaranteed_side_tier3 = /datum/heretic_knowledge/essence blade = /datum/heretic_knowledge/blade_upgrade/cosmic - tier3 = /datum/heretic_knowledge/spell/cosmic_expansion + knowledge_tier4 = /datum/heretic_knowledge/spell/cosmic_expansion ascension = /datum/heretic_knowledge/ultimate/cosmic_final /datum/heretic_knowledge/limited_amount/starting/base_cosmic @@ -30,30 +60,16 @@ result_atoms = list(/obj/item/melee/sickly_blade/cosmic) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "cosmic_blade" - -/datum/heretic_knowledge/cosmic_grasp - name = "Grasp of Cosmos" - desc = "Your Mansus Grasp will give people a star mark (cosmic ring) and create a cosmic field where you stand. \ - People with a star mark can not pass cosmic fields." - gain_text = "Some stars dimmed, others' magnitude increased. \ - With newfound strength I could channel the nebula's power into myself." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_cosmos" - -/datum/heretic_knowledge/cosmic_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/cosmic_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) + mark_type = /datum/status_effect/eldritch/cosmic + eldritch_passive = /datum/status_effect/heretic_passive/cosmic /// Aplies the effect of the mansus grasp when it hits a target. -/datum/heretic_knowledge/cosmic_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_cosmic/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() to_chat(target, span_danger("A cosmic ring appeared above your head!")) target.apply_status_effect(/datum/status_effect/star_mark, source) - new /obj/effect/forcefield/cosmic_field(get_turf(source)) + create_cosmic_field(get_turf(source), source) /datum/heretic_knowledge/spell/cosmic_runes name = "Cosmic Runes" @@ -63,20 +79,30 @@ gain_text = "The distant stars crept into my dreams, roaring and screaming without reason. \ I spoke, and heard my own words echoed back." action_to_add = /datum/action/cooldown/spell/cosmic_rune - cost = 1 + cost = 2 + drafting_tier = 5 +/datum/heretic_knowledge/spell/star_blast + name = "Star Blast" + desc = "Fires a projectile that moves very slowly, raising a short-lived wall of cosmic fields where it goes. \ + Anyone hit by the projectile will receive burn damage, a knockdown, and give people in a three tile range a star mark." + gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." + action_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast + cost = 2 -/datum/heretic_knowledge/mark/cosmic_mark - name = "Mark of Cosmos" - desc = "Your Mansus Grasp now applies the Mark of Cosmos. The mark is triggered from an attack with your Cosmic Blade. \ - When triggered, the victim is returned to the location where the mark was originally applied to them, \ - leaving a cosmic field in their place. \ - They will then be paralyzed for 2 seconds." - gain_text = "The Beast now whispered to me occasionally, only small tidbits of their circumstances. \ - I can help them, I have to help them." - mark_type = /datum/status_effect/eldritch/cosmic +/datum/heretic_knowledge/armor/cosmic -/datum/heretic_knowledge/knowledge_ritual/cosmic + desc = "Allows you to transmute a table (or a suit), a mask and a sheet of plasma to create a Starwoven Cloak, grants protection from the hazards of space while granting to the user the ability to levitate at will. \ + Acts as a focus while hooded." + gain_text = "Like radiant cords, the stars shone in union across the silken shape of a billowing cloak, that at once does and does not drape my shoulders. \ + The eyes of the Beast rested upon me, and through me." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/cosmic) + research_tree_icon_state = "cosmic_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + ) /datum/heretic_knowledge/spell/star_touch name = "Star Touch" @@ -87,23 +113,14 @@ gain_text = "After waking in a cold sweat I felt a palm on my scalp, a sigil burned onto me. \ My veins now emitted a strange purple glow, the Beast knows I will surpass its expectations." action_to_add = /datum/action/cooldown/spell/touch/star_touch - cost = 1 - -/datum/heretic_knowledge/spell/star_blast - name = "Star Blast" - desc = "Fires a projectile that moves very slowly, raising a short-lived wall of cosmic fields where it goes. \ - Anyone hit by the projectile will receive burn damage, a knockdown, and give people in a three tile range a star mark." - gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." - action_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast - cost = 1 + cost = 2 /datum/heretic_knowledge/blade_upgrade/cosmic name = "Cosmic Blade" - desc = "Your blade now deals damage to people's organs through cosmic radiation. \ + desc = "Your blade now star marks your victims, and allows you to attack star marked heathens from further away. \ Your attacks will chain bonus damage to up to two previous victims. \ - The combo is reset after two seconds without making an attack, \ - or if you attack someone already marked. If you combo more than four attacks you will receive, \ - a cosmic trail and increase your combo timer up to ten seconds." + The combo is reset after two seconds without making an attack, or if you attack someone already marked. \ + If you combo three attacks you will receive a cosmic trail and increase your combo timer up to ten seconds." gain_text = "The Beast took my blades in their hand, I kneeled and felt a sharp pain. \ The blades now glistened with fragmented power. I fell to the ground and wept at the beast's feet." research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' @@ -124,19 +141,20 @@ var/increase_amount = 0.5 SECONDS /// The hits we have on a mob with a mind. var/combo_counter = 0 + /// How much further we can hit people, modified by ascension + var/max_attack_range = 2 + +/datum/heretic_knowledge/blade_upgrade/cosmic/on_ranged_eldritch_blade(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + . = ..() + if(!isliving(target) || get_dist(source, target) > max_attack_range || !target.has_status_effect(/datum/status_effect/star_mark)) + return + source.changeNext_move(blade.attack_speed) + return blade.attack(target, source) /datum/heretic_knowledge/blade_upgrade/cosmic/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) - var/static/list/valid_organ_slots = list( - ORGAN_SLOT_HEART, - ORGAN_SLOT_LUNGS, - ORGAN_SLOT_STOMACH, - ORGAN_SLOT_EYES, - ORGAN_SLOT_EARS, - ORGAN_SLOT_LIVER, - ORGAN_SLOT_BRAIN - ) if(source == target || !isliving(target)) return + target.apply_status_effect(/datum/status_effect/star_mark, source) if(combo_timer) deltimer(combo_timer) combo_timer = addtimer(CALLBACK(src, PROC_REF(reset_combo), source), combo_duration, TIMER_STOPPABLE) @@ -144,7 +162,6 @@ var/mob/living/third_target_resolved = third_target?.resolve() var/need_mob_update = FALSE need_mob_update += target.adjustFireLoss(5, updating_health = FALSE) - need_mob_update += target.adjustOrganLoss(pick(valid_organ_slots), 8) if(need_mob_update) target.updatehealth() if(target == second_target_resolved || target == third_target_resolved) @@ -157,7 +174,6 @@ playsound(get_turf(second_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 25, FALSE) need_mob_update = FALSE need_mob_update += second_target_resolved.adjustFireLoss(14, updating_health = FALSE) - need_mob_update += second_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 12) if(need_mob_update) second_target_resolved.updatehealth() if(third_target_resolved) @@ -165,15 +181,12 @@ playsound(get_turf(third_target_resolved), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) need_mob_update = FALSE need_mob_update += third_target_resolved.adjustFireLoss(28, updating_health = FALSE) - need_mob_update += third_target_resolved.adjustOrganLoss(pick(valid_organ_slots), 14) if(need_mob_update) third_target_resolved.updatehealth() - if(combo_counter > 3) - target.apply_status_effect(/datum/status_effect/star_mark, source) + if(combo_counter == 3) if(target.mind && target.stat != DEAD) increase_combo_duration() - if(combo_counter == 4) - source.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + source.AddElement(cosmic_trail_based_on_passive(source), /obj/effect/forcefield/cosmic_field/fast) third_target = second_target second_target = WEAKREF(target) @@ -181,8 +194,7 @@ /datum/heretic_knowledge/blade_upgrade/cosmic/proc/reset_combo(mob/living/source) second_target = null third_target = null - if(combo_counter > 3) - source.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + source.RemoveElement(cosmic_trail_based_on_passive(source), /obj/effect/forcefield/cosmic_field/fast) combo_duration = combo_duration_amount combo_counter = 0 new /obj/effect/temp_visual/cosmic_cloud(get_turf(source)) @@ -196,16 +208,17 @@ /datum/heretic_knowledge/spell/cosmic_expansion name = "Cosmic Expansion" - desc = "Grants you Cosmic Expansion, a spell that creates a 3x3 area of cosmic fields around you. \ + desc = "Grants you Cosmic Expansion, a spell that creates a 5x5 area of cosmic fields around you. \ Nearby beings will also receive a star mark." gain_text = "The ground now shook beneath me. The Beast inhabited me, and their voice was intoxicating." action_to_add = /datum/action/cooldown/spell/conjure/cosmic_expansion - cost = 1 + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/cosmic_final name = "Creators's Gift" desc = "The ascension ritual of the Path of Cosmos. \ - Bring 3 corpses with bluespace dust in their body to a transmutation rune to complete the ritual. \ + Bring 3 corpses with a star mark to a transmutation rune to complete the ritual. \ When completed, you become the owner of a Star Gazer. \ You will be able to command the Star Gazer with Alt+click. \ You can also give it commands through speech. \ @@ -228,22 +241,33 @@ /datum/pet_command/follow, /datum/pet_command/attack/star_gazer ) + /// List of traits given once ascended + var/static/list/ascended_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, TRAIT_XRAY_VISION) + /// List of traits given to our cute lil guy + var/static/list/stargazer_traits = list(TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTCOLD, TRAIT_RESISTHEAT, TRAIT_BOMBIMMUNE, TRAIT_XRAY_VISION) /datum/heretic_knowledge/ultimate/cosmic_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) . = ..() if(!.) return FALSE - return sacrifice.has_reagent(/datum/reagent/bluespace) + return sacrifice.has_status_effect(/datum/status_effect/star_mark) /datum/heretic_knowledge/ultimate/cosmic_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() - var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) + user.add_traits(ascended_traits, type) + if(ishuman(user)) + var/mob/living/carbon/human/ascended_human = user + var/obj/item/organ/eyes/heretic_eyes = ascended_human.get_organ_slot(ORGAN_SLOT_EYES) + ascended_human.update_sight() + heretic_eyes?.color_cutoffs = list(30, 30, 30) + ascended_human.update_sight() + + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc, user) star_gazer_mob.maxHealth = INFINITY star_gazer_mob.health = INFINITY user.AddComponent(/datum/component/death_linked, star_gazer_mob) star_gazer_mob.AddComponent(/datum/component/obeys_commands, star_gazer_commands, radial_menu_offset = list(30,0), radial_menu_lifetime = 15 SECONDS, radial_relative_to_user = TRUE) - star_gazer_mob.AddComponent(/datum/component/damage_aura, range = 7, burn_damage = 0.5, simple_damage = 0.5, immune_factions = list(FACTION_HERETIC), current_owner = user) star_gazer_mob.befriend(user) var/datum/action/cooldown/open_mob_commands/commands_action = new /datum/action/cooldown/open_mob_commands() commands_action.Grant(user, star_gazer_mob) @@ -251,6 +275,8 @@ if(star_touch_spell) star_touch_spell.set_star_gazer(star_gazer_mob) star_touch_spell.ascended = TRUE + star_gazer_mob.add_traits(stargazer_traits, type) + star_gazer_mob.leash_to(star_gazer_mob, user) var/datum/antagonist/heretic/heretic_datum = user.mind.has_antag_datum(/datum/antagonist/heretic) var/datum/heretic_knowledge/blade_upgrade/cosmic/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/cosmic) @@ -258,6 +284,46 @@ blade_upgrade.combo_duration_amount = 10 SECONDS blade_upgrade.max_combo_duration = 30 SECONDS blade_upgrade.increase_amount = 2 SECONDS + blade_upgrade.max_attack_range = 3 var/datum/action/cooldown/spell/conjure/cosmic_expansion/cosmic_expansion_spell = locate() in user.actions cosmic_expansion_spell?.ascended = TRUE + + var/datum/action/cooldown/mob_cooldown/replace_star_gazer/replace_gazer = new(src) + replace_gazer.Grant(user) + replace_gazer.bad_dog = WEAKREF(star_gazer_mob) + +/// Replace an annoying griefer you were paired up to with a different but probably no less annoying player. +/datum/action/cooldown/mob_cooldown/replace_star_gazer + name = "Reset Star Gazer Consciousness" + desc = "Replaces the mind of your summon with that of a different ghost." + button_icon = 'icons/mob/simple/mob.dmi' + button_icon_state = "ghost" + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + check_flags = NONE + click_to_activate = FALSE + cooldown_time = 5 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + /// Weakref to the stargazer we care about + var/datum/weakref/bad_dog + +/datum/action/cooldown/mob_cooldown/replace_star_gazer/Activate(atom/target) + StartCooldown(5 MINUTES) + + var/mob/living/to_reset = bad_dog.resolve() + + to_chat(owner, span_hierophant("You prompt [to_reset] to shift it\'s personality...")) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as [span_danger("[owner.real_name]'s")] [span_notice(to_reset.name)]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, alert_pic = to_reset, jump_target = owner, role_name_text = to_reset.name, amount_to_pick = 1) + if(isnull(chosen_one)) + to_chat(owner, span_hierophant("Your request to shift [to_reset]'\s personality appears to have been denied... Looks like you're stuck with it for now.")) + StartCooldown() + return FALSE + to_chat(to_reset, span_hierophant("Your summoner reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")) + to_chat(owner, span_hierophant("The mind of [to_reset] has twisted itself to suit you better.")) + message_admins("[key_name_admin(chosen_one)] has taken control of ([ADMIN_LOOKUPFLW(to_reset)])") + to_reset.ghostize(FALSE) + to_reset.PossessByPlayer(chosen_one.key) + StartCooldown() + return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index b9503f33f9c..92878b90ca4 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -1,24 +1,52 @@ -/// The max amount of health a ghoul has. -#define GHOUL_MAX_HEALTH HUMAN_MAXHEALTH - 30 // BUBBER EDIT - 70 because we're going back to 100hp -/// The max amount of health a voiceless dead has. -#define MUTE_MAX_HEALTH HUMAN_MAXHEALTH // BUBBER EDIT - I mean i guess this'll keep it at 100hp so I don't need to change it - -/datum/heretic_knowledge_tree_column/main/flesh - neighbour_type_left = /datum/heretic_knowledge_tree_column/lock_to_flesh - neighbour_type_right = /datum/heretic_knowledge_tree_column/flesh_to_void - +/datum/heretic_knowledge_tree_column/flesh route = PATH_FLESH ui_bgr = "node_flesh" + complexity = "Varies" + complexity_color = COLOR_ORANGE + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "flesh_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Flesh revolves around summoning ghouls and monstrosities to do your bidding.", + "Pick this path if you enjoy the fantasy of being a necromancer commanding legions of allies.", + ) + pros = list( + "Can turn dead humanoids into fragile but loyal ghouls.", + "Access to a versatile list of summoned minions.", + "Your summons are very versatie and can quicky overwhelm the crew should you coordinate your attacks", + "Eating organs or being fat grants various boons (depending on the level of your passive).", + ) + cons = list( + "A high degree of your progression is obtaining additional summoned monsters.", + "You have very little utility beyond your summoned monsters.", + "You gain no inherent access to defensive, offensive or mobility spells.", + "You are mostly focused around supporting your minions.", + ) + tips = list( + "Your Mansus Grasp allows you to turn dead humanoids into ghouls (even mindshielded humanoids like security officers and the captain). It also Leaves a mark that causes heavy bleeding when triggered by your bloody blade.", + "As a Flesh Heretic, organs and dead bodies are your best friends! You can use them for rituals, to heal or to gain buffs.", + "Your Flesh Surgery spell can heal your summons. Your robes grant you an aura that also heals nearby summons (but not yourself).", + "Your Flesh Surgery spell also lets you steal organs from humanoids. Useful if you need a spare liver.", + "Raw Prophets can link you and other summons in a telepathic network, allowing for long distance co-ordination.", + "Flesh Stalkers are decent combatants with the ability to disguise themselves as small creatures, like beepskies and corgis. They can also utilize an EMP spell, but this can potentially harm them if they transformed into a robot!", + "Your success with this path is reliant on how knowledgable or robust your minions are. However, there is always power in numbers; the more minions, the higher your chances of success.", + "Your minions are more expendable than you are. Do not be afraid to tell them to go to their deaths. You can just recover them later... maybe.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_flesh - grasp = /datum/heretic_knowledge/limited_amount/flesh_grasp - tier1 = /datum/heretic_knowledge/limited_amount/flesh_ghoul - mark = /datum/heretic_knowledge/mark/flesh_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/flesh - unique_ability = /datum/heretic_knowledge/spell/flesh_surgery - tier2 = /datum/heretic_knowledge/summon/raw_prophet + knowledge_tier1 = /datum/heretic_knowledge/limited_amount/flesh_ghoul + guaranteed_side_tier1 = /datum/heretic_knowledge/limited_amount/risen_corpse + knowledge_tier2 = /datum/heretic_knowledge/spell/flesh_surgery + guaranteed_side_tier2 = /datum/heretic_knowledge/crucible + robes = /datum/heretic_knowledge/armor/flesh + knowledge_tier3 = /datum/heretic_knowledge/summon/raw_prophet + guaranteed_side_tier3 = /datum/heretic_knowledge/spell/crimson_cleave blade = /datum/heretic_knowledge/blade_upgrade/flesh - tier3 = /datum/heretic_knowledge/summon/stalker + knowledge_tier4 = /datum/heretic_knowledge/summon/stalker ascension = /datum/heretic_knowledge/ultimate/flesh_final /datum/heretic_knowledge/limited_amount/starting/base_flesh @@ -35,6 +63,8 @@ limit = 3 // Bumped up so they can arm up their ghouls too. research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "flesh_blade" + mark_type = /datum/status_effect/eldritch/flesh + eldritch_passive = /datum/status_effect/heretic_passive/flesh /datum/heretic_knowledge/limited_amount/starting/base_flesh/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -45,29 +75,8 @@ to_chat(user, span_hierophant("Undertaking the Path of Flesh, you are given another objective.")) our_heretic.owner.announce_objectives() -/datum/heretic_knowledge/limited_amount/flesh_grasp - name = "Grasp of Flesh" - // BUBBER CHANGE BELOW - GHOUL MAXHP - desc = "Your Mansus Grasp gains the ability to create a ghoul out of corpse with a soul. \ - Ghouls have only 100 health and look like husks to the heathens' eyes, but can use Bloody Blades effectively. \ - You can only create one at a time by this method." - gain_text = "My new found desires drove me to greater and greater heights." - - limit = 1 - cost = 1 - - - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_flesh" - -/datum/heretic_knowledge/limited_amount/flesh_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/limited_amount/flesh_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_flesh/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(target.stat != DEAD) return @@ -93,8 +102,11 @@ make_ghoul(source, target) +/// The max amount of health a ghoul has. +#define GHOUL_MAX_HEALTH 25 + /// Makes [victim] into a ghoul. -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) user.log_message("created a ghoul, controlled by [key_name(victim)].", LOG_GAME) message_admins("[ADMIN_LOOKUPFLW(user)] created a ghoul, [ADMIN_LOOKUPFLW(victim)].") @@ -107,11 +119,11 @@ ) /// Callback for the ghoul status effect - Tracking all of our ghouls -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/apply_to_ghoul(mob/living/ghoul) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/apply_to_ghoul(mob/living/ghoul) LAZYADD(created_items, WEAKREF(ghoul)) /// Callback for the ghoul status effect - Tracking all of our ghouls -/datum/heretic_knowledge/limited_amount/flesh_grasp/proc/remove_from_ghoul(mob/living/ghoul) +/datum/heretic_knowledge/limited_amount/starting/base_flesh/proc/remove_from_ghoul(mob/living/ghoul) LAZYREMOVE(created_items, WEAKREF(ghoul)) /datum/heretic_knowledge/limited_amount/flesh_ghoul @@ -127,12 +139,10 @@ /obj/item/food/grown/poppy = 1, ) limit = 2 - cost = 1 + cost = 2 research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "ghoul_voiceless" - - /datum/heretic_knowledge/limited_amount/flesh_ghoul/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() if(!.) @@ -175,6 +185,9 @@ make_ghoul(user, soon_to_be_ghoul) return TRUE +/// The max amount of health a voiceless dead has. +#define MUTE_MAX_HEALTH 50 + /// Makes [victim] into a ghoul. /datum/heretic_knowledge/limited_amount/flesh_ghoul/proc/make_ghoul(mob/living/user, mob/living/carbon/human/victim) user.log_message("created a voiceless dead, controlled by [key_name(victim)].", LOG_GAME) @@ -198,17 +211,6 @@ LAZYREMOVE(created_items, WEAKREF(ghoul)) REMOVE_TRAIT(ghoul, TRAIT_MUTE, MAGIC_TRAIT) -/datum/heretic_knowledge/mark/flesh_mark - name = "Mark of Flesh" - desc = "Your Mansus Grasp now applies the Mark of Flesh. The mark is triggered from an attack with your Bloody Blade. \ - When triggered, the victim begins to bleed significantly." - gain_text = "That's when I saw them, the marked ones. They were out of reach. They screamed, and screamed." - - - mark_type = /datum/status_effect/eldritch/flesh - -/datum/heretic_knowledge/knowledge_ritual/flesh - /datum/heretic_knowledge/spell/flesh_surgery name = "Knitting of Flesh" desc = "Grants you the spell Knit Flesh. This spell allows you to remove organs from victims \ @@ -217,7 +219,22 @@ gain_text = "But they were not out of my reach for long. With every step, the screams grew, until at last \ I learned that they could be silenced." action_to_add = /datum/action/cooldown/spell/touch/flesh_surgery - cost = 1 + cost = 2 + drafting_tier = 5 + +/datum/heretic_knowledge/armor/flesh + desc = "Allows you to transmute a table (or a suit), a mask and a pool of blood to create a writhing embrace. \ + It grants you the ability to detect the health condition of other living (and non-living) and an aura that slowly heals your summons. \ + Acts as a focus while hooded." + gain_text = "I tugged these wretched, slothing things about me, like one might a warm blanket. \ + With eyes-not-mine, they will witness. With teeth-not-mine, they will clench. With limbs-not-mine, they will break." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/flesh) + research_tree_icon_state = "flesh_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/effect/decal/cleanable/blood = 1, + ) /datum/heretic_knowledge/summon/raw_prophet name = "Raw Ritual" @@ -232,7 +249,7 @@ /obj/item/bodypart/arm/left = 1, ) mob_to_summon = /mob/living/basic/heretic_summon/raw_prophet - cost = 1 + cost = 2 poll_ignore_define = POLL_IGNORE_RAW_PROPHET @@ -270,10 +287,10 @@ /obj/item/paper = 1, ) mob_to_summon = /mob/living/basic/heretic_summon/stalker - cost = 1 + cost = 2 poll_ignore_define = POLL_IGNORE_STALKER - + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" @@ -299,7 +316,7 @@ worm_spell.Grant(user) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) - var/datum/heretic_knowledge/limited_amount/flesh_grasp/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_grasp) + var/datum/heretic_knowledge/limited_amount/starting/base_flesh/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/starting/base_flesh) grasp_ghoul.limit *= 3 var/datum/heretic_knowledge/limited_amount/flesh_ghoul/ritual_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_ghoul) ritual_ghoul.limit *= 3 diff --git a/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm b/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm new file mode 100644 index 00000000000..1295fe16590 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/heretic_armor_knowledge.dm @@ -0,0 +1,25 @@ +/datum/heretic_knowledge/armor + name = "Armorer's Ritual" + desc = "Allows you to transmute a table (or a suit) and a mask to create Eldritch Armor. \ + Eldritch Armor provides great protection while also acting as a focus when hooded." + gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity. And the Blacksmith \ + returned their generosity in kind." + + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + ) + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) + cost = 1 + + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "eldritch_armor" + research_tree_icon_frame = 1 + +/datum/heretic_knowledge/armor/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) + if(!heretic_datum) + return + SEND_SIGNAL(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST) + heretic_datum.gain_knowledge(/datum/heretic_knowledge/knowledge_ritual) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 573a151f991..d8dbc03c5d1 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -1,20 +1,47 @@ - -/datum/heretic_knowledge_tree_column/main/lock - neighbour_type_left = /datum/heretic_knowledge_tree_column/moon_to_lock - neighbour_type_right = /datum/heretic_knowledge_tree_column/lock_to_flesh - +/datum/heretic_knowledge_tree_column/lock route = PATH_LOCK ui_bgr = "node_lock" + complexity = "Medium" + complexity_color = COLOR_YELLOW + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "key_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Lock revolves around access, area denial, theft and gadgets.", + "Pick this path if you want a less confrontational playstyle and more interested in being a slippery rat.", + ) + pros = list( + "Your mansus grasp can open any lock, unlock every terminal and bypass any access restriction.", + "lock heretics get a discount from the knowledge shop, making it the perfect path if you want to experiment with the various trinkets the shop has to offer.", + ) + cons = list( + "The weakest heretic path in direct combat, period.", + "Very limited direct combat benefits.", + "You have no defensive benefits or immunities.", + "no mobility or direct additional teleportation", + "Highly reliant on sourcing power from other departments, players and the game world.", + ) + tips = list( + "Your mansus grasp allows you to access everything, from airlocks, consoles and even exosuits, but it has no additional effects on players. It will however leave a mark that when triggered will make your victim unable to leave the room you are in.", + "Your blade also functions as a crowbar! You can store it in utility belts And, in a pitch, use it to force open an airlock.", + "Your Eldritch ID can create a portal between 2 different airlocks. Useful if you want to enstablish a secret base.", + "Use your labyrinth book to shake off pursuers. It creates impassible walls to anyone but you.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_knock - grasp = /datum/heretic_knowledge/lock_grasp - tier1 = /datum/heretic_knowledge/key_ring - mark = /datum/heretic_knowledge/mark/lock_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/lock - unique_ability = /datum/heretic_knowledge/limited_amount/concierge_rite - tier2 = /datum/heretic_knowledge/spell/burglar_finesse + knowledge_tier1 = /datum/heretic_knowledge/key_ring + guaranteed_side_tier1 = /datum/heretic_knowledge/painting + knowledge_tier2 = /datum/heretic_knowledge/limited_amount/concierge_rite + guaranteed_side_tier2 = /datum/heretic_knowledge/spell/opening_blast + robes = /datum/heretic_knowledge/armor/lock + knowledge_tier3 = /datum/heretic_knowledge/spell/burglar_finesse + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/fire_shark blade = /datum/heretic_knowledge/blade_upgrade/flesh/lock - tier3 = /datum/heretic_knowledge/spell/caretaker_refuge + knowledge_tier4 = /datum/heretic_knowledge/spell/caretaker_refuge ascension = /datum/heretic_knowledge/ultimate/lock_final /datum/heretic_knowledge/limited_amount/starting/base_knock @@ -32,33 +59,29 @@ limit = 2 research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "key_blade" + mark_type = /datum/status_effect/eldritch/lock + eldritch_passive = /datum/status_effect/heretic_passive/lock -/datum/heretic_knowledge/lock_grasp - name = "Grasp of Lock" - desc = "Your mansus grasp allows you to access anything! Right click on an airlock or a locker to force it open. \ - DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \ - Makes a distinctive knocking sound on use." - gain_text = "Nothing may remain closed from my touch." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_lock" - -/datum/heretic_knowledge/lock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/base_knock/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp_spell = locate() in user.actions + grasp_spell?.invocation_type = INVOCATION_NONE + grasp_spell?.sound = null -/datum/heretic_knowledge/lock_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) +/datum/heretic_knowledge/limited_amount/starting/base_knock/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) -/datum/heretic_knowledge/lock_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_knock/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() + var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING) if(istype(suit) && suit.adjusted == NORMAL_STYLE) suit.toggle_jumpsuit_adjust() suit.update_appearance() -/datum/heretic_knowledge/lock_grasp/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) +/datum/heretic_knowledge/limited_amount/starting/base_knock/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) SIGNAL_HANDLER if(ismecha(target)) @@ -80,7 +103,14 @@ var/turf/target_turf = get_turf(target) SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source) - playsound(target, 'sound/effects/magic/hereticknock.ogg', 100, TRUE, -1) + SEND_SOUND(source, 'sound/effects/magic/hereticknock.ogg') + + if(HAS_TRAIT(source, TRAIT_LOCK_GRASP_UPGRADED)) + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = locate() in source.actions + if(grasp) + grasp.next_use_time -= round(grasp.cooldown_time*0.75) + grasp.build_all_button_icons() + return return COMPONENT_USE_HAND @@ -99,7 +129,7 @@ /obj/item/card/id/advanced = 1, ) result_atoms = list(/obj/item/card/id/advanced/heretic) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/card.dmi' research_tree_icon_state = "card_gold" @@ -115,20 +145,10 @@ result_item.shapeshift(id) return TRUE -/datum/heretic_knowledge/mark/lock_mark - name = "Mark of Lock" - desc = "Your Mansus Grasp now applies the Mark of Lock. \ - Attack a marked person to bar them from all passages for the duration of the mark. \ - This will make it so that they have no access whatsoever, even public access doors will reject them." - gain_text = "The Gatekeeper was a corrupt Steward. She hindered her fellows for her own twisted amusement." - mark_type = /datum/status_effect/eldritch/lock - -/datum/heretic_knowledge/knowledge_ritual/lock - -/datum/heretic_knowledge/limited_amount/concierge_rite // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass +/datum/heretic_knowledge/limited_amount/concierge_rite name = "Concierge's Rite" desc = "Allows you to transmute a crayon, a wooden plank, and a multitool to create a Labyrinth Handbook. \ - It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses." + It can materialize a barricade at range that only you and people resistant to magic can pass. Has 5 charges which regenerate over time." gain_text = "The Concierge scribbled my name into the Handbook. \"Welcome to your new home, fellow Steward.\"" required_atoms = list( /obj/item/toy/crayon = 1, @@ -136,9 +156,25 @@ /obj/item/multitool = 1, ) result_atoms = list(/obj/item/heretic_labyrinth_handbook) - cost = 1 + cost = 2 research_tree_icon_path = 'icons/obj/service/library.dmi' research_tree_icon_state = "heretichandbook" + drafting_tier = 5 + +/datum/heretic_knowledge/armor/lock + desc = "Allows you to transmute a table (or a suit), a mask and a crowbar to create a shifting guise. \ + It grants you camoflage from cameras, hides your identity, voice and muffles your footsteps. \ + Acts as a focus while hooded." + gain_text = "While stewards are known to the Concierge, \ + they still consort between one another and with outsiders under shaded cloaks and drawn hoods. \ + Familiarity is treachery, even to oneself." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/lock) + research_tree_icon_state = "lock_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/crowbar = 1, + ) /datum/heretic_knowledge/spell/burglar_finesse name = "Burglar's Finesse" @@ -147,9 +183,9 @@ gain_text = "Consorting with Burglar spirits is frowned upon, but a Steward will always want to learn about new doors." action_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse - cost = 1 + cost = 2 -/datum/heretic_knowledge/blade_upgrade/flesh/lock //basically a chance-based weeping avulsion version of the former +/datum/heretic_knowledge/blade_upgrade/flesh/lock name = "Opening Blade" desc = "Your blade has a chance to cause a weeping avulsion on attack." gain_text = "The Pilgrim-Surgeon was not an Steward. Nonetheless, its blades and sutures proved a match for their keys." @@ -169,7 +205,8 @@ You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item." gain_text = "Jealously, the Guard and the Hound hunted me. But I unlocked my form, and was but a haze, untouchable." action_to_add = /datum/action/cooldown/spell/caretaker - cost = 1 + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/lock_final name = "Unlock the Labyrinth" diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 69dd2dd4aad..137b4a1aef1 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -1,57 +1,79 @@ - -/datum/heretic_knowledge_tree_column/main/moon - neighbour_type_left = /datum/heretic_knowledge_tree_column/ash_to_moon - neighbour_type_right = /datum/heretic_knowledge_tree_column/moon_to_lock - +/datum/heretic_knowledge_tree_column/moon route = PATH_MOON ui_bgr = "node_moon" + complexity = "Hard" + complexity_color = COLOR_RED + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "moon_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Moon revolves around sanity, sowing confusion and discord, and skirting the conventional rules of combat.", + "Play this path if you are already experienced with Heretic and want to try something highly unconventional, or simply if you desire to play a pacifist Heretic (Yes, really!)." + ) + pros = list( + "High amount of tools to confound foes.", + "Sows chaos through the station via lunatics.", + "Practically immune to disabling effects while wearing the Resplendent Regalia." + ) + cons = list( + "No mobility.", + "Mo direct tools to damage your opponents.", + "Reliant on misdirection and confusion.", + "Lunatics can become liabilities.", + "Fairly fragile despite their unique protection mechanics.", + "Death while wearing the Resplendent Regalia results in a gorey end.", + ) + tips = list( + "Your Mansus Grasp will make your victim briefly hallucinate and apply a mark that, when triggered by your moon blade, will apply confusion and pacify them (the latter will get removed if the victim receives too much damage at once).", + "Your moon blade is special compared to the other heretic blades. It can be used even if you are pacified.", + "Your passive makes you completely impervious to brain traumas and slowly regenerates your brain health. Makes sure to upgrade it to bolster the regeneration effect.", + "Your Resplendent Regalia utterly changes the rules of combat for you and your opponents; You become fully immune to disabling effect, and all damage received (lethal or non lethal) will be converted into brain damage. However. the robes themselves have no armor, and prevent you from using guns as well as pacifying you (you can still use your moon blade).", + "Your moon amulette allows you to channel its effects through your moon blade. When toggled on, your Moon blade will no longer do lethal damage, but do sanity damage and become unblockable.", + "If the sanity of your opponents goes below a certain threshold, they'll become a lunatic. Lunatics are prompted to start attacking everyone (including you). Should you want to sacrifice them (or to get them to leave you be), hit them again with your moon blade to put them to sleep.", + "Ringleader's Rise summons an army of clones. They do barely any damage, but should they be attacked by non-heretics, they will explode and cause sanity and brain damage to those around them.", + "Your ascension will grant you an aura that converts nearby people to loyal lunatics. However, if they have a mindshield implant, their heads will instead detonate after a time.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_moon - grasp = /datum/heretic_knowledge/moon_grasp - tier1 = /datum/heretic_knowledge/spell/moon_smile - mark = /datum/heretic_knowledge/mark/moon_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/moon - unique_ability = /datum/heretic_knowledge/spell/moon_parade - tier2 = /datum/heretic_knowledge/moon_amulet + knowledge_tier1 = /datum/heretic_knowledge/spell/mind_gate + guaranteed_side_tier1 = /datum/heretic_knowledge/phylactery + knowledge_tier2 = /datum/heretic_knowledge/moon_amulet + guaranteed_side_tier2 = /datum/heretic_knowledge/codex_morbus + robes = /datum/heretic_knowledge/armor/moon + knowledge_tier3 = /datum/heretic_knowledge/spell/moon_parade + guaranteed_side_tier3 = /datum/heretic_knowledge/unfathomable_curio blade = /datum/heretic_knowledge/blade_upgrade/moon - tier3 = /datum/heretic_knowledge/spell/moon_ringleader + knowledge_tier4 = /datum/heretic_knowledge/spell/moon_ringleader ascension = /datum/heretic_knowledge/ultimate/moon_final /datum/heretic_knowledge/limited_amount/starting/base_moon name = "Moonlight Troupe" desc = "Opens up the Path of Moon to you. \ - Allows you to transmute 2 sheets of iron and a knife into an Lunar Blade. \ + Allows you to transmute 2 sheets of glass and a knife into an Lunar Blade. \ You can only create two at a time." gain_text = "Under the light of the moon the laughter echoes." required_atoms = list( /obj/item/knife = 1, - /obj/item/stack/sheet/iron = 2, + /obj/item/stack/sheet/glass = 2, ) result_atoms = list(/obj/item/melee/sickly_blade/moon) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "moon_blade" + mark_type = /datum/status_effect/eldritch/moon + eldritch_passive = /datum/status_effect/heretic_passive/moon /datum/heretic_knowledge/limited_amount/starting/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() ADD_TRAIT(user, TRAIT_EMPATH, REF(src)) -/datum/heretic_knowledge/moon_grasp - name = "Grasp of Lunacy" - desc = "Your Mansus Grasp will cause your victims to hallucinate everyone as lunar mass, \ - and hides your identity for a short duration." - gain_text = "The troupe on the side of the moon showed me truth, and I took it." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_moon" +/datum/heretic_knowledge/limited_amount/starting/base_moon/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() -/datum/heretic_knowledge/moon_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/moon_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/moon_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(target.can_block_magic(MAGIC_RESISTANCE_MOON)) to_chat(target, span_danger("You hear echoing laughter from above..but it is dull and distant.")) return @@ -64,39 +86,23 @@ carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") carbon_target.mob_mood.adjust_sanity(-30) -/datum/heretic_knowledge/spell/moon_smile - name = "Smile of the moon" - desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ - duration based on their sanity." - gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." +/datum/heretic_knowledge/spell/mind_gate + name = "Mind Gate" + desc = "Grants you Mind Gate, a spell which mutes,deafens, blinds, inflicts hallucinations, \ + confusion, oxygen loss and brain damage to its target over 10 seconds.\ + The caster takes 20 brain damage per use." + gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." - action_to_add = /datum/action/cooldown/spell/pointed/moon_smile - cost = 1 - -/datum/heretic_knowledge/mark/moon_mark - name = "Mark of Moon" - desc = "Your Mansus Grasp now applies the Mark of Moon, pacifying the victim until attacked. \ - The mark can also be triggered from an attack with your Moon Blade, leaving the victim confused." - gain_text = "The troupe on the moon would dance all day long \ - and in that dance the moon would smile upon us \ - but when the night came its smile would dull forced to gaze on the earth." - mark_type = /datum/status_effect/eldritch/moon - -/datum/heretic_knowledge/knowledge_ritual/moon - -/datum/heretic_knowledge/spell/moon_parade - name = "Lunar Parade" - desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ - when hitting someone they are forced to join the parade and suffer hallucinations." - gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" - action_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade - cost = 1 + action_to_add = /datum/action/cooldown/spell/pointed/mind_gate + cost = 2 /datum/heretic_knowledge/moon_amulet name = "Moonlight Amulet" desc = "Allows you to transmute 2 sheets of glass, a heart and a tie to create a Moonlight Amulet. \ If the item is used on someone with low sanity they go berserk attacking everyone, \ - if their sanity isn't low enough it decreases their mood." + if their sanity isn't low enough it decreases their mood. \ + Wearing this will grant you the ability to see heathens through walls and make your blades harmless, they will instead directly attack their mind. \ + Provides thermal vision and doubles the brain regen of a moon heretic while worn." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." required_atoms = list( @@ -105,19 +111,41 @@ /obj/item/clothing/neck/tie = 1, ) result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulet) - cost = 1 - + cost = 2 research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "moon_amulette" research_tree_icon_frame = 9 +/datum/heretic_knowledge/armor/moon + desc = "Allows you to transmute a table (or a suit), a mask and two sheets of glass to create a Resplendant Regalia, this robe will render the user fully immune to disabling effects and convert all forms of damage into brain damage, while also pacifying the user and render him unable to use ranged weapons (Moon blade will bypass pacifism). \ + Acts as a focus while hooded." + gain_text = "Trails of light and mirth flowed from every arm of this magnificent attire. \ + The troupe twirled in irridescent cascades, dazzling onlookers with the truth they sought. \ + I observed, basking in the light, to find my self." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/moon) + research_tree_icon_state = "moon_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/stack/sheet/glass = 2, + ) + +/datum/heretic_knowledge/spell/moon_parade + name = "Lunar Parade" + desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ + when hitting someone they are forced to join the parade and suffer hallucinations." + gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" + action_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade + cost = 2 + drafting_tier = 5 + /datum/heretic_knowledge/blade_upgrade/moon name = "Moonlight Blade" - desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage." + desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage. \ + Deals more brain damage if your victim is insane or unconscious." gain_text = "His wit was sharp as a blade, cutting through the lie to bring us joy." - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_moon" @@ -125,16 +153,19 @@ if(source == target || !isliving(target)) return - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(target.can_block_magic(MAGIC_RESISTANCE_MOON)) return - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) target.cause_hallucination( \ get_random_valid_hallucination_subtype(/datum/hallucination/body), \ "upgraded path of moon blades", \ ) target.emote(pick("giggle", "laugh")) - target.mob_mood.adjust_sanity(-10) + target.mob_mood?.adjust_sanity(-10) + if(target.stat == CONSCIOUS && target.mob_mood?.sanity >= SANITY_NEUTRAL) + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) + return + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25) /datum/heretic_knowledge/spell/moon_ringleader name = "Ringleaders Rise" @@ -145,17 +176,17 @@ The ringleader pointed up and the dim light of truth illuminated us further." action_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader - cost = 1 - + cost = 2 research_tree_icon_frame = 5 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/moon_final name = "The Last Act" desc = "The ascension ritual of the Path of Moon. \ Bring 3 corpses with more than 50 brain damage to a transmutation rune to complete the ritual. \ When completed, you become a harbinger of madness gaining and aura of passive sanity decrease, \ - confusion increase and, if their sanity is low enough, brain damage and blindness. \ + crewmembers with low enough sanity will be converted into acolytes. \ 1/5th of the crew will turn into acolytes and follow your command, they will all receive moonlight amulets." gain_text = "We dived down towards the crowd, his soul splitting off in search of greater venture \ for where the Ringleader had started the parade, I shall continue it unto the suns demise \ @@ -198,62 +229,91 @@ var/max_lunatics = ceil(max(length(GLOB.manifest.locked), length(lunatic_candidates)) * 0.2) for(var/mob/living/carbon/human/crewmate as anything in lunatic_candidates) - // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp - if(IS_HERETIC_OR_MONSTER(crewmate)) - to_chat(crewmate, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) - continue - // Mindshielded and anti-magic folks are immune against this effect because this is a magical mind effect - if(HAS_MIND_TRAIT(crewmate, TRAIT_UNCONVERTABLE) || crewmate.can_block_magic(MAGIC_RESISTANCE)) - to_chat(crewmate, span_boldwarning("You feel shielded from something." )) - continue if(amount_of_lunatics > max_lunatics) to_chat(crewmate, span_boldwarning("You feel uneasy, as if for a brief moment something was gazing at you.")) continue - var/datum/antagonist/lunatic/lunatic = crewmate.mind.add_antag_datum(/datum/antagonist/lunatic) - lunatic.set_master(user.mind, user) - var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet = new(crewmate.drop_location()) - var/static/list/slots = list( - LOCATION_NECK, - LOCATION_HANDS, - LOCATION_RPOCKET, - LOCATION_LPOCKET, - LOCATION_BACKPACK, - ) - crewmate.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) - crewmate.emote("laugh") - amount_of_lunatics++ + if(attempt_conversion(crewmate, user)) + amount_of_lunatics++ + +/datum/heretic_knowledge/ultimate/moon_final/proc/attempt_conversion(mob/living/carbon/convertee, mob/user) + // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp + if(IS_HERETIC_OR_MONSTER(convertee)) + to_chat(convertee, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) + return FALSE + // Mindshielded and anti-magic folks are immune against this effect because this is a magical mind effect + if(HAS_MIND_TRAIT(convertee, TRAIT_UNCONVERTABLE) || convertee.can_block_magic(MAGIC_RESISTANCE)) + to_chat(convertee, span_boldwarning("You feel shielded from something." )) + return FALSE + + if(!convertee.mind) + return FALSE + + var/datum/antagonist/lunatic/lunatic = convertee.mind.add_antag_datum(/datum/antagonist/lunatic) + lunatic.set_master(user.mind, user) + var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet = new(convertee.drop_location()) + var/static/list/slots = list( + LOCATION_NECK, + LOCATION_HANDS, + LOCATION_RPOCKET, + LOCATION_LPOCKET, + LOCATION_BACKPACK, + ) + convertee.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) + INVOKE_ASYNC(convertee, TYPE_PROC_REF(/mob, emote), "laugh") + return TRUE /datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - visible_hallucination_pulse( center = get_turf(source), radius = 7, hallucination_duration = 60 SECONDS ) - for(var/mob/living/carbon/carbon_view in view(5, source)) + for(var/mob/living/carbon/carbon_view in range(7, source)) + var/carbon_sanity = carbon_view.mob_mood.sanity if(carbon_view.stat != CONSCIOUS) continue if(IS_HERETIC_OR_MONSTER(carbon_view)) continue - if(carbon_view.can_block_magic(MAGIC_RESISTANCE_MIND)) //Somehow a shitty piece of tinfoil is STILL able to hold out against the power of an ascended heretic. + if(carbon_view.can_block_magic(MAGIC_RESISTANCE_MOON)) //Somehow a shitty piece of tinfoil is STILL able to hold out against the power of an ascended heretic. continue new /obj/effect/temp_visual/moon_ringleader(get_turf(carbon_view)) + if(carbon_view.has_status_effect(/datum/status_effect/confusion)) + to_chat(carbon_view, span_big(span_hypnophrase("YOUR HEAD RATTLES WITH A THOUSAND VOICES JOINED IN A MADDENING CACOPHONY OF SOUND AND MUSIC. EVERY FIBER OF YOUR BEING SAYS 'RUN'."))) carbon_view.adjust_confusion(2 SECONDS) - carbon_view.mob_mood.adjust_sanity(-5) - var/carbon_sanity = carbon_view.mob_mood.sanity - if(carbon_sanity < 30) - if(SPT_PROB(20, seconds_per_tick)) - to_chat(carbon_view, span_warning("you feel your mind beginning to rend!")) - carbon_view.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + carbon_view.mob_mood.adjust_sanity(-20) - if(carbon_sanity < 10) - if(SPT_PROB(20, seconds_per_tick)) - to_chat(carbon_view, span_warning("it echoes through you!")) - visible_hallucination_pulse( - center = get_turf(carbon_view), - radius = 7, - hallucination_duration = 50 SECONDS - ) - carbon_view.adjust_temp_blindness(5 SECONDS) + if(carbon_sanity >= 10) + return + // So our sanity is dead, time to fuck em up + if(SPT_PROB(20, seconds_per_tick)) + to_chat(carbon_view, span_warning("it echoes through you!")) + visible_hallucination_pulse( + center = get_turf(carbon_view), + radius = 7, + hallucination_duration = 50 SECONDS + ) + carbon_view.adjust_temp_blindness(5 SECONDS) + if(should_mind_explode(carbon_view)) + to_chat(carbon_view, span_boldbig(span_red(\ + "YOUR SENSES REEL AS YOUR MIND IS ENVELOPED BY AN OTHERWORLDLY FORCE ATTEMPTING TO REWRITE YOUR VERY BEING. \ + YOU CANNOT EVEN BEGIN TO SCREAM BEFORE YOUR IMPLANT ACTIVATES ITS PSIONIC FAIL-SAFE PROTOCOL, TAKING YOUR HEAD WITH IT."))) + var/obj/item/bodypart/head/head = locate() in carbon_view.bodyparts + if(head) + head.dismember() + else + carbon_view.gib(DROP_ALL_REMAINS) + var/datum/effect_system/reagents_explosion/explosion = new() + explosion.set_up(1, get_turf(carbon_view), TRUE, 0) + explosion.start(src) + else + attempt_conversion(carbon_view, source) + + +/datum/heretic_knowledge/ultimate/moon_final/proc/should_mind_explode(mob/living/carbon/target) + if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + return TRUE + if(IS_CULTIST_OR_CULTIST_MOB(target)) + return TRUE + return FALSE diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 4a60d372445..6f701ef761b 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -1,20 +1,53 @@ - -/datum/heretic_knowledge_tree_column/main/rust - neighbour_type_left = /datum/heretic_knowledge_tree_column/blade_to_rust - neighbour_type_right = /datum/heretic_knowledge_tree_column/rust_to_cosmic - +/datum/heretic_knowledge_tree_column/rust route = PATH_RUST ui_bgr = "node_rust" + complexity = "Medium" + complexity_color = COLOR_YELLOW + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "rust_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Rust revolves around durability, corruption and brute forcing your way through obstacles.", + "Pick this path if you enjoy a standing your ground and letting the fight come to you.", + ) + pros = list( + "Standing on rusted tiles makes you highly durable; regenerating wounds and removing stuns.", + "Rusted tiles harm your foes and slow them down.", + "You are able to destroy walls, objects, mechs, structures and airlocks with ease.", + "You can instantly obliterate silicons or synthetic crew members with your Mansus Grasp.", + "You have a high amount of disruption abilities to make it easier to fight in your territory.", + ) + cons = list( + "Extremely overt; throws stealth completely out as an option.", + "If you are not on rusted tiles, you become significantly more vulnerable.", + "Being locked to a territorial conflict makes it much easier to use destructive tools (like bombs) against you.", + "Your high amount of defensive power is at the cost of offensive power.", + ) + tips = list( + "Your Mansus Grasp will instantly destroy mechs, silicons and androids. Hitting a marked target with your blade will cause heavy disgust and make them vomit, knocking them down briefly.", + "Your Mansus Grasp and your spells are capable of rusting walls and floors, making them beneficial to you and harmful to the crew and silicons. Spread rust as much as possible.", + "Rusted turfs will heal you, regulate your blood temperature, make you resistant to batons knockdown, regenerate your stamina and blood and heal your wound and limbs once you level up your passive.", + "Always fight on your turf. Your opponent entering your turf are at a significant disadvantage.", + "Your Reassembled Raiment is only empowered while you are on your rusted tiles. If you want the most out of its power, stay on your rusted tiles.", + "Your ability to destroy objects and walls improves as your passive ugprade increases; eventually you will be able to melt through airlocks, reinforced walls and even titanium walls.", + "Spreading rust can be fairly slow, especially early on. Consider summoning a few rust walkers to help you expand your domain.", + "Rusted Construction allows you to produce barriers for cover or escape, or even block off someone else's escape in a pinch. Make the most of it to manipulate the environment to your needs.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_rust - grasp = /datum/heretic_knowledge/rust_fist - tier1 = /datum/heretic_knowledge/rust_regen - mark = /datum/heretic_knowledge/mark/rust_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/rust - unique_ability = /datum/heretic_knowledge/spell/rust_construction - tier2 = /datum/heretic_knowledge/spell/area_conversion + knowledge_tier1 = /datum/heretic_knowledge/spell/area_conversion + guaranteed_side_tier1 = /datum/heretic_knowledge/rust_sower + knowledge_tier2 = /datum/heretic_knowledge/spell/rust_construction + guaranteed_side_tier2 = /datum/heretic_knowledge/summon/rusty + robes = /datum/heretic_knowledge/armor/rust + knowledge_tier3 = /datum/heretic_knowledge/spell/entropic_plume + guaranteed_side_tier3 = /datum/heretic_knowledge/crucible blade = /datum/heretic_knowledge/blade_upgrade/rust - tier3 = /datum/heretic_knowledge/spell/entropic_plume + knowledge_tier4 = /datum/heretic_knowledge/spell/rust_charge ascension = /datum/heretic_knowledge/ultimate/rust_final /datum/heretic_knowledge/limited_amount/starting/base_rust @@ -30,34 +63,34 @@ result_atoms = list(/obj/item/melee/sickly_blade/rust) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "rust_blade" + mark_type = /datum/status_effect/eldritch/rust + eldritch_passive = /datum/status_effect/heretic_passive/rust -/datum/heretic_knowledge/rust_fist - name = "Grasp of Rust" - desc = "Your Mansus Grasp will deal 500 damage to non-living matter and rust any surface it touches. \ - Already rusted surfaces are destroyed. Surfaces and structures can only be rusted by using Right-Click. \ - Allows you to rust basic iron walls and floors." - gain_text = "On the ceiling of the Mansus, rust grows as moss does on a stone." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_rust" - -/datum/heretic_knowledge/rust_fist/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) - our_heretic.increase_rust_strength() + user.RemoveElement(/datum/element/leeching_walk/minor) -/datum/heretic_knowledge/rust_fist/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, list(COMSIG_HERETIC_MANSUS_GRASP_ATTACK, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY)) +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + . = ..() + UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY) + user.AddElement(/datum/element/leeching_walk/minor) -/datum/heretic_knowledge/rust_fist/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_rust/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() + + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + for(var/obj/item/bodypart/robotic_limb as anything in carbon_target.bodyparts) + if(IS_ROBOTIC_LIMB(robotic_limb)) + robotic_limb.receive_damage(500) if(!issilicon(target) && !(target.mob_biotypes & MOB_ROBOTIC)) return source.do_rust_heretic_act(target) -/datum/heretic_knowledge/rust_fist/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) +/datum/heretic_knowledge/limited_amount/starting/base_rust/proc/on_secondary_mansus_grasp(mob/living/source, atom/target) SIGNAL_HANDLER // Rusting an airlock causes it to lose power, mostly to prevent the airlock from shocking you. @@ -69,20 +102,14 @@ source.do_rust_heretic_act(target) return COMPONENT_USE_HAND -/datum/heretic_knowledge/rust_regen - name = "Leeching Walk" - desc = "Grants you passive healing and resistance to batons while standing over rust." - gain_text = "The speed was unparalleled, the strength unnatural. The Blacksmith was smiling." - cost = 1 - research_tree_icon_path = 'icons/effects/eldritch.dmi' - research_tree_icon_state = "cloud_swirl" +/datum/heretic_knowledge/spell/rust_charge + name = "Rust Charge" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge." + gain_text = "The hills sparkled now, as I neared them my mind began to wander. I quickly regained my resolve and pushed forward, this last leg would be the most treacherous." - -/datum/heretic_knowledge/rust_regen/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - user.AddElement(/datum/element/leeching_walk) - -/datum/heretic_knowledge/rust_regen/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - user.RemoveElement(/datum/element/leeching_walk) + action_to_add = /datum/action/cooldown/mob_cooldown/charge/rust + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/mark/rust_mark name = "Mark of Rust" @@ -90,13 +117,6 @@ When triggered, your victim will suffer heavy disgust and confusion. \ Allows you to rust reinforced walls and floors as well as plasteel." gain_text = "The Blacksmith looks away. To a place lost long ago. \"Rusted Hills help those in dire need... at a cost.\"" - mark_type = /datum/status_effect/eldritch/rust - -/datum/heretic_knowledge/mark/rust_mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength() - -/datum/heretic_knowledge/knowledge_ritual/rust /datum/heretic_knowledge/spell/rust_construction name = "Rust Construction" @@ -105,7 +125,21 @@ gain_text = "Images of foreign and ominous structures began to dance in my mind. Covered head to toe in thick rust, \ they no longer looked man made. Or perhaps they never were in the first place." action_to_add = /datum/action/cooldown/spell/pointed/rust_construction - cost = 1 + cost = 2 + +/datum/heretic_knowledge/armor/rust + desc = "Allows you to transmute a table (or a suit), a mask and any trash item to create a Salvaged Remains. \ + Has extra armor, tackle resistance and syringe immunity while standing on rust. \ + Acts as a focus while hooded." + gain_text = "From beneath warped scrap, the Blacksmith pulls forth an ancient fabric. \ + \"Whatever this once stood for is lost. So now, we give it new purpose.\"" + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust) + research_tree_icon_state = "rust_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + /obj/item/trash = 1, + ) /datum/heretic_knowledge/spell/area_conversion name = "Aggressive Spread" @@ -113,13 +147,9 @@ Already rusted surfaces are destroyed \ Also improves the rusting abilities of non rust-heretics." gain_text = "All wise men know well not to visit the Rusted Hills... Yet the Blacksmith's tale was inspiring." action_to_add = /datum/action/cooldown/spell/aoe/rust_conversion - cost = 1 + cost = 2 research_tree_icon_frame = 5 -/datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength(TRUE) - /datum/heretic_knowledge/blade_upgrade/rust name = "Toxic Blade" desc = "Your Rusty Blade now disgusts enemies on attack \ Allows you to rust Titanium and Plastitanium.." @@ -128,10 +158,6 @@ research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_rust" -/datum/heretic_knowledge/blade_upgrade/rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - . = ..() - our_heretic.increase_rust_strength() - /datum/heretic_knowledge/blade_upgrade/rust/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target || !isliving(target)) return @@ -139,6 +165,7 @@ /datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() + /datum/heretic_knowledge/spell/entropic_plume name = "Entropic Plume" desc = "Grants you Entropic Plume, a spell that releases a vexing wave of Rust. \ @@ -148,14 +175,8 @@ The Blacksmith was gone, and you hold their blade. Champions of hope, the Rustbringer is nigh!" action_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume - cost = 1 - - - -/datum/heretic_knowledge/spell/entropic_plume/on_gain(mob/user) - . = ..() - var/datum/antagonist/heretic/our_heretic = GET_HERETIC(user) - our_heretic.increase_rust_strength(TRUE) + cost = 2 + drafting_tier = 5 /datum/heretic_knowledge/ultimate/rust_final name = "Rustbringer's Oath" @@ -234,7 +255,7 @@ for (var/iterator in 1 to greatest_dist) if(!turfs_to_transform["[iterator]"]) continue - addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator) + addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (2 SECONDS) * iterator) /datum/heretic_knowledge/ultimate/rust_final/proc/transform_area(list/turfs) turfs = shuffle(turfs) @@ -287,7 +308,7 @@ return var/need_mob_update = FALSE - var/base_heal_amt = 2.5 * DELTA_WORLD_TIME(SSmobs) + var/base_heal_amt = 1 * DELTA_WORLD_TIME(SSmobs) need_mob_update += source.adjustBruteLoss(-base_heal_amt, updating_health = FALSE) need_mob_update += source.adjustFireLoss(-base_heal_amt, updating_health = FALSE) need_mob_update += source.adjustToxLoss(-base_heal_amt, updating_health = FALSE, forced = TRUE) diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm similarity index 95% rename from code/modules/antagonists/heretic/knowledge/general_side.dm rename to code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm index f45ab5f55c7..098bc923ad2 100644 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/reroll_targets.dm @@ -1,4 +1,6 @@ -// Some general sidepath options. +/*! + * Contains the reroll targets knowledge perk + */ /datum/heretic_knowledge/reroll_targets name = "The Relentless Heartbeat" @@ -13,9 +15,10 @@ cost = 0 // BUBBER EDIT - Original 1 research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' research_tree_icon_state = "gaze" + is_shop_only = TRUE + drafting_tier = 2 /datum/heretic_knowledge/reroll_targets/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) // Check first if they have a Living Heart. If it's missing, we should // throw a fail to show the heretic that there's no point in rerolling diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 82ea0bbe6d1..644f0242a5f 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -221,11 +221,11 @@ heretic_datum.total_sacrifices++ check_sacrifice_total(user, heretic_datum) //BUBBER EDIT if((sac_job_flag & JOB_HEAD_OF_STAFF)) - heretic_datum.knowledge_points += 3 + heretic_datum.adjust_knowledge_points(3) heretic_datum.high_value_sacrifices++ feedback += " graciously" if(cultist_datum) - heretic_datum.knowledge_points += 1 + heretic_datum.adjust_knowledge_points(1) grant_reward(user, sacrifice, loc) // easier to read var/rewards_given = heretic_datum.rewards_given @@ -244,7 +244,7 @@ to_chat(user, non_flavor_warning) return else - heretic_datum.knowledge_points += 2 + heretic_datum.adjust_knowledge_points(2) to_chat(user, span_hypnophrase("[feedback].")) if(!begin_sacrifice(sacrifice)) @@ -349,7 +349,7 @@ brain.leave_modsuit() //BUBBERSTATION EDIT END sac_target.visible_message(span_danger("[sac_target] begins to shudder violenty as dark tendrils begin to drag them into thin air!")) - sac_target.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult(sac_target)) + sac_target.equip_to_slot_or_del(new /obj/item/restraints/handcuffs/cult, ITEM_SLOT_HANDCUFFED, indirect_action = TRUE) sac_target.dropItemToGround(sac_target.legcuffed, TRUE) sac_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 85, 150) @@ -515,7 +515,7 @@ sac_target.clear_mood_event("shadow_realm") if(IS_HERETIC(sac_target)) var/datum/antagonist/heretic/victim_heretic = sac_target.mind?.has_antag_datum(/datum/antagonist/heretic) - victim_heretic.knowledge_points -= 3 + victim_heretic.adjust_knowledge_points(-3) // Wherever we end up, we sure as hell won't be able to explain sac_target.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/slurring/heretic) diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm deleted file mode 100644 index 35b5ae382d1..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/heretic_knowledge_tree_column/ash_to_moon - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/ash - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/moon - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/medallion - tier2 = /datum/heretic_knowledge/ether - tier3 = /datum/heretic_knowledge/summon/ashy - -// Sidepaths for knowledge between Ash and Flesh. -/datum/heretic_knowledge/medallion - name = "Ashen Eyes" - desc = "Allows you to transmute a pair of eyes, a candle, and a glass shard into an Eldritch Medallion. \ - The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus." - gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." - - required_atoms = list( - /obj/item/organ/eyes = 1, - /obj/item/shard = 1, - /obj/item/flashlight/flare/candle = 1, - ) - result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "eye_medalion" - -/datum/heretic_knowledge/ether - name = "Ether Of The Newborn" - desc = "Transmutes a pool of vomit and a shard into a single use potion, drinking it will remove any sort of abnormality from your body including diseases, traumas and implants \ - on top of restoring it to full health, at the cost of losing consciousness for an entire minute." - gain_text = "Vision and thought grow hazy as the fumes of this ichor swirl up to meet me. \ - Through the haze, I find myself staring back in relief, or something grossly resembling my visage. \ - It is this wretched thing that I consign to my fate, and whose own that I snatch through the haze of dreams. Fools that we are." - required_atoms = list( - /obj/item/shard = 1, - /obj/effect/decal/cleanable/vomit = 1, - ) - result_atoms = list(/obj/item/ether) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "poison_flask" - -/datum/heretic_knowledge/summon/ashy - name = "Ashen Ritual" - desc = "Allows you to transmute a head, a pile of ash, and a book to create an Ash Spirit. \ - Ash Spirits have a short range jaunt and the ability to cause bleeding in foes at range. \ - They also have the ability to create a ring of fire around themselves for a length of time." - gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." - - required_atoms = list( - /obj/effect/decal/cleanable/ash = 1, - /obj/item/bodypart/head = 1, - /obj/item/book = 1, - ) - mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit - cost = 1 - - poll_ignore_define = POLL_IGNORE_ASH_SPIRIT - diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm deleted file mode 100644 index 8f9a595859f..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/heretic_knowledge_tree_column/blade_to_rust - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/blade - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/rust - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/armor - tier2 = list(/datum/heretic_knowledge/crucible, /datum/heretic_knowledge/rifle) - tier3 = list(/datum/heretic_knowledge/spell/rust_charge, /datum/heretic_knowledge/greaves_of_the_prophet) - -// Sidepaths for knowledge between Rust and Blade. -/datum/heretic_knowledge/armor - name = "Armorer's Ritual" - desc = "Allows you to transmute a table and a gas mask to create Eldritch Armor. \ - Eldritch Armor provides great protection while also acting as a focus when hooded." - gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity. And the Blacksmith \ - returned their generosity in kind." - - required_atoms = list( - /obj/structure/table = 1, - /obj/item/clothing/mask/gas = 1, - ) - result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) - cost = 1 - - research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' - research_tree_icon_state = "eldritch_armor" - research_tree_icon_frame = 12 - - -/datum/heretic_knowledge/crucible - name = "Mawed Crucible" - desc = "Allows you to transmute a portable water tank and a table to create a Mawed Crucible. \ - The Mawed Crucible can brew powerful potions for combat and utility, but must be fed bodyparts and organs between uses." - gain_text = "This is pure agony. I wasn't able to summon the figure of the Aristocrat, \ - but with the Priest's attention I stumbled upon a different recipe..." - - required_atoms = list( - /obj/structure/reagent_dispensers/watertank = 1, - /obj/structure/table = 1, - ) - result_atoms = list(/obj/structure/destructible/eldritch_crucible) - cost = 1 - - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "crucible" - - -/datum/heretic_knowledge/rifle - name = "Lionhunter's Rifle" - desc = "Allows you to transmute a piece of wood, with hide \ - from any animal,and a camera to create the Lionhunter's rifle. \ - The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ - These shots function as normal, albeit weak high-caliber munitions when fired from \ - close range or at inanimate objects. You can aim the rifle at distant foes, \ - causing the shot to mark your victim with your grasp and teleport you directly to them." - gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ - I could not purchase it at the time, but they showed me how they made it ages ago." - - required_atoms = list( - /obj/item/stack/sheet/mineral/wood = 1, - /obj/item/stack/sheet/animalhide = 1, - /obj/item/camera = 1, - ) - result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) - cost = 1 - - - research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' - research_tree_icon_state = "goldrevolver" - -/datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition" - desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ - including shotgun shells to create an extra clip of ammunition for the Lionhunter Rifle." - gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ - They were very effective, for simple iron, but used up quickly. I soon ran out. \ - No replacement munitions worked in their stead. It was peculiar in what it wanted." - required_atoms = list( - /obj/item/ammo_casing = 3, - ) - result_atoms = list(/obj/item/ammo_box/speedloader/strilka310/lionhunter) - cost = 0 - - research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' - research_tree_icon_state = "310_strip" - - /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. - var/static/list/caliber_blacklist = list( - CALIBER_LASER, - CALIBER_ENERGY, - CALIBER_FOAM, - CALIBER_ARROW, - CALIBER_HARPOON, - CALIBER_HOOK, - ) - -/datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) - for(var/obj/item/ammo_casing/casing in atoms) - if(!(casing.caliber in caliber_blacklist)) - continue - - // Remove any casings in the caliber_blacklist list from atoms - atoms -= casing - - // We removed any invalid casings from the atoms list, - // return to allow the ritual to fill out selected atoms with the new list - return TRUE - -/datum/heretic_knowledge/spell/rust_charge - name = "Rust Charge" - desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge." - gain_text = "The hills sparkled now, as I neared them my mind began to wander. I quickly regained my resolve and pushed forward, this last leg would be the most treacherous." - - action_to_add = /datum/action/cooldown/mob_cooldown/charge/rust - cost = 1 - -/datum/heretic_knowledge/greaves_of_the_prophet - name = "Greaves Of The Prophet" - desc = "Allows you to combine a pair of Jackboots and 2 sheets of Titanium into a pair of Armored Greaves, they confer to the user fully immunity to slips." - gain_text = " \ - Gristle churns into joint, a pop, and the fool twists a blackened foot from the \ - jaws of another. At their game for centuries, this mangled tree of limbs twists, \ - thrashing snares buried into snarling gums, seeking to shred the weight of grafted \ - neighbors. Weighed down by lacerated feet, this canopy of rancid idiots ever seeks \ - the undoing of its own bonds. I dread the thought of walking in their wake, but \ - I must press on all the same. Their rhythms keep the feud fresh with indifference \ - to barrier or border. Pulling more into their turmoil as they waltz." - cost = 1 - required_atoms = list( - /obj/item/clothing/shoes/jackboots = 1, - /obj/item/stack/sheet/mineral/titanium = 2, - ) - result_atoms = list(/obj/item/clothing/shoes/greaves_of_the_prophet) - research_tree_icon_path = 'icons/obj/clothing/shoes.dmi' - research_tree_icon_state = "hereticgreaves" diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm deleted file mode 100644 index d15bb242989..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/heretic_knowledge_tree_column/cosmic_to_ash - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/cosmic - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/ash - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/summon/fire_shark - tier2 = /datum/heretic_knowledge/spell/space_phase - tier3 = /datum/heretic_knowledge/eldritch_coin - - -// Sidepaths for knowledge between Cosmos and Ash. - -/datum/heretic_knowledge/summon/fire_shark - name = "Scorching Shark" - desc = "Allows you to transmute a pool of ash, a liver, and a sheet of plasma into a Fire Shark. \ - Fire Sharks are fast and strong in groups, but die quickly. They are also highly resistant against fire attacks. \ - Fire Sharks inject phlogiston into its victims and spawn plasma once they die." - gain_text = "The cradle of the nebula was cold, but not dead. Light and heat flits even through the deepest darkness, and is hunted by its own predators." - - required_atoms = list( - /obj/effect/decal/cleanable/ash = 1, - /obj/item/organ/liver = 1, - /obj/item/stack/sheet/mineral/plasma = 1, - ) - mob_to_summon = /mob/living/basic/heretic_summon/fire_shark - cost = 1 - - poll_ignore_define = POLL_IGNORE_FIRE_SHARK - - research_tree_icon_dir = EAST - -/datum/heretic_knowledge/spell/space_phase - name = "Space Phase" - desc = "Grants you Space Phase, a spell that allows you to move freely through space. \ - You can only phase in and out when you are on a space or misc turf." - gain_text = "You feel like your body can move through space as if you where dust." - - action_to_add = /datum/action/cooldown/spell/jaunt/space_crawl - cost = 1 - - - research_tree_icon_frame = 6 - -/datum/heretic_knowledge/eldritch_coin - name = "Eldritch Coin" - desc = "Allows you to transmute a sheet of plasma and a diamond to create an Eldritch Coin. \ - The coin will open or close nearby doors when landing on heads and toggle their bolts \ - when landing on tails. If you insert the coin into an airlock, it will be consumed \ - to fry its electronics, opening the airlock permanently unless bolted. " - gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." - - required_atoms = list( - /obj/item/stack/sheet/mineral/diamond = 1, - /obj/item/stack/sheet/mineral/plasma = 1, - ) - result_atoms = list(/obj/item/coin/eldritch) - cost = 1 - - research_tree_icon_path = 'icons/obj/economy.dmi' - research_tree_icon_state = "coin_heretic" - diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm deleted file mode 100644 index bd7f1cf621c..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/heretic_knowledge_tree_column/flesh_to_void - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/flesh - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/void - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/void_cloak - tier2 = /datum/heretic_knowledge/spell/blood_siphon - tier3 = list(/datum/heretic_knowledge/spell/void_prison, /datum/heretic_knowledge/spell/cleave) - -// Sidepaths for knowledge between Flesh and Void. - -/datum/heretic_knowledge/void_cloak - name = "Void Cloak" - desc = "Allows you to transmute a glass shard, a bedsheet, and any outer clothing item (such as armor or a suit jacket) \ - to create a Void Cloak. While the hood is down, the cloak functions as a focus, \ - and while the hood is up, the cloak is completely invisible. It also provide decent armor and \ - has pockets which can hold one of your blades, various ritual components (such as organs), and small heretical trinkets." - gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are." - - required_atoms = list( - /obj/item/shard = 1, - /obj/item/clothing/suit = 1, - /obj/item/bedsheet = 1, - ) - result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) - cost = 1 - - research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' - research_tree_icon_state = "void_cloak" - -/datum/heretic_knowledge/spell/blood_siphon - name = "Blood Siphon" - desc = "Grants you Blood Siphon, a spell that drains a victim of blood and health, transferring it to you. \ - Also has a chance to transfer wounds from you to the victim." - gain_text = "\"No matter the man, we bleed all the same.\" That's what the Marshal told me." - - action_to_add = /datum/action/cooldown/spell/pointed/blood_siphon - cost = 1 - -/datum/heretic_knowledge/spell/void_prison - name = "Void Prison" - desc = "Grants you Void Prison, a spell that places your victim into ball, making them unable to do anything or speak. \ - Applies void chill afterwards." - gain_text = "At first, I see myself, waltzing along a snow-laden street. \ - I try to yell, grab hold of this fool and tell them to run. \ - But the only welts made are on my own beating fist. \ - My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." - - action_to_add = /datum/action/cooldown/spell/pointed/void_prison - cost = 1 - -/datum/heretic_knowledge/spell/cleave - name = "Blood Cleave" - desc = "Grants you Cleave, an area-of-effect targeted spell \ - that causes heavy bleeding and blood loss to anyone afflicted." - gain_text = "At first I didn't understand these instruments of war, but the Priest \ - told me to use them regardless. Soon, he said, I would know them well." - - action_to_add = /datum/action/cooldown/spell/pointed/cleave - cost = 1 - - diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm new file mode 100644 index 00000000000..6fb91467717 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_four.dm @@ -0,0 +1,121 @@ +/*! + * Tier 4 knowledge: Combat related knowledge + */ + +/datum/heretic_knowledge/spell/space_phase + name = "Space Phase" + desc = "Grants you Space Phase, a spell that allows you to move freely through space. \ + You can only phase in and out when you are on a space or misc turf." + gain_text = "You feel like your body can move through space as if you where dust." + + action_to_add = /datum/action/cooldown/spell/jaunt/space_crawl + cost = 2 + research_tree_icon_frame = 6 + drafting_tier = 4 + +/datum/heretic_knowledge/unfathomable_curio + name = "Unfathomable Curio" + desc = "Allows you to transmute 3 rods, lungs and any belt into an Unfathomable Curio, \ + a belt that can hold blades and items for rituals. Whilst worn it will also \ + veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ + outside of combat." + gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." + + required_atoms = list( + /obj/item/organ/lungs = 1, + /obj/item/stack/rods = 3, + /obj/item/storage/belt = 1, + ) + result_atoms = list(/obj/item/storage/belt/unfathomable_curio) + cost = 2 + research_tree_icon_path = 'icons/obj/clothing/belts.dmi' + research_tree_icon_state = "unfathomable_curio" + drafting_tier = 4 + +/datum/heretic_knowledge/rust_sower + name = "Rust Sower Grenade" + desc = "Allows you to combine a chemical grenade casing and some moldy food to conjure a cursed grenade filled with Eldritch Rust, upon detonating it releases a huge cloud that blinds organics, rusts affected turfs and obliterates Silicons and Mechs." + gain_text = "The choked vines of the Rusted Hills are burdened with such overripe fruits. It undoes the markers of progress, leaving a clean slate to work into new shapes." + required_atoms = list( + list( + /obj/item/food/breadslice/moldy, + /obj/item/food/badrecipe/moldy, + /obj/item/food/deadmouse/moldy, + /obj/item/food/pizzaslice/moldy, + /obj/item/food/boiledegg/rotten, + /obj/item/food/egg/rotten + ) = 1, + /obj/item/grenade/chem_grenade = 1 + ) + result_atoms = list(/obj/item/grenade/chem_grenade/rust_sower) + cost = 2 + research_tree_icon_path = 'icons/obj/weapons/grenade.dmi' + research_tree_icon_state = "rustgrenade" + drafting_tier = 4 + +/datum/heretic_knowledge/spell/crimson_cleave + name = "Crimson Cleave" + desc = "Grants you Crimson Cleave, a targeted spell which siphons health in a small AOE. Cleanses all wounds upon casting" + gain_text = "At first I didn't understand these instruments of war, but the Priest \ + told me to use them regardless. Soon, he said, I would know them well." + action_to_add = /datum/action/cooldown/spell/pointed/crimson_cleave + cost = 2 + drafting_tier = 4 + +/datum/heretic_knowledge/rifle + name = "Lionhunter's Rifle" + desc = "Allows you to transmute a piece of wood, with hide \ + from any animal, and a camera to create the Lionhunter's rifle. \ + The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \ + These shots function as normal, albeit weak high-caliber munitions when fired from \ + close range or at inanimate objects. You can aim the rifle at distant foes, \ + causing the shot to mark your victim with your grasp and teleport you directly to them." + gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ + I could not purchase it at the time, but they showed me how they made it ages ago." + required_atoms = list( + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/animalhide = 1, + /obj/item/camera = 1, + ) + result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) + cost = 2 + research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' + research_tree_icon_state = "goldrevolver" + drafting_tier = 2 + +/datum/heretic_knowledge/rifle_ammo + name = "Lionhunter Rifle Ammunition" + desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ + including shotgun shells to create an extra clip of ammunition for the Lionhunter Rifle." + gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ + They were very effective, for simple iron, but used up quickly. I soon ran out. \ + No replacement munitions worked in their stead. It was peculiar in what it wanted." + required_atoms = list( + /obj/item/ammo_casing = 3, + ) + result_atoms = list(/obj/item/ammo_box/speedloader/strilka310/lionhunter) + cost = 0 + research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' + research_tree_icon_state = "310_strip" + + /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. + var/static/list/caliber_blacklist = list( + CALIBER_LASER, + CALIBER_ENERGY, + CALIBER_FOAM, + CALIBER_ARROW, + CALIBER_HARPOON, + CALIBER_HOOK, + ) + +/datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + for(var/obj/item/ammo_casing/casing in atoms) + if(!(casing.caliber in caliber_blacklist)) + continue + + // Remove any casings in the caliber_blacklist list from atoms + atoms -= casing + + // We removed any invalid casings from the atoms list, + // return to allow the ritual to fill out selected atoms with the new list + return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm new file mode 100644 index 00000000000..e8a3f9b4d67 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_one.dm @@ -0,0 +1,102 @@ +/*! + * Tier 1 knowledge: Stealth and general utility + */ + +/datum/heretic_knowledge/void_cloak + name = "Void Cloak" + desc = "Allows you to transmute a glass shard, a bedsheet, and any outer clothing item (such as armor or a suit jacket) \ + to create a Void Cloak. While the hood is down, the cloak functions as a focus and protects you from space. \ + While the hood is up, the cloak is completely invisible. It also provide decent armor and \ + has pockets which can hold one of your blades, various ritual components (such as organs), and small heretical trinkets." + gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are." + required_atoms = list( + /obj/item/shard = 1, + /obj/item/clothing/suit = 1, + /obj/item/bedsheet = 1, + ) + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) + cost = 1 + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "void_cloak" + drafting_tier = 1 + +/datum/heretic_knowledge/medallion + name = "Ashen Eyes" + desc = "Allows you to transmute a pair of eyes, a candle, and a glass shard into an Eldritch Medallion. \ + The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus." + gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." + required_atoms = list( + /obj/item/organ/eyes = 1, + /obj/item/shard = 1, + /obj/item/flashlight/flare/candle = 1, + ) + result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eye_medalion" + drafting_tier = 1 + +/datum/heretic_knowledge/essence // AKA Eldritch Flask + name = "Priest's Ritual" + desc = "Allows you to transmute a tank of water and a glass shard into a Flask of Eldritch Essence. \ + Eldritch Essence can be consumed for potent healing, or given to heathens for deadly poisoning." + gain_text = "This is an old recipe. The Owl whispered it to me. \ + Created by the Priest - the Liquid that both was and is not." + required_atoms = list( + /obj/structure/reagent_dispensers/watertank = 1, + /obj/item/shard = 1, + ) + result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eldritch_flask" + drafting_tier = 1 + +/datum/heretic_knowledge/phylactery + name = "Phylactery of Damnation" + desc = "Allows you to transmute a sheet of glass and a poppy into a Phylactery that can instantly draw blood, even from long distances. \ + Be warned, your target may still feel a prick." + gain_text = "A tincture twisted into the shape of a bloodsucker vermin. \ + Whether it chose the shape for itself, or this is the humor of the sickened mind that conjured this vile implement into being is something best not pondered." + required_atoms = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/food/grown/poppy = 1, + ) + result_atoms = list(/obj/item/reagent_containers/cup/phylactery) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "phylactery_2" + drafting_tier = 1 + +/datum/heretic_knowledge/crucible + name = "Mawed Crucible" + desc = "Allows you to transmute a portable water tank and a table to create a Mawed Crucible. \ + The Mawed Crucible can brew powerful potions for combat and utility, but must be fed bodyparts and organs between uses." + gain_text = "This is pure agony. I wasn't able to summon the figure of the Aristocrat, \ + but with the Priest's attention I stumbled upon a different recipe..." + required_atoms = list( + /obj/structure/reagent_dispensers/watertank = 1, + /obj/structure/table = 1, + ) + result_atoms = list(/obj/structure/destructible/eldritch_crucible) + cost = 1 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "crucible" + drafting_tier = 1 + +/datum/heretic_knowledge/eldritch_coin + name = "Eldritch Coin" + desc = "Allows you to transmute a sheet of plasma and a diamond to create an Eldritch Coin. \ + The coin will open or close nearby doors when landing on heads and toggle their bolts \ + when landing on tails. If you insert the coin into an airlock, it will be consumed \ + to fry its electronics, opening the airlock permanently unless bolted. " + gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." + required_atoms = list( + /obj/item/stack/sheet/mineral/diamond = 1, + /obj/item/stack/sheet/mineral/plasma = 1, + ) + result_atoms = list(/obj/item/coin/eldritch) + cost = 1 + research_tree_icon_path = 'icons/obj/economy.dmi' + research_tree_icon_state = "coin_heretic" + drafting_tier = 1 diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm similarity index 63% rename from code/modules/antagonists/heretic/knowledge/side_void_blade.dm rename to code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm index 86c0fd527ee..03b27b7965e 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_three.dm @@ -1,16 +1,58 @@ -// Sidepaths for knowledge between Void and Blade. +/*! + * Tier 3 knowledge: Summons + */ -/datum/heretic_knowledge_tree_column/void_to_blade - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/void - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/blade +/datum/heretic_knowledge/summon/rusty + name = "Rusted Ritual" + desc = "Allows you to transmute a pool of vomit, some cable coil, and 10 sheets of iron into a Rust Walker. \ + Rust Walkers excel at spreading rust and are moderately strong in combat." + gain_text = "I combined my knowledge of creation with my desire for corruption. The Marshal knew my name, and the Rusted Hills echoed out." + required_atoms = list( + /obj/effect/decal/cleanable/vomit = 1, + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/cable_coil = 15, + ) + mob_to_summon = /mob/living/basic/heretic_summon/rust_walker + cost = 2 + poll_ignore_define = POLL_IGNORE_RUST_SPIRIT + drafting_tier = 3 - route = PATH_SIDE +/datum/heretic_knowledge/summon/maid_in_mirror + name = "Maid in the Mirror" + desc = "Allows you to transmute five sheets of glass, any suit, and a pair of lungs to create a Maid in the Mirror. \ + Maid in the Mirrors are decent combatants that can become incorporeal by phasing in and out of the mirror realm, serving as powerful scouts and ambushers. \ + Their attacks also apply a stack of void chill." + gain_text = "Within each reflection, lies a gateway into an unimaginable world of colors never seen and \ + people never met. The ascent is glass, and the walls are knives. Each step is blood, if you do not have a guide." - tier1 = /datum/heretic_knowledge/limited_amount/risen_corpse - tier2 = /datum/heretic_knowledge/rune_carver - tier3 = /datum/heretic_knowledge/summon/maid_in_mirror + required_atoms = list( + /obj/item/stack/sheet/glass = 5, + /obj/item/clothing/suit = 1, + /obj/item/organ/lungs = 1, + ) + cost = 2 + mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror + poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR + drafting_tier = 3 +/datum/heretic_knowledge/summon/ashy + name = "Ashen Ritual" + desc = "Allows you to transmute a Bonfire and a book to create an Ash Spirit. \ + Ash Spirits have a short range jaunt and the ability to cause bleeding in foes at range. \ + They also have the ability to create a ring of fire around themselves for a length of time. \ + They have a low amount of health, but will passively recover given enough time to do so." + gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." + required_atoms = list( + /obj/effect/decal/cleanable/ash = 1, + /obj/item/book = 1, + /obj/structure/bonfire = 1, + ) + mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit + cost = 2 + + poll_ignore_define = POLL_IGNORE_ASH_SPIRIT + drafting_tier = 3 /// The max health given to Shattered Risen #define RISEN_MAX_HEALTH 125 @@ -30,11 +72,10 @@ /obj/item/clothing/gloves/latex = 1, ) limit = 1 - cost = 1 - + cost = 2 research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "ghoul_shattered" - + drafting_tier = 3 /datum/heretic_knowledge/limited_amount/risen_corpse/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -116,43 +157,22 @@ demolition_mod = 1.5 sharpness = SHARP_EDGED -/datum/heretic_knowledge/rune_carver - name = "Carving Knife" - desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \ - The Carving Knife allows you to etch difficult to see traps that trigger on heathens who walk overhead. \ - Also makes for a handy throwing weapon." - gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \ - I can carve the monolith to reveal the chains!" +/datum/heretic_knowledge/summon/fire_shark + name = "Scorching Shark" + desc = "Allows you to transmute a pool of ash, a liver, and a sheet of plasma into a Fire Shark. \ + Fire Sharks are fast and strong in groups, but die quickly. They are also highly resistant against fire attacks. \ + Fire Sharks inject phlogiston into its victims and spawn plasma once they die." + gain_text = "The cradle of the nebula was cold, but not dead. Light and heat flits even through the deepest darkness, and is hunted by its own predators." required_atoms = list( - /obj/item/knife = 1, - /obj/item/shard = 1, - /obj/item/paper = 1, + /obj/effect/decal/cleanable/ash = 1, + /obj/item/organ/liver = 1, + /obj/item/stack/sheet/mineral/plasma = 1, ) - result_atoms = list(/obj/item/melee/rune_carver) - cost = 1 + mob_to_summon = /mob/living/basic/heretic_summon/fire_shark + cost = 2 + poll_ignore_define = POLL_IGNORE_FIRE_SHARK - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "rune_carver" - -/datum/heretic_knowledge/summon/maid_in_mirror - name = "Maid in the Mirror" - desc = "Allows you to transmute five sheets of titanium, a flash, a suit of armor, and a pair of lungs \ - to create a Maid in the Mirror. Maid in the Mirrors are decent combatants that can become incorporeal by \ - phasing in and out of the mirror realm, serving as powerful scouts and ambushers. \ - However, they are weak to mortal gaze and take damage by being examined." - gain_text = "Within each reflection, lies a gateway into an unimaginable world of colors never seen and \ - people never met. The ascent is glass, and the walls are knives. Each step is blood, if you do not have a guide." - - required_atoms = list( - /obj/item/stack/sheet/mineral/titanium = 5, - /obj/item/clothing/suit/armor = 1, - /obj/item/assembly/flash = 1, - /obj/item/organ/lungs = 1, - ) - cost = 1 - - mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror - poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR - + research_tree_icon_dir = EAST + drafting_tier = 3 diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm similarity index 55% rename from code/modules/antagonists/heretic/knowledge/side_lock_moon.dm rename to code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm index 890a1458f05..9f28a066585 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_knowledge/tier_two.dm @@ -1,44 +1,107 @@ -/datum/heretic_knowledge_tree_column/moon_to_lock - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/moon - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/lock - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/spell/mind_gate - tier2 = list(/datum/heretic_knowledge/unfathomable_curio, /datum/heretic_knowledge/painting) - tier3 = /datum/heretic_knowledge/codex_morbus - -// Sidepaths for knowledge between Knock and Moon. - -/datum/heretic_knowledge/spell/mind_gate - name = "Mind Gate" - desc = "Grants you Mind Gate, a spell which inflicts hallucinations, \ - confusion, oxygen loss and brain damage to its target over 10 seconds.\ - The caster takes 20 brain damage per use." - gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." - - action_to_add = /datum/action/cooldown/spell/pointed/mind_gate - cost = 1 - -/datum/heretic_knowledge/unfathomable_curio - name = "Unfathomable Curio" - desc = "Allows you to transmute 3 rods, lungs and any belt into an Unfathomable Curio, \ - a belt that can hold blades and items for rituals. Whilst worn it will also \ - veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ - outside of combat." - gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." +/*! + * Tier 2 knowledge: Defensive tools and curses + */ +/** + * Codex Morbus, an upgrade to the base codex + * Functionally an upgraded version of the codex, but it also has the ability to cast curses by right clicking at a rune. + * Requires you to have the blood of your victim in your off-hand + */ +/datum/heretic_knowledge/codex_morbus + name = "Codex Morbus" + desc = "Allows you to to combine a codex cicatrix, and a body into a Codex Morbus. \ + It draws runes and siphons essences a bit faster. \ + Right Click on a rune to curse crewmembers, the target's blood is required in your off hand for a curse to take effect (Best combined with Phylactery Of Damnation)." + gain_text = "The spine of this leather-bound tome creaks with an eerily pained sigh. \ + To ply page from place takes considerable effort, and I dare not linger on the suggestions the book makes for longer than necessary. \ + It speaks of coming plagues, of waiting supplicants of dead and forgotten gods, and the undoing of mortal kind. \ + It speaks of needles to peel the skin of the world back and leaving it to fester. And it speaks to me by name." required_atoms = list( - /obj/item/organ/lungs = 1, - /obj/item/stack/rods = 3, - /obj/item/storage/belt = 1, + /obj/item/codex_cicatrix = 1, + /mob/living/carbon/human = 1, ) - result_atoms = list(/obj/item/storage/belt/unfathomable_curio) - cost = 1 + result_atoms = list(/obj/item/codex_cicatrix/morbus) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book_morbus" + drafting_tier = 2 - research_tree_icon_path = 'icons/obj/clothing/belts.dmi' - research_tree_icon_state = "unfathomable_curio" +/datum/heretic_knowledge/codex_morbus/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + var/mob/living/carbon/human/to_fuck_up = locate() in selected_atoms + for(var/_limb in to_fuck_up.bodyparts) + var/obj/item/bodypart/limb = _limb + limb.force_wound_upwards(/datum/wound/slash/flesh/critical) + for(var/obj/item/bodypart/limb as anything in to_fuck_up.bodyparts) + to_fuck_up.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, WOUND_SEVERITY_CRITICAL) + return TRUE +/datum/heretic_knowledge/greaves_of_the_prophet + name = "Greaves Of The Prophet" + desc = "Allows you to combine a pair of shoes and 2 sheets of titanium or silver into a pair of Armored Greaves, they confer to the user full immunity to slips." + gain_text = " \ + Gristle churns into joint, a pop, and the fool twists a blackened foot from the \ + jaws of another. At their game for centuries, this mangled tree of limbs twists, \ + thrashing snares buried into snarling gums, seeking to shred the weight of grafted \ + neighbors. Weighed down by lacerated feet, this canopy of rancid idiots ever seeks \ + the undoing of its own bonds. I dread the thought of walking in their wake, but \ + I must press on all the same. Their rhythms keep the feud fresh with indifference \ + to barrier or border. Pulling more into their turmoil as they waltz." + required_atoms = list( + /obj/item/clothing/shoes = 1, + list(/obj/item/stack/sheet/mineral/titanium, /obj/item/stack/sheet/mineral/silver) = 2, + ) + result_atoms = list(/obj/item/clothing/shoes/greaves_of_the_prophet) + cost = 2 + research_tree_icon_path = 'icons/obj/clothing/shoes.dmi' + research_tree_icon_state = "hereticgreaves" + drafting_tier = 2 + +/datum/heretic_knowledge/spell/opening_blast + name = "Wave Of Desperation" + desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \ + It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby. \ + However, you will fall unconscious a short time after casting this spell." + gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." + + action_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation + cost = 2 + drafting_tier = 2 + +/datum/heretic_knowledge/rune_carver + name = "Carving Knife" + desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \ + The Carving Knife allows you to etch difficult to see traps that trigger on heathens who walk overhead. \ + Also makes for a handy throwing weapon." + gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \ + I can carve the monolith to reveal the chains!" + required_atoms = list( + /obj/item/knife = 1, + /obj/item/shard = 1, + /obj/item/paper = 1, + ) + result_atoms = list(/obj/item/melee/rune_carver) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "rune_carver" + drafting_tier = 2 + +/datum/heretic_knowledge/ether + name = "Ether Of The Newborn" + desc = "Transmutes a pool of vomit and a shard into a single use potion, drinking it will remove any sort of abnormality from your body including diseases, traumas and implants \ + on top of restoring it to full health, at the cost of losing consciousness for an entire minute." + gain_text = "Vision and thought grow hazy as the fumes of this ichor swirl up to meet me. \ + Through the haze, I find myself staring back in relief, or something grossly resembling my visage. \ + It is this wretched thing that I consign to my fate, and whose own that I snatch through the haze of dreams. Fools that we are." + required_atoms = list( + /obj/item/shard = 1, + /obj/effect/decal/cleanable/vomit = 1, + ) + result_atoms = list(/obj/item/ether) + cost = 2 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "poison_flask" + drafting_tier = 2 /datum/heretic_knowledge/painting name = "Unsealed Arts" @@ -51,14 +114,12 @@ Master of the Rusted Mountain: Requires a piece of Trash. Curses non-heretics to rust the floor they walk on." gain_text = "A wind of inspiration blows through me. Beyond the veil and past the gate great works exist, yet to be painted. \ They yearn for mortal eyes, so I shall give them an audience." - required_atoms = list(/obj/item/canvas = 1) result_atoms = list(/obj/item/canvas) - cost = 1 - + cost = 2 research_tree_icon_path = 'icons/obj/signs.dmi' research_tree_icon_state = "eldritch_painting_weeping" - + drafting_tier = 2 /datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(locate(/obj/item/organ/eyes) in atoms) @@ -103,36 +164,3 @@ user.balloon_alert(user, "no additional atom present!") return FALSE - -/** - * Codex Morbus, an upgrade to the base codex - * Functionally an upgraded version of the codex, but it also has the ability to cast curses by right clicking at a rune. - * Requires you to have the blood of your victim in your off-hand - */ -/datum/heretic_knowledge/codex_morbus - name = "Codex Morbus" - desc = "Allows you to to combine a codex cicatrix, and a body into a Codex Morbus. \ - It draws runes and siphons essences a bit faster. \ - Right Click on a rune to curse crewmembers, the target's blood is required in your off hand for a curse to take effect (Best combined with Phylactery Of Damnation)." - gain_text = "The spine of this leather-bound tome creaks with an eerily pained sigh. \ - To ply page from place takes considerable effort, and I dare not linger on the suggestions the book makes for longer than necessary. \ - It speaks of coming plagues, of waiting supplicants of dead and forgotten gods, and the undoing of mortal kind. \ - It speaks of needles to peel the skin of the world back and leaving it to fester. And it speaks to me by name." - required_atoms = list( - /obj/item/codex_cicatrix = 1, - /mob/living/carbon/human = 1, - ) - result_atoms = list(/obj/item/codex_cicatrix/morbus) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "book_morbus" - -/datum/heretic_knowledge/codex_morbus/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) - . = ..() - var/mob/living/carbon/human/to_fuck_up = locate() in selected_atoms - for(var/_limb in to_fuck_up.bodyparts) - var/obj/item/bodypart/limb = _limb - limb.force_wound_upwards(/datum/wound/slash/flesh/critical) - for(var/obj/item/bodypart/limb as anything in to_fuck_up.bodyparts) - to_fuck_up.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, WOUND_SEVERITY_CRITICAL) - return TRUE diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm deleted file mode 100644 index 11d31a64ebe..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/heretic_knowledge_tree_column/lock_to_flesh - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/lock - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/flesh - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/phylactery - tier2 = /datum/heretic_knowledge/spell/opening_blast - tier3 = /datum/heretic_knowledge/spell/apetra_vulnera - -/** - * Phylactery of Damnation - */ -/datum/heretic_knowledge/phylactery - name = "Phylactery of Damnation" - desc = "Allows you to transmute a sheet of glass and a poppy into a Phylactery that can instantly draw blood, even from long distances. \ - Be warned, your target may still feel a prick." - gain_text = "A tincture twisted into the shape of a bloodsucker vermin. \ - Whether it chose the shape for itself, or this is the humor of the sickened mind that conjured this vile implement into being is something best not pondered." - required_atoms = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/food/grown/poppy = 1, - ) - result_atoms = list(/obj/item/reagent_containers/cup/phylactery) - cost = 1 - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "phylactery_2" - -// Sidepaths for knowledge between Knock and Flesh. -/datum/heretic_knowledge/spell/opening_blast - name = "Wave Of Desperation" - desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \ - It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby. \ - However, you will fall unconscious a short time after casting this spell." - gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." - - action_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation - cost = 1 - -/datum/heretic_knowledge/spell/apetra_vulnera - name = "Apetra Vulnera" - desc = "Grants you Apetra Vulnera, a spell \ - which causes heavy bleeding on all bodyparts of the victim that have more than 15 brute damage. \ - Wounds a random limb if no limb is sufficiently damaged." - gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease." - - action_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera - cost = 1 - - diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm deleted file mode 100644 index 998008e79ee..00000000000 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ /dev/null @@ -1,87 +0,0 @@ -/datum/heretic_knowledge_tree_column/rust_to_cosmic - neighbour_type_left = /datum/heretic_knowledge_tree_column/main/rust - neighbour_type_right = /datum/heretic_knowledge_tree_column/main/cosmic - - route = PATH_SIDE - - tier1 = /datum/heretic_knowledge/essence - tier2 = list(/datum/heretic_knowledge/entropy_pulse, /datum/heretic_knowledge/rust_sower) - tier3 = /datum/heretic_knowledge/summon/rusty - - -// Sidepaths for knowledge between Rust and Cosmos. - -/datum/heretic_knowledge/essence - name = "Priest's Ritual" - desc = "Allows you to transmute a tank of water and a glass shard into a Flask of Eldritch Essence. \ - Eldritch Essence can be consumed for potent healing, or given to heathens for deadly poisoning." - gain_text = "This is an old recipe. The Owl whispered it to me. \ - Created by the Priest - the Liquid that both was and is not." - - required_atoms = list( - /obj/structure/reagent_dispensers/watertank = 1, - /obj/item/shard = 1, - ) - result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) - cost = 1 - - - research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' - research_tree_icon_state = "eldritch_flask" - -/datum/heretic_knowledge/rust_sower - name = "Rust Sower Grenade" - desc = "Allws you to combine a chemical grenade casing and a liver to conjure a cursed grenade filled with Eldritch Rust, upon detonating it releases a huge cloud that blinds organics, rusts affected turfs and obliterates Silicons and Mechs." - gain_text = "The choked vines of the Rusted Hills are burdened with such overripe fruits. It undoes the markers of progress, leaving a clean slate to work into new shapes." - required_atoms = list( - /obj/item/grenade/chem_grenade = 1, - /obj/item/organ/liver = 1, - ) - result_atoms = list(/obj/item/grenade/chem_grenade/rust_sower) - cost = 1 - research_tree_icon_path = 'icons/obj/weapons/grenade.dmi' - research_tree_icon_state = "rustgrenade" - -/datum/heretic_knowledge/entropy_pulse - name = "Pulse of Entropy" - desc = "Allows you to transmute 10 iron sheets and a garbage item to fill the surrounding vicinity of the rune with rust." - gain_text = "Reality begins to whisper to me. To give it its entropic end." - required_atoms = list( - /obj/item/stack/sheet/iron = 10, - /obj/item/trash = 1, - ) - cost = 0 - - research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' - research_tree_icon_state = "corrode" - research_tree_icon_frame = 10 - - var/rusting_range = 8 - -/datum/heretic_knowledge/entropy_pulse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) - for(var/turf/nearby_turf in view(rusting_range, loc)) - if(get_dist(nearby_turf, loc) <= 1) //tiles on rune should always be rusted - nearby_turf.rust_heretic_act() - //we exclude closed turf to avoid exposing cultist bases - if(prob(10) || isclosedturf(nearby_turf)) - continue - nearby_turf.rust_heretic_act() - return TRUE - -/datum/heretic_knowledge/summon/rusty - name = "Rusted Ritual" - desc = "Allows you to transmute a pool of vomit, some cable coil, and 10 sheets of iron into a Rust Walker. \ - Rust Walkers excel at spreading rust and are moderately strong in combat." - gain_text = "I combined my knowledge of creation with my desire for corruption. The Marshal knew my name, and the Rusted Hills echoed out." - - required_atoms = list( - /obj/effect/decal/cleanable/vomit = 1, - /obj/item/stack/sheet/iron = 10, - /obj/item/stack/cable_coil = 15, - ) - mob_to_summon = /mob/living/basic/heretic_summon/rust_walker - cost = 1 - - poll_ignore_define = POLL_IGNORE_RUST_SPIRIT - - diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 0de77bdd093..cc330dc451e 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -211,7 +211,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) */ /datum/heretic_knowledge/codex_cicatrix name = "Codex Cicatrix" - desc = "Allows you to transmute a book, any unique pen (anything but generic pens), and your pick from any carcass (animal or human), leather, or hide to create a Codex Cicatrix. \ + desc = "Allows you to transmute a book, any pen, and your pick from any carcass (animal or human), leather, or hide to create a Codex Cicatrix. \ The Codex Cicatrix can be used when draining influences to gain additional knowledge, but comes at greater risk of being noticed. \ It can also be used to draw and remove transmutation runes easier, and as a spell focus in a pinch." gain_text = "The occult leaves fragments of knowledge and power anywhere and everywhere. The Codex Cicatrix is one such example. \ @@ -221,7 +221,6 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /obj/item/pen = 1, list(/mob/living, /obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide, /obj/item/food/deadmouse) = 1, ) - banned_atom_types = list(/obj/item/pen) result_atoms = list(/obj/item/codex_cicatrix) cost = 1 is_starting_knowledge = TRUE @@ -230,11 +229,6 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "book" -/datum/heretic_knowledge/codex_cicatrix/parse_required_item(atom/item_path, number_of_things) - if(item_path == /obj/item/pen) - return "unique type of pen" - return ..() - /datum/heretic_knowledge/codex_cicatrix/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() if(!.) @@ -311,13 +305,15 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) . = TRUE heretic_datum.feast_of_owls = TRUE + heretic_datum.update_heretic_aura() user.set_temp_blindness(reward * 1 SECONDS) user.AdjustParalyzed(reward * 1 SECONDS) user.playsound_local(get_turf(user), 'sound/music/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) for(var/i in 1 to reward) user.emote("scream") playsound(loc, 'sound/items/eatfood.ogg', 100, TRUE) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) + to_chat(user, span_danger("You feel something invisible tearing away at your very essence!")) user.do_jitter_animation() sleep(1 SECONDS) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 2175f871eac..ff6d9a2d2ad 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -1,20 +1,50 @@ - -/datum/heretic_knowledge_tree_column/main/void - neighbour_type_left = /datum/heretic_knowledge_tree_column/flesh_to_void - neighbour_type_right = /datum/heretic_knowledge_tree_column/void_to_blade - +/datum/heretic_knowledge_tree_column/void route = PATH_VOID ui_bgr = "node_void" + complexity = "Easy" + complexity_color = COLOR_GREEN + icon = list( + "icon" = 'icons/obj/weapons/khopesh.dmi', + "state" = "void_blade", + "frame" = 1, + "dir" = SOUTH, + "moving" = FALSE, + ) + description = list( + "The Path of Void focuses on stealth, freezing cold, mobility and depressurization.", + "Pick this path if you enjoy being a highly mobile assassin who leaves their foes struggling to catch up.", + ) + pros = list( + "Protection from the hazards of space.", + "Your spells apply a stacking debuff that chills and slows targets.", + "High amount of mobility spells.", + "Highly stealthy.", + ) + cons = list( + "Though protected from space, you are not nearly as mobile in it as you are on foot.", + "Has a difficult time fighting opponents immune to cold effects.", + "Has a difficult time with silicon-based lifeforms.", + ) + tips = list( + "Your Mansus Grasp allows you to mute your targets, making it ideal for silent assassinations (keep in mind that it won't short circuit their suit sensors, make sure you turn them off after you kill them). Yhe grasp also applies a mark that when triggered by the void blade will apply the maximum amount of stacks of void chill to your target, slowing them down to a crawl.", + "Void Cloak can be used to hide one of your blades and a Codex Cicatrix when the hood is down, while acting as a focus when it's up.", + "Void chill is a debuff applied by your spells, your grasp, your mark and your blade once you unlock the upgrade. Each stack slows your target movement speed by 10% and make them gradually colder, up to a maximum of 5 stacks.", + "At 5 stacks void chill will also prevent your target from heating up.", + "You are immune to low pressure and cold damage at the start of the shift. Upgrade your passive to level 2 to no longer need to breathe. Use this to your advantage.", + "Void prison can put a target in stasis for 10 seconds. Ideal if you are fighting multiple opponents and need to isolate one target at a time.", + "Void Conduit is your signature ability. It slowly destroys windows and airlocks around its area of effect. Use it to depressurize the station and expand your domain.", + ) start = /datum/heretic_knowledge/limited_amount/starting/base_void - grasp = /datum/heretic_knowledge/void_grasp - tier1 = /datum/heretic_knowledge/cold_snap - mark = /datum/heretic_knowledge/mark/void_mark - ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/void - unique_ability = /datum/heretic_knowledge/spell/void_conduit - tier2 = /datum/heretic_knowledge/spell/void_phase + knowledge_tier1 = /datum/heretic_knowledge/spell/void_phase + guaranteed_side_tier1 = /datum/heretic_knowledge/void_cloak + knowledge_tier2 = /datum/heretic_knowledge/spell/void_prison + guaranteed_side_tier2 = /datum/heretic_knowledge/ether + robes = /datum/heretic_knowledge/armor/void + knowledge_tier3 = /datum/heretic_knowledge/spell/void_pull + guaranteed_side_tier3 = /datum/heretic_knowledge/summon/maid_in_mirror blade = /datum/heretic_knowledge/blade_upgrade/void - tier3 = /datum/heretic_knowledge/spell/void_pull + knowledge_tier4 = /datum/heretic_knowledge/spell/void_conduit ascension = /datum/heretic_knowledge/ultimate/void_final /datum/heretic_knowledge/limited_amount/starting/base_void @@ -28,6 +58,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/void) research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' research_tree_icon_state = "void_blade" + mark_type = /datum/status_effect/eldritch/void + eldritch_passive = /datum/status_effect/heretic_passive/void /datum/heretic_knowledge/limited_amount/starting/base_void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -41,23 +73,8 @@ return ..() -/datum/heretic_knowledge/void_grasp - name = "Grasp of Void" - desc = "Your Mansus Grasp will temporarily mute and chill the victim." - gain_text = "I saw the cold watcher who observes me. The chill mounts within me. \ - They are quiet. This isn't the end of the mystery." - cost = 1 - research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' - research_tree_icon_state = "grasp_void" - -/datum/heretic_knowledge/void_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) - -/datum/heretic_knowledge/void_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) - -/datum/heretic_knowledge/void_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) - SIGNAL_HANDLER +/datum/heretic_knowledge/limited_amount/starting/base_void/on_mansus_grasp(mob/living/source, mob/living/target) + . = ..() if(!iscarbon(target)) return @@ -66,59 +83,6 @@ carbon_target.adjust_silence(10 SECONDS) carbon_target.apply_status_effect(/datum/status_effect/void_chill, 2) -/datum/heretic_knowledge/cold_snap - name = "Aristocrat's Way" - desc = "Grants you immunity to cold temperatures, and removes your need to breathe. \ - You can still take damage due to a lack of pressure." - gain_text = "I found a thread of cold breath. It lead me to a strange shrine, all made of crystals. \ - Translucent and white, a depiction of a nobleman stood before me." - cost = 1 - research_tree_icon_path = 'icons/effects/effects.dmi' - research_tree_icon_state = "the_freezer" - - /// Traits we apply to become immune to the environment - var/static/list/gain_traits = list(TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE) - -/datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) - user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) - RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(check_environment)) - -/datum/heretic_knowledge/cold_snap/on_lose(mob/user, datum/antagonist/heretic/our_heretic) - user.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_NOBREATH), type) - UnregisterSignal(user, COMSIG_LIVING_LIFE) - -///Checks if our traits should be active -/datum/heretic_knowledge/cold_snap/proc/check_environment(mob/living/user) - SIGNAL_HANDLER - - var/datum/gas_mixture/environment = user.loc?.return_air() - if(!isnull(environment)) - var/affected_temperature = environment.return_temperature() - var/affected_pressure = environment.return_pressure() - if(affected_temperature <= T0C || affected_pressure < ONE_ATMOSPHERE) - user.add_traits(gain_traits, type) - else - user.remove_traits(gain_traits, type) - -/datum/heretic_knowledge/mark/void_mark - name = "Mark of Void" - desc = "Your Mansus Grasp now applies the Mark of Void. The mark is triggered from an attack with your Void Blade. \ - When triggered, further silences the victim and swiftly lowers the temperature of their body and the air around them." - gain_text = "A gust of wind? A shimmer in the air? The presence is overwhelming, \ - my senses began to betray me. My mind is my own enemy." - mark_type = /datum/status_effect/eldritch/void - -/datum/heretic_knowledge/knowledge_ritual/void - -/datum/heretic_knowledge/spell/void_conduit - name = "Void Conduit" - desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." - gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ - Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ - The doors won't close. I can't keep the cold out now." - action_to_add = /datum/action/cooldown/spell/conjure/void_conduit - cost = 1 - /datum/heretic_knowledge/spell/void_phase name = "Void Phase" desc = "Grants you Void Phase, a long range targeted teleport spell. \ @@ -126,9 +90,59 @@ gain_text = "The entity calls themself the Aristocrat. They effortlessly walk through air like \ nothing - leaving a harsh, cold breeze in their wake. They disappear, and I am left in the blizzard." action_to_add = /datum/action/cooldown/spell/pointed/void_phase - cost = 1 + cost = 2 research_tree_icon_frame = 7 +/datum/heretic_knowledge/spell/void_prison + name = "Void Prison" + desc = "Grants you Void Prison, a spell that places your victim into a ball, making them unable to do anything or speak. \ + Applies void chill afterwards." + gain_text = "At first, I see myself, waltzing along a snow-laden street. \ + I try to yell, grab hold of this fool and tell them to run. \ + But the only welts made are on my own beating fist. \ + My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." + + action_to_add = /datum/action/cooldown/spell/pointed/void_prison + cost = 2 + drafting_tier = 5 + +/datum/heretic_knowledge/armor/void + name = "Hollow Weave" + desc = "Allows you to transmute a table (or a suit) and a mask in sub-zero temperatures to create a Hollow Weave, this armor will periodically nullify attacks and grant you a short stealth camoflage to reposition yourself. \ + Acts as a focus while hooded." + gain_text = "Stepping through the cold air, I am shocked by a new sensation. \ + Thousands of almost imperceivable threads cling to my form. \ + I am left adrift with every step. \ + Even as I hear the crunch of snow as I plant my foot to the ground, I feel nothing." + result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch/void) + research_tree_icon_state = "void_armor" + required_atoms = list( + list(/obj/structure/table, /obj/item/clothing/suit) = 1, + /obj/item/clothing/mask = 1, + ) + +/datum/heretic_knowledge/armor/void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + if(!isopenturf(loc)) + loc.balloon_alert(user, "ritual failed, invalid location!") + return FALSE + + var/turf/open/our_turf = loc + if(our_turf.GetTemperature() > T0C) + loc.balloon_alert(user, "ritual failed, not cold enough!") + return FALSE + + return ..() + +/datum/heretic_knowledge/spell/void_pull + name = "Void Pull" + desc = "Grants you Void Pull, a spell that pulls all nearby heathens towards you, stunning them briefly." + gain_text = "All is fleeting, but what else stays? I'm close to ending what was started. \ + The Aristocrat reveals themselves to me again. They tell me I am late. Their pull is immense, I cannot turn back." + + action_to_add = /datum/action/cooldown/spell/aoe/void_pull + cost = 2 + research_tree_icon_frame = 6 + /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" desc = "Your blade now freezes enemies. Additionally, you can now attack distant marked targets with your Void Blade, teleporting directly next to them." @@ -156,17 +170,15 @@ /datum/heretic_knowledge/blade_upgrade/void/proc/follow_up_attack(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) blade.melee_attack_chain(user, target) -/datum/heretic_knowledge/spell/void_pull - name = "Void Pull" - desc = "Grants you Void Pull, a spell that pulls all nearby heathens towards you, stunning them briefly." - gain_text = "All is fleeting, but what else stays? I'm close to ending what was started. \ - The Aristocrat reveals themselves to me again. They tell me I am late. Their pull is immense, I cannot turn back." - - action_to_add = /datum/action/cooldown/spell/aoe/void_pull - cost = 1 - - - research_tree_icon_frame = 6 +/datum/heretic_knowledge/spell/void_conduit + name = "Void Conduit" + desc = "Grants you Void Conduit, a spell which summons a pulsing gate to the Void itself. Every pulse breaks windows and airlocks, while afflicting Heathens with an eldritch chill and shielding Heretics against low pressure." + gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ + Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ + The doors won't close. I can't keep the cold out now." + action_to_add = /datum/action/cooldown/spell/conjure/void_conduit + cost = 2 + is_final_knowledge = TRUE /datum/heretic_knowledge/ultimate/void_final name = "Waltz at the End of Time" diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index 8f775f871f3..dbbdecc2cfb 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -16,6 +16,23 @@ aoe_radius = 2 +/datum/action/cooldown/spell/aoe/rust_conversion/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + return SPELL_NO_IMMEDIATE_COOLDOWN + +/datum/action/cooldown/spell/aoe/rust_conversion/after_cast(atom/cast_on) + . = ..() + var/datum/status_effect/heretic_passive/rust/rust_passive = owner.has_status_effect(/datum/status_effect/heretic_passive/rust) + if(!rust_passive) + StartCooldown(cooldown_time) + return + + var/new_cooldown = 35 SECONDS - (rust_passive.passive_level * 5 SECONDS) + StartCooldown(new_cooldown) + /datum/action/cooldown/spell/aoe/rust_conversion/get_things_to_cast_on(atom/center) var/list/things_to_convert = RANGE_TURFS(aoe_radius, center) diff --git a/code/modules/antagonists/heretic/magic/ash_jaunt.dm b/code/modules/antagonists/heretic/magic/ash_jaunt.dm index b64c5fdc9ae..f6c563c305d 100644 --- a/code/modules/antagonists/heretic/magic/ash_jaunt.dm +++ b/code/modules/antagonists/heretic/magic/ash_jaunt.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash name = "Ashen Passage" - desc = "A short range spell that allows you to pass unimpeded through walls." + desc = "A short range spell that allows you to pass unimpeded through walls, removing restraints if empowered." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -20,6 +20,59 @@ jaunt_type = /obj/effect/dummy/phased_mob/spell_jaunt/red jaunt_in_type = /obj/effect/temp_visual/dir_setting/ash_shift jaunt_out_type = /obj/effect/temp_visual/dir_setting/ash_shift/out + /// If we are on fire while wearing ash robes, we can empower our next cast + var/empowered_cast = FALSE + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/Grant(mob/grant_to) + . = ..() + RegisterSignal(grant_to, COMSIG_FIRE_STACKS_UPDATED, PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/Remove(mob/remove_from) + . = ..() + UnregisterSignal(remove_from, COMSIG_FIRE_STACKS_UPDATED) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + // Put an active border whenever our spell is able to be casted empowered + if(!ishuman(owner)) + return + var/mob/living/carbon/human/human_owner = owner + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return + if(human_owner.fire_stacks <= 3) + return + + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/cast(mob/living/cast_on) + if(!iscarbon(owner)) + return ..() + + // Wearing Ash heretic armor empowers your spells if you have over 3 fire stacks + if(!ishuman(owner)) + return ..() + var/mob/living/carbon/human/human_owner = owner + if(human_owner.fire_stacks <= 3) + return ..() + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return ..() + + empowered_cast = TRUE + human_owner.setStaminaLoss(0) + human_owner.SetAllImmobility(0) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.uncuff() + var/obj/item/clothing/shoes/shoes = carbon_owner.shoes + if(istype(shoes) && shoes.tied == SHOES_KNOTTED) + shoes.adjust_laces(SHOES_TIED, carbon_owner) + + return ..() + +/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/do_jaunt(mob/living/cast_on) + jaunt_duration = (empowered_cast ? 1.5 SECONDS : initial(jaunt_duration)) + return ..() /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/do_steam_effects() return diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm index 01a9970b204..f2f30747b46 100644 --- a/code/modules/antagonists/heretic/magic/caretaker.dm +++ b/code/modules/antagonists/heretic/magic/caretaker.dm @@ -30,7 +30,7 @@ return for(var/mob/living/alive in orange(5, owner)) - if(alive.stat != DEAD && alive.client) + if(alive.stat != DEAD && alive.client && (owner in view(alive))) owner.balloon_alert(owner, "other minds nearby!") return . | SPELL_CANCEL_CAST diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index c191b00d32c..3d5c9e77939 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -1,6 +1,6 @@ /datum/action/cooldown/spell/conjure/cosmic_expansion name = "Cosmic Expansion" - desc = "This spell generates a 3x3 domain of cosmic fields. \ + desc = "This spell generates a 5x5 domain of cosmic fields. \ Creatures up to 7 tiles away will also receive a star mark." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" @@ -9,14 +9,14 @@ sound = 'sound/effects/magic/cosmic_expansion.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 45 SECONDS + cooldown_time = 15 SECONDS invocation = "C'SM'S 'XP'ND!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE - summon_amount = 9 - summon_radius = 1 + summon_amount = 25 + summon_radius = 2 summon_type = list(/obj/effect/forcefield/cosmic_field) /// The range at which people will get marked with a star mark. var/star_mark_range = 7 @@ -24,16 +24,18 @@ var/obj/effect/expansion_effect = /obj/effect/temp_visual/cosmic_domain /// If the heretic is ascended or not var/ascended = FALSE + /// Weakref to our summoner, only relevant if we are a stargazer. Prevents us from harming our master + var/datum/weakref/summoner /datum/action/cooldown/spell/conjure/cosmic_expansion/cast(mob/living/cast_on) new expansion_effect(get_turf(cast_on)) for(var/mob/living/nearby_mob in range(star_mark_range, cast_on)) - if(cast_on == nearby_mob || cast_on.buckled == nearby_mob) + if(cast_on == nearby_mob || cast_on.buckled == nearby_mob || IS_HERETIC_OR_MONSTER(nearby_mob) || cast_on == summoner?.resolve()) continue nearby_mob.apply_status_effect(/datum/status_effect/star_mark, cast_on) - if (ascended) + if (ascended && length(summon_type)) for(var/turf/cast_turf as anything in get_turfs(get_turf(cast_on))) - new /obj/effect/forcefield/cosmic_field(cast_turf) + create_cosmic_field(cast_turf, owner, summon_type[1]) return ..() /datum/action/cooldown/spell/conjure/cosmic_expansion/proc/get_turfs(turf/target_turf) @@ -42,3 +44,17 @@ target_turfs += get_ranged_target_turf(target_turf, direction, 2) target_turfs += get_ranged_target_turf(target_turf, direction, 3) return target_turfs + +/datum/action/cooldown/spell/conjure/cosmic_expansion/post_summon(obj/effect/forcefield/cosmic_field/summoned_object, atom/cast_on) + . = ..() + if(isstargazer(owner)) + summoned_object.slows_projectiles() + summoned_object.prevents_explosions() + return + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = owner.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + if(cosmic_passive.passive_level > 1) + summoned_object.prevents_explosions() + if(cosmic_passive.passive_level > 2) + summoned_object.slows_projectiles() diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index af023e73a03..6d85604411f 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -70,6 +70,13 @@ silicon_image.override = TRUE add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cosmic", silicon_image) ADD_TRAIT(src, TRAIT_MOPABLE, INNATE_TRAIT) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_exited) + ) + AddElement(/datum/element/connect_loc, loc_connections) + for(var/mob/living/mobs in get_turf(src)) + RegisterSignal(mobs, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_self)) /obj/effect/cosmic_rune/attack_paw(mob/living/user, list/modifiers) return attack_hand(user, modifiers) @@ -92,10 +99,32 @@ return invoke(user) +/obj/effect/cosmic_rune/proc/on_entered(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + if(!isliving(arrived)) + return + RegisterSignal(arrived, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_self)) + +/// If something clicks on themselves while on top of the rune, we instead will act as if they clicked on the rune instead +/obj/effect/cosmic_rune/proc/on_attack_self(datum/source, mob/living/user) + SIGNAL_HANDLER + if(source == user) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, attack_hand), user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/obj/effect/cosmic_rune/proc/on_exited(datum/source, exiter) + SIGNAL_HANDLER + UnregisterSignal(exiter, COMSIG_ATOM_ATTACK_HAND) + /// For invoking the rune /obj/effect/cosmic_rune/proc/invoke(mob/living/user) var/obj/effect/cosmic_rune/linked_rune_resolved = linked_rune?.resolve() new rune_effect(get_turf(src)) + var/atom/pulled_thing + if(IS_HERETIC(user)) + if(user.pulling) + pulled_thing = user.pulling + do_teleport(user.pulling, get_turf(linked_rune_resolved), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) do_teleport( user, get_turf(linked_rune_resolved), @@ -104,9 +133,13 @@ asoundin = 'sound/effects/magic/cosmic_energy.ogg', asoundout = 'sound/effects/magic/cosmic_energy.ogg', ) + if(pulled_thing) // Regrab after the teleports are done + user.start_pulling(pulled_thing) for(var/mob/living/person_on_rune in get_turf(src)) if(person_on_rune.has_status_effect(/datum/status_effect/star_mark)) do_teleport(person_on_rune, get_turf(linked_rune_resolved), no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) + if(!IS_HERETIC(user)) + user.apply_status_effect(/datum/status_effect/star_mark) new rune_effect(get_turf(linked_rune_resolved)) /// For if someone failed to invoke the rune diff --git a/code/modules/antagonists/heretic/magic/crimson_cleave.dm b/code/modules/antagonists/heretic/magic/crimson_cleave.dm new file mode 100644 index 00000000000..411409ee933 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/crimson_cleave.dm @@ -0,0 +1,65 @@ +/datum/action/cooldown/spell/pointed/crimson_cleave + name = "Crimson Cleave" + desc = "A targeted spell that heals you while damaging the enemy. \ + It cleanses you of all wounds as well." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "blood_siphon" + ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' + + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + + invocation = "FL'MS O'ET'RN'ITY." + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + + cast_range = 5 + + /// The radius of the cleave effect + var/cleave_radius = 1 + /// What type of wound we apply + var/wound_type = /datum/wound/slash/flesh/critical/cleave + +/datum/action/cooldown/spell/pointed/crimson_cleave/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) + +/datum/action/cooldown/spell/pointed/crimson_cleave/is_valid_target(atom/cast_on) + return ..() && isliving(cast_on) + +/datum/action/cooldown/spell/pointed/crimson_cleave/cast(atom/cast_on) + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/carbon_owner = owner + for(var/obj/item/bodypart/limbs as anything in carbon_owner.bodyparts) + for(var/datum/wound/iter_wound as anything in limbs.wounds) + iter_wound.remove_wound() + + var/mob/living/living_owner = owner + for(var/mob/living/carbon/human/victim in range(cleave_radius, cast_on)) + if(victim == owner || IS_HERETIC_OR_MONSTER(victim)) + continue + if(victim.can_block_magic(antimagic_flags)) + victim.visible_message( + span_danger("[victim]'s flashes in a firey glow, but repels the blaze!"), + span_danger("Your body begins to flash a firey glow, but you are protected!!") + ) + continue + + victim.visible_message( + span_danger("[victim]'s veins are shredded from within as an unholy blaze erupts from [victim.p_their()] blood!"), + span_danger("Your veins burst from within and unholy flame erupts from your blood!") + ) + + victim.apply_damage(15, BRUTE, wound_bonus = CANT_WOUND) + living_owner.adjustBruteLoss(-15) + + if(victim.blood_volume) + victim.blood_volume -= 15 + if(living_owner.blood_volume && living_owner.blood_volume < (BLOOD_VOLUME_MAXIMUM - 50)) + living_owner.blood_volume += 15 + + new /obj/effect/temp_visual/cleave(get_turf(victim)) + + return TRUE diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 104b4697cd2..873f131c28f 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -15,12 +15,53 @@ invocation = "V'LC'N!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE - channel_time = 5 SECONDS - target_radius = 5 + channel_time = 2.5 SECONDS + target_radius = 7 max_beam_bounces = 4 /// How long the beam visual lasts, also used to determine time between jumps var/beam_duration = 2 SECONDS + /// If our spell is empowered, it will have added effects + var/empowered_cast = FALSE + +/datum/action/cooldown/spell/charged/beam/fire_blast/Grant(mob/grant_to) + . = ..() + RegisterSignal(grant_to, COMSIG_FIRE_STACKS_UPDATED, PROC_REF(update_status_on_signal)) + +/datum/action/cooldown/spell/charged/beam/fire_blast/Remove(mob/remove_from) + . = ..() + UnregisterSignal(remove_from, COMSIG_FIRE_STACKS_UPDATED) + +/datum/action/cooldown/spell/charged/beam/fire_blast/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + . = ..() + // Put an active border whenever our spell is able to be casted empowered + if(!ishuman(owner)) + return + var/mob/living/carbon/human/human_owner = owner + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return + if(human_owner.fire_stacks <= 3) + return + + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/charged/beam/fire_blast/before_cast(atom/cast_on) + empowered_cast = FALSE + channel_time = initial(channel_time) + // Wearing Ash heretic armor empowers your spells if you have over 3 fire stacks + if(!ishuman(owner)) + return ..() + var/mob/living/carbon/human/human_owner = owner + if(human_owner.fire_stacks <= 3) + return ..() + if(!istype(human_owner.wear_suit, /obj/item/clothing/suit/hooded/cultrobes/eldritch/ash)) + return ..() + empowered_cast = TRUE + channel_time = 0.1 SECONDS + human_owner.extinguish_mob() + return ..() /datum/action/cooldown/spell/charged/beam/fire_blast/cast(atom/cast_on) var/mob/living/caster = get_caster_from_target(cast_on) @@ -29,7 +70,7 @@ caster.apply_status_effect(/datum/status_effect/fire_blasted, beam_duration, -2) return ..() -/datum/action/cooldown/spell/charged/beam/fire_blast/send_beam(atom/origin, mob/living/carbon/to_beam, bounces = 4) +/datum/action/cooldown/spell/charged/beam/fire_blast/send_beam(atom/origin, mob/living/carbon/to_beam, bounces = max_beam_bounces) // Send a beam from the origin to the hit mob origin.Beam(to_beam, icon_state = "solar_beam", time = beam_duration, beam_type = /obj/effect/ebeam/reacting/fire) @@ -46,7 +87,7 @@ // Otherwise, if unblocked apply the damage and set them up else to_beam.apply_damage(20, BURN, wound_bonus = 5) - to_beam.adjust_fire_stacks(3) + to_beam.adjust_fire_stacks(empowered_cast ? 6 : 3) to_beam.ignite_mob() // Apply the fire blast status effect to show they got blasted to_beam.apply_status_effect(/datum/status_effect/fire_blasted, beam_duration * 0.5) @@ -66,7 +107,7 @@ continue nearby_living.Knockdown(0.8 SECONDS) nearby_living.apply_damage(15, BURN, wound_bonus = 5) - nearby_living.adjust_fire_stacks(2) + nearby_living.adjust_fire_stacks(empowered_cast ? 4 : 2) nearby_living.ignite_mob() /// Timer callback to continue the chain, calling send_fire_bream recursively. diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 26e21f54ae4..c50b9c81e12 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -126,7 +126,7 @@ /datum/action/cooldown/spell/touch/flesh_surgery/proc/register_held_organ(obj/item/organ/new_held_organ, obj/item/melee/touch_attack/hand) hand.vis_contents += new_held_organ held_organ = new_held_organ - new_held_organ.flags_1 |= IS_ONTOP_1 + ADD_TRAIT(new_held_organ, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) new_held_organ.vis_flags |= VIS_INHERIT_PLANE RegisterSignal(new_held_organ, COMSIG_MOVABLE_MOVED, PROC_REF(unregister_held_organ)) RegisterSignal(new_held_organ, COMSIG_QDELETING, PROC_REF(unregister_held_organ)) @@ -139,7 +139,7 @@ /datum/action/cooldown/spell/touch/flesh_surgery/proc/unregister_held_organ(obj/item/organ/removed_organ) LAZYREMOVE(attached_hand.vis_contents, removed_organ) held_organ = null - removed_organ.flags_1 &= ~IS_ONTOP_1 + REMOVE_TRAIT(removed_organ, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) removed_organ.vis_flags &= ~VIS_INHERIT_PLANE UnregisterSignal(removed_organ, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) // Reset item offsets diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index af9691a01d6..237fd52ec02 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -10,7 +10,7 @@ sound = 'sound/items/weapons/guillotine.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 60 SECONDS + cooldown_time = 30 SECONDS invocation = "F'LSH'NG S'LV'R!" invocation_type = INVOCATION_SHOUT diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index a5d075f3a14..09743c20bc4 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -11,7 +11,7 @@ cooldown_time = 15 SECONDS invocation_type = INVOCATION_NONE spell_requirements = NONE - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + antimagic_flags = MAGIC_RESISTANCE_MOON /datum/action/cooldown/spell/touch/mad_touch/is_valid_target(atom/cast_on) if(!ishuman(cast_on)) diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index 74a04eba396..81215979468 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -1,7 +1,8 @@ /datum/action/cooldown/spell/pointed/mind_gate name = "Mind Gate" desc = "Deals you 20 brain damage and the target suffers a hallucination, \ - is left confused for 10 seconds, and suffers oxygen loss and brain damage." + is left confused for 10 seconds, and suffers oxygen loss and brain damage. \ + It also blinds, mutes and deafens your target, if their sanity is low enough, they will be knocked down as well." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -17,6 +18,7 @@ cast_range = 6 active_msg = "You prepare to open your mind..." + antimagic_flags = MAGIC_RESISTANCE_MOON /datum/action/cooldown/spell/pointed/mind_gate/can_cast_spell(feedback = TRUE) return ..() && isliving(owner) @@ -31,11 +33,38 @@ to_chat(owner, span_warning("Their mind doesn't swing open, but neither does yours.")) return FALSE + var/mob/living/living_owner = owner + living_owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) + cast_on.adjust_confusion(10 SECONDS) cast_on.adjustOxyLoss(30) cast_on.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), "Mind gate, cast by [owner]") cast_on.cause_hallucination(/datum/hallucination/delusion/preset/heretic/gate, "Caused by mindgate") cast_on.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30) - var/mob/living/living_owner = owner - living_owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) + /// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike + var/maximum_duration = 15 SECONDS + var/mind_gate_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration + to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) + cast_on.adjust_temp_blindness(mind_gate_duration + 1 SECONDS) + cast_on.set_eye_blur_if_lower(mind_gate_duration + 2 SECONDS) + + var/obj/item/organ/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) + //adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds + ears?.adjustEarDamage(0, (mind_gate_duration + 1 SECONDS) / (2 SECONDS)) + + cast_on.adjust_silence(mind_gate_duration + 1 SECONDS) + cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) + + // Only knocksdown if the target has a low enough sanity + if(cast_on.mob_mood.sanity < 40) + cast_on.AdjustKnockdown(2 SECONDS) + //Lowers sanity + cast_on.mob_mood.adjust_sanity(-20) + + //If our moon heretic has their level 3 passive, we channel the amulet effect + var/datum/status_effect/heretic_passive/moon/our_passive = living_owner.has_status_effect(/datum/status_effect/heretic_passive/moon) + if(our_passive?.amulet) + our_passive.amulet.channel_amulet(owner, cast_on) + + return TRUE diff --git a/code/modules/antagonists/heretic/magic/mirror_walk.dm b/code/modules/antagonists/heretic/magic/mirror_walk.dm index 93642c7f324..436d3877950 100644 --- a/code/modules/antagonists/heretic/magic/mirror_walk.dm +++ b/code/modules/antagonists/heretic/magic/mirror_walk.dm @@ -2,7 +2,8 @@ name = "Mirror Walk" desc = "Allows you to traverse invisibly and freely across the station within the realm of the mirror. \ You can only enter and exit the realm of mirrors when nearby reflective surfaces and items, \ - such as windows, mirrors, and reflective walls or equipment." + such as windows, mirrors, and reflective walls or equipment. \ + You will slowly heal damage while in this form." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_minor_antag.dmi' @@ -156,3 +157,14 @@ /obj/effect/dummy/phased_mob/mirror_walk name = "reflection" + +/obj/effect/dummy/phased_mob/mirror_walk/Initialize(mapload, atom/movable/jaunter) + . = ..() + START_PROCESSING(SSobj, src) + +/obj/effect/dummy/phased_mob/mirror_walk/process(seconds_per_tick) + if(!isliving(jaunter)) + STOP_PROCESSING(SSobj, src) + return ..() + var/mob/living/living_jaunter = jaunter + living_jaunter.heal_overall_damage(5 * seconds_per_tick) diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 48df0ab58df..97f4eb864ba 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -19,7 +19,7 @@ deactive_msg = "You stop the music and halt the parade... for now." cast_range = 12 projectile_type = /obj/projectile/moon_parade - + antimagic_flags = MAGIC_RESISTANCE_MOON /obj/projectile/moon_parade name = "Lunar parade" @@ -63,7 +63,7 @@ return PROJECTILE_PIERCE_PHASE // Anti-magic destroys the projectile for consistency and counterplay - if(victim.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) + if(victim.can_block_magic(MAGIC_RESISTANCE_MOON)) visible_message(span_warning("The parade hits [victim] and a sudden wave of clarity comes over you!")) return PROJECTILE_DELETE_WITHOUT_HITTING @@ -76,31 +76,22 @@ var/mob/living/victim = target - if(!(victim in mobs_hit)) - RegisterSignal(victim, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(moon_block_move)) - RegisterSignal(victim, COMSIG_QDELETING, PROC_REF(clear_mob)) - victim.AddComponent(/datum/component/leash, src, distance = 1) - victim.balloon_alert(victim, "you feel unable to move away from the parade!") - mobs_hit += victim + if(!was_hit_already(victim)) + victim.apply_status_effect(/datum/status_effect/moon_parade, src) + mobs_hit += WEAKREF(victim) victim.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) victim.cause_hallucination(/datum/hallucination/delusion/preset/moon, name) victim.mob_mood.adjust_sanity(-20) +/obj/projectile/moon_parade/proc/was_hit_already(mob/living/victim) + for(var/datum/weakref/ref as anything in mobs_hit) + var/mob/living/hit_victim = ref.resolve() + if(hit_victim == victim) + return TRUE + return FALSE + /obj/projectile/moon_parade/Destroy() - for(var/mob/living/leftover_mob as anything in mobs_hit) - clear_mob(leftover_mob) - mobs_hit.Cut() // You never know + mobs_hit.Cut() soundloop.stop() return ..() - -// Blocks movement in order to make it appear like the character is transfixed to the projectile and wandering after it -// Coded this way because its a simple way to hold the illusion compared to other methods -/obj/projectile/moon_parade/proc/moon_block_move(datum/source) - SIGNAL_HANDLER - return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE - -/obj/projectile/moon_parade/proc/clear_mob(datum/source) - SIGNAL_HANDLER - UnregisterSignal(source, list(COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, COMSIG_QDELETING)) - mobs_hit -= source diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index 130212f9455..a12cb14240d 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -1,8 +1,7 @@ /datum/action/cooldown/spell/aoe/moon_ringleader name = "Ringleaders Rise" - desc = "Big AoE spell that deals brain damage and causes hallucinations to everyone in the AoE. \ - The worse their sanity, the stronger this spell becomes. \ - If their sanity is low enough, they even snap and go insane, and the spell then further halves their sanity." + desc = "Big AoE spell that summons copies of you. \ + If any copies are attacked, they cause brain damage, sanity damage, and will briefly stun everyone nearby." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -11,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND + antimagic_flags = MAGIC_RESISTANCE_MOON invocation = "R'S 'E!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE @@ -22,6 +21,7 @@ /datum/action/cooldown/spell/aoe/moon_ringleader/cast(mob/living/caster) new moon_effect(get_turf(caster)) + caster.faction |= "ringleader([REF(caster)])" return ..() /datum/action/cooldown/spell/aoe/moon_ringleader/get_things_to_cast_on(atom/center, radius_override) @@ -30,10 +30,10 @@ for(var/mob/living/carbon/nearby_mob in o_range) if(nearby_mob.stat == DEAD) continue - if(!nearby_mob.mob_mood) - continue if(IS_HERETIC_OR_MONSTER(nearby_mob)) continue + if(issilicon(nearby_mob)) + continue if(nearby_mob.can_block_magic(antimagic_flags)) continue @@ -42,17 +42,44 @@ return stuff /datum/action/cooldown/spell/aoe/moon_ringleader/cast_on_thing_in_aoe(mob/living/carbon/victim, mob/living/caster) - var/victim_sanity = victim.mob_mood.sanity + var/mob/living/simple_animal/hostile/illusion/fake_clone = new(pick(RANGE_TURFS(2, victim))) + fake_clone.faction = caster.faction.Copy() + fake_clone.Copy_Parent(caster, 30 SECONDS, caster.health, 1, 0, "shove_mode") + fake_clone.GiveTarget(victim) + fake_clone.AddElement(/datum/element/relay_attackers) + RegisterSignal(fake_clone, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) - victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100 - victim_sanity, 160) - for(var/i in 1 to round((120 - victim_sanity) / 10)) - victim.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), name) - if(victim_sanity < 15) - victim.apply_status_effect(/datum/status_effect/moon_converted) - caster.log_message("made [victim] insane.", LOG_GAME) - victim.log_message("was driven insane by [caster]") - victim.mob_mood.adjust_sanity(victim_sanity * -0.5) +/// Used by Ringleaders Rise, illusions created by this spell will explode when they are interacted with +/datum/action/cooldown/spell/aoe/moon_ringleader/proc/on_attacked(mob/victim, atom/attacker) + SIGNAL_HANDLER + if(isliving(attacker)) + var/mob/living/living_attacker = attacker + if(IS_HERETIC_OR_MONSTER(living_attacker)) // Heretics cant smack these guys to trigger their effects + return + playsound(victim, 'sound/items/party_horn.ogg', 30) + new /obj/effect/decal/cleanable/confetti(get_turf(victim)) + for(var/mob/living/mob in range(3, victim)) + if(IS_HERETIC_OR_MONSTER(mob)) + continue + if(mob.can_block_magic(antimagic_flags)) + continue + + //If our moon heretic has their level 3 passive, we channel the amulet effect + var/mob/living/simple_animal/hostile/illusion/fake_clone = victim + var/mob/living/living_owner = fake_clone.parent_mob_ref.resolve() + if(!living_owner) + continue + var/datum/status_effect/heretic_passive/moon/our_passive = living_owner.has_status_effect(/datum/status_effect/heretic_passive/moon) + // We channel the amulet before the "spell effects" so that people don't get converted after 1 clone goes off + our_passive?.amulet?.channel_amulet(living_owner, mob) + + mob.AdjustStun(1 SECONDS) + mob.AdjustKnockdown(1 SECONDS) + mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 150) + mob.mob_mood?.adjust_sanity(-50) + + qdel(victim) /obj/effect/temp_visual/moon_ringleader icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm deleted file mode 100644 index fd98dc0d841..00000000000 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/action/cooldown/spell/pointed/moon_smile - name = "Smile of the moon" - desc = "Lets you turn the gaze of the moon on someone \ - temporarily blinding, muting, deafening and knocking down a single target if their sanity is low enough." - background_icon_state = "bg_heretic" - overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/mob/actions/actions_ecult.dmi' - button_icon_state = "moon_smile" - ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' - - sound = 'sound/effects/magic/blind.ogg' - school = SCHOOL_FORBIDDEN - cooldown_time = 20 SECONDS - antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND - invocation = "M'N S'M'LE!" - invocation_type = INVOCATION_SHOUT - spell_requirements = NONE - cast_range = 6 - - active_msg = "You prepare to let them see the true face..." - -/datum/action/cooldown/spell/pointed/moon_smile/can_cast_spell(feedback = TRUE) - return ..() && isliving(owner) - -/datum/action/cooldown/spell/pointed/moon_smile/is_valid_target(atom/cast_on) - return ..() && ishuman(cast_on) - -/datum/action/cooldown/spell/pointed/moon_smile/cast(mob/living/carbon/human/cast_on) - . = ..() - /// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike - var/maximum_duration = 15 SECONDS - var/moon_smile_duration = ((SANITY_MAXIMUM - cast_on.mob_mood.sanity) / (SANITY_MAXIMUM - SANITY_INSANE)) * maximum_duration - if(cast_on.can_block_magic(antimagic_flags)) - to_chat(cast_on, span_notice("The moon turns, its smile no longer set on you.")) - to_chat(owner, span_warning("The moon does not smile upon them.")) - return FALSE - - playsound(cast_on, 'sound/effects/hallucinations/i_see_you1.ogg', 50, 1) - to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) - cast_on.adjust_temp_blindness(moon_smile_duration + 1 SECONDS) - cast_on.set_eye_blur_if_lower(moon_smile_duration + 2 SECONDS) - - var/obj/item/organ/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) - //adjustEarDamage takes deafness duration parameter in one unit per two seconds, instead of the normal time, so we divide by two seconds - ears?.adjustEarDamage(0, (moon_smile_duration + 1 SECONDS) / (2 SECONDS)) - - cast_on.adjust_silence(moon_smile_duration + 1 SECONDS) - cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) - - // Only knocksdown if the target has a low enough sanity - if(cast_on.mob_mood.sanity < 40) - cast_on.AdjustKnockdown(2 SECONDS) - //Lowers sanity - cast_on.mob_mood.adjust_sanity(-20) - return TRUE diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index 6b156e01653..a71d45b25ae 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -10,28 +10,38 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES + aoe_radius = 14 invocation = "GL'RY T' TH' N'GHT'W'TCH'ER." invocation_type = INVOCATION_WHISPER spell_requirements = SPELL_REQUIRES_HUMAN + /// Tracks how many victims the spell has chosen, lowers the cooldown for each target + var/victims_counter + +/datum/action/cooldown/spell/aoe/fiery_rebirth/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST) + return + + return SPELL_NO_IMMEDIATE_COOLDOWN /datum/action/cooldown/spell/aoe/fiery_rebirth/cast(mob/living/carbon/human/cast_on) cast_on.extinguish_mob() return ..() /datum/action/cooldown/spell/aoe/fiery_rebirth/get_things_to_cast_on(atom/center) + victims_counter = 0 var/list/things = list() for(var/mob/living/carbon/nearby_mob in range(aoe_radius, center)) if(nearby_mob == owner || nearby_mob == center) continue - if(!nearby_mob.mind || !nearby_mob.client) - continue if(IS_HERETIC_OR_MONSTER(nearby_mob)) continue if(nearby_mob.stat == DEAD || !nearby_mob.on_fire) continue things += nearby_mob + victims_counter++ return things @@ -44,17 +54,26 @@ victim.investigate_log("has been executed by fiery rebirth.", INVESTIGATE_DEATHS) victim.death() victim.apply_damage(20, BURN) + victim.extinguish_mob() // Heal the caster for every victim damaged var/need_mob_update = FALSE need_mob_update += caster.adjustBruteLoss(-10, updating_health = FALSE) need_mob_update += caster.adjustFireLoss(-10, updating_health = FALSE) - need_mob_update += caster.adjustToxLoss(-10, updating_health = FALSE) + need_mob_update += caster.adjustToxLoss(-10, updating_health = FALSE, forced = TRUE) need_mob_update += caster.adjustOxyLoss(-10, updating_health = FALSE) need_mob_update += caster.adjustStaminaLoss(-10, updating_stamina = FALSE) if(need_mob_update) caster.updatehealth() +/datum/action/cooldown/spell/aoe/fiery_rebirth/after_cast(atom/cast_on) + . = ..() + if(!victims_counter) + StartCooldown(cooldown_time) + return + var/new_cooldown = cooldown_time - victims_counter * 10 SECONDS + StartCooldown(max(9 SECONDS, new_cooldown)) // Hard capped so an ascended heretic doesn't get to freely spam + /obj/effect/temp_visual/eldritch_smoke icon = 'icons/effects/eldritch.dmi' icon_state = "smoke" diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm index 56054bd56fd..506ef1949b4 100644 --- a/code/modules/antagonists/heretic/magic/rust_charge.dm +++ b/code/modules/antagonists/heretic/magic/rust_charge.dm @@ -5,36 +5,43 @@ will deal high damage to others and rust around you during the charge. \ As it is the rust that empowers you with this ability, no focus is needed." charge_distance = 10 - charge_damage = 50 + charge_damage = 25 cooldown_time = 45 SECONDS + charge_past = 0 /datum/action/cooldown/mob_cooldown/charge/rust/Activate(atom/target_atom) var/turf/open/start_turf = get_turf(owner) if(!istype(start_turf) || !HAS_TRAIT(start_turf, TRAIT_RUSTY)) return FALSE StartCooldown(135 SECONDS, 135 SECONDS) + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.damage_resistance += 100 + RegisterSignal(owner, COMSIG_FINISHED_CHARGE, PROC_REF(affect_aoe)) charge_sequence(owner, target_atom, charge_delay, charge_past) StartCooldown() return TRUE + /datum/action/cooldown/mob_cooldown/charge/rust/on_move(atom/source, atom/new_loc, atom/target) var/turf/victim = get_turf(owner) if(!actively_moving) return COMPONENT_MOVABLE_BLOCK_PRE_MOVE new /obj/effect/temp_visual/decoy/fading(source.loc, source) INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) - victim.rust_heretic_act() - for(var/dir in GLOB.cardinals) + var/mob/living/living_owner = owner + living_owner.do_rust_heretic_act(victim) + for(var/dir in GLOB.alldirs) var/turf/nearby_turf = get_step(victim, dir) if(istype(nearby_turf)) - nearby_turf.rust_heretic_act() + living_owner.do_rust_heretic_act(nearby_turf) /datum/action/cooldown/mob_cooldown/charge/rust/DestroySurroundings(atom/movable/charger) if(!destroy_objects) return - for(var/dir in GLOB.cardinals) + for(var/dir in GLOB.alldirs) var/turf/source = get_turf(owner) var/turf/closed/next_turf = get_step(charger, dir) - if(!istype(source) || !istype(next_turf) || !HAS_TRAIT(source, TRAIT_RUSTY) || !HAS_TRAIT(next_turf, TRAIT_RUSTY)) + if(!istype(source) || !istype(next_turf)) continue SSexplosions.medturf += next_turf @@ -49,3 +56,15 @@ INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) try_hit_target(source, target, charge_damage) + +/datum/action/cooldown/mob_cooldown/charge/rust/proc/affect_aoe() + SIGNAL_HANDLER + UnregisterSignal(owner, COMSIG_FINISHED_CHARGE) + for(var/mob/living/nearby_mob in view(1, owner)) + if(nearby_mob == owner) + continue + nearby_mob.apply_damage(charge_damage, BRUTE, wound_bonus = CANT_WOUND) + nearby_mob.Knockdown(5 SECONDS) + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.physiology.damage_resistance -= 100 diff --git a/code/modules/antagonists/heretic/magic/rust_construction.dm b/code/modules/antagonists/heretic/magic/rust_construction.dm index 59aeacf3004..acfc73231e3 100644 --- a/code/modules/antagonists/heretic/magic/rust_construction.dm +++ b/code/modules/antagonists/heretic/magic/rust_construction.dm @@ -8,7 +8,8 @@ check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED school = SCHOOL_FORBIDDEN - cooldown_time = 8 SECONDS + cooldown_time = 2 SECONDS + unset_after_click = FALSE // Both of these are changed in before_cast invocation = "Someone raises a wall of rust." diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index 45f1f878cff..9e87cbd7aff 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -17,7 +17,7 @@ invocation_type = INVOCATION_WHISPER spell_requirements = NONE - cone_levels = 5 + cone_levels = 6 respect_density = TRUE /datum/action/cooldown/spell/cone/staggered/entropic_plume/cast(atom/cast_on) @@ -34,7 +34,7 @@ if(victim.can_block_magic(antimagic_flags) || IS_HERETIC_OR_MONSTER(victim) || victim == caster) return victim.apply_status_effect(/datum/status_effect/amok) - victim.apply_status_effect(/datum/status_effect/cloudstruck, level * 1 SECONDS) + victim.apply_status_effect(/datum/status_effect/cloudstruck, 5 SECONDS) victim.adjust_disgust(100) /datum/action/cooldown/spell/cone/staggered/entropic_plume/calculate_cone_shape(current_level) diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index ad36cf9186a..b4cd2ec02b8 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -1,6 +1,7 @@ /datum/action/cooldown/spell/pointed/projectile/star_blast name = "Star Blast" - desc = "This spell fires a disk with cosmic energies at a target, spreading the star mark." + desc = "This spell fires an unstoppable disk with cosmic energies at a target, spreading the star mark. \ + When recasted, you will be teleported to the disk, and cosmic fields will generate from the disk and from the caster, pulling nearby heathens into it." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -8,7 +9,7 @@ sound = 'sound/effects/magic/cosmic_energy.ogg' school = SCHOOL_FORBIDDEN - cooldown_time = 20 SECONDS + cooldown_time = 1 SECONDS // Cooldown is tied to teleportation, not firing invocation = "R'T'T' ST'R!" invocation_type = INVOCATION_SHOUT @@ -18,24 +19,78 @@ deactive_msg = "You stop swirling cosmic energies from the palm of your hand... for now." cast_range = 12 projectile_type = /obj/projectile/magic/star_ball + /// Weakref to the projectile we fire, so that we can recast our ability to teleport to its location + var/datum/weakref/projectile_weakref + /// Weakref to our summoner, only relevant if we are a stargazer. Prevents us from harming our master + var/datum/weakref/summoner + +/datum/action/cooldown/spell/pointed/projectile/star_blast/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + projectile_weakref = WEAKREF(to_fire) + to_fire.AddElement(cosmic_trail_based_on_passive(user), /obj/effect/forcefield/cosmic_field/fast) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/apply_button_overlay(atom/movable/screen/movable/action_button/current_button, force) + var/obj/projectile/magic/star_ball/active_ball = projectile_weakref?.resolve() + if(!active_ball) + return ..() + + // Means we have a ball active so we'll put a border indicating you can re-cast it + current_button.cut_overlay(current_button.button_overlay) + current_button.button_overlay = mutable_appearance(icon = overlay_icon, icon_state = "bg_spell_border_active_green") + current_button.add_overlay(current_button.button_overlay) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/set_click_ability(mob/on_who) + var/obj/projectile/magic/star_ball/active_ball = projectile_weakref?.resolve() + if(!active_ball) + build_all_button_icons(UPDATE_OVERLAYS) + return ..() + + pull_victims() + do_teleport(owner, active_ball) + pull_victims() // Yes, this is intentional, we want to pull mobs from the place we were, and the place we've teleported to + QDEL_NULL(active_ball) + build_all_button_icons(UPDATE_OVERLAYS) + // Cooldown of the ability itself is only 1 second after shooting, it's 25 seconds after we teleport to our ball + StartCooldown(25 SECONDS) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/proc/pull_victims() + new /obj/effect/temp_visual/circle_wave/star_blast(get_turf(owner)) + for(var/turf/spawn_turf in range(1, get_turf(owner))) + if(spawn_turf.density) + continue + create_cosmic_field(spawn_turf, owner, /obj/effect/forcefield/cosmic_field/star_blast) + for(var/mob/living/nearby_mob in view(2, owner)) + if(nearby_mob == owner || nearby_mob == summoner?.resolve()) + continue + // Don't grab people who are tucked away or something + if(!isturf(nearby_mob.loc)) + continue + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + if(nearby_mob.can_block_magic(antimagic_flags)) + continue + for(var/i in 1 to 3) + nearby_mob.forceMove(get_step_towards(nearby_mob, owner)) + nearby_mob.apply_status_effect(/datum/status_effect/star_mark) + +/datum/action/cooldown/spell/pointed/projectile/star_blast/after_cast(atom/cast_on) + . = ..() + unset_click_ability(owner) // Unselect because we will re-select it to teleport /obj/projectile/magic/star_ball name = "star ball" icon_state = "star_ball" - damage = 20 - damage_type = BURN + damage = 0 speed = 0.2 - range = 100 + range = 25 knockdown = 4 SECONDS + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSBLOB | PASSMOB | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSFLAPS | PASSDOORS | PASSVEHICLE | PASSITEM | PASSWINDOW + projectile_piercing = PASSMOB | PASSVEHICLE /// Effect for when the ball hits something var/obj/effect/explosion_effect = /obj/effect/temp_visual/cosmic_explosion /// The range at which people will get marked with a star mark. var/star_mark_range = 3 -/obj/projectile/magic/star_ball/Initialize(mapload) - . = ..() - AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) - /obj/projectile/magic/star_ball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/cast_on = firer @@ -46,9 +101,4 @@ /obj/projectile/magic/star_ball/Destroy() playsound(get_turf(src), 'sound/effects/magic/cosmic_energy.ogg', 50, FALSE) - for(var/turf/cast_turf as anything in get_turfs()) - new /obj/effect/forcefield/cosmic_field(cast_turf) return ..() - -/obj/projectile/magic/star_ball/proc/get_turfs() - return list(get_turf(src), pick(get_step(src, NORTH), get_step(src, SOUTH)), pick(get_step(src, EAST), get_step(src, WEST))) diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index bf7491ab037..54400f883f3 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -1,10 +1,9 @@ /datum/action/cooldown/spell/touch/star_touch name = "Star Touch" - desc = "Manifests cosmic fields on tiles next to you while marking the victim with a star mark \ - or consuming an already present star mark to put them to sleep for 4 seconds. \ - They will then be linked to you with a cosmic ray, burning them for up to a minute, or \ - until they can escape your sight. Star Touch can also remove Cosmic Runes, or teleport you \ - to your Star Gazer when used on yourself." + desc = "Can be used to apply a star mark to a target. \ + If your victim is already star marked, tethers you to your target with a cosmic ray. \ + If the tether remains unbroken for 8 seconds, they will be put to sleep and teleported to you. \ + Star Touch can also remove Cosmic Runes, or teleport you to your Star Gazer when used in hand." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -35,13 +34,13 @@ ) /datum/action/cooldown/spell/touch/star_touch/cast_on_hand_hit(obj/item/melee/touch_attack/hand, mob/living/victim, mob/living/carbon/caster) - if(victim.has_status_effect(/datum/status_effect/star_mark)) - victim.apply_effect(4 SECONDS, effecttype = EFFECT_UNCONSCIOUS) - victim.remove_status_effect(/datum/status_effect/star_mark) - else + if(!victim.has_status_effect(/datum/status_effect/star_mark)) victim.apply_status_effect(/datum/status_effect/star_mark, caster) + return TRUE + victim.remove_status_effect(/datum/status_effect/star_mark) + victim.adjust_drowsiness(8 SECONDS) for(var/turf/cast_turf as anything in get_turfs(victim)) - new /obj/effect/forcefield/cosmic_field(cast_turf) + create_cosmic_field(cast_turf, caster) caster.apply_status_effect(/datum/status_effect/cosmic_beam, victim) return TRUE @@ -82,6 +81,15 @@ effects_we_clear = list(/obj/effect/cosmic_rune), \ ) +/obj/item/melee/touch_attack/star_touch/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + . = ..() + if(!isliving(interacting_with)) + return + var/mob/living/living_target = interacting_with + if(get_dist(living_target, user) > 3) + return + return melee_attack_chain(user, living_target, modifiers) + /* * Callback for effect_remover component. */ @@ -89,7 +97,17 @@ new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(target)) var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve() star_touch_spell?.spell_feedback(user) - remove_hand_with_no_refund(user) + if(!QDELETED(star_touch_spell)) + qdel(star_touch_spell) + var/datum/action/cooldown/spell/cosmic_rune/rune_spell = locate() in user.actions + var/obj/effect/cosmic_rune/first_rune = rune_spell.first_rune.resolve() + var/obj/effect/cosmic_rune/second_rune = rune_spell.second_rune.resolve() + if(!QDELETED(first_rune)) + new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(first_rune)) + QDEL_NULL(first_rune) + if(!QDELETED(second_rune)) + new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(second_rune)) + QDEL_NULL(second_rune) /obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user) . = span_rose("[user] effortlessly snaps [user.p_their()] fingers near [to_light], igniting it with cosmic energies. Fucking badass!") @@ -118,7 +136,7 @@ /datum/status_effect/cosmic_beam id = "cosmic_beam" tick_interval = 0.2 SECONDS - duration = 1 MINUTES + duration = 8 SECONDS status_type = STATUS_EFFECT_REPLACE alert_type = null /// Stores the current beam target @@ -133,12 +151,26 @@ var/active = FALSE /// The storage for the beam var/datum/beam/current_beam = null + /// The timer for the teleport effect + var/teleport_timer + /// The effect trail that we add to our victim + var/cosmic_effect_trail /datum/status_effect/cosmic_beam/on_creation(mob/living/new_owner, mob/living/current_target) src.current_target = current_target + cosmic_effect_trail = cosmic_trail_based_on_passive(new_owner) start_beam(current_target, new_owner) + ADD_TRAIT(current_target, TRAIT_NO_TELEPORT, REF(src)) + teleport_timer = addtimer(CALLBACK(src, PROC_REF(yoink_victim), new_owner), 8 SECONDS, TIMER_STOPPABLE) return ..() +/// Puts the victim to sleep and teleports them to the casters' location +/datum/status_effect/cosmic_beam/proc/yoink_victim(mob/living/carbon/caster) + current_target.apply_effect(8 SECONDS, effecttype = EFFECT_UNCONSCIOUS) + REMOVE_TRAIT(current_target, TRAIT_NO_TELEPORT, REF(src)) + do_teleport(current_target, caster, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE) + current_target.apply_status_effect(/datum/status_effect/star_mark) + /datum/status_effect/cosmic_beam/be_replaced() if(active) QDEL_NULL(current_beam) @@ -155,17 +187,15 @@ last_check = world.time - if(!los_check(owner, current_target)) + if(!get_dist(owner, current_target) > 8) QDEL_NULL(current_beam)//this will give the target lost message return - if(current_target) - on_beam_tick(current_target) - /** * Proc that always is called when we want to end the beam and makes sure things are cleaned up, see beam_died() */ /datum/status_effect/cosmic_beam/proc/lose_target() + deltimer(teleport_timer) if(active) QDEL_NULL(current_beam) active = FALSE @@ -181,6 +211,7 @@ /datum/status_effect/cosmic_beam/proc/beam_died() SIGNAL_HANDLER to_chat(owner, span_warning("You lose control of the beam!")) + active = FALSE lose_target() duration = 0 @@ -194,24 +225,21 @@ current_target = target active = TRUE - current_beam = user.Beam(current_target, icon_state="cosmic_beam", time = 1 MINUTES, maxdistance = max_range, beam_type = /obj/effect/ebeam/cosmic) + current_beam = user.Beam(current_target, icon_state="cosmic_beam", time = 8 SECONDS, maxdistance = max_range, beam_type = /obj/effect/ebeam/cosmic) RegisterSignal(current_beam, COMSIG_QDELETING, PROC_REF(beam_died)) SSblackbox.record_feedback("tally", "gun_fired", 1, type) if(current_target) - on_beam_hit(current_target) + on_beam_hit(current_target, user) /// What to add when the beam connects to a target -/datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target) - if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) - target.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) - -/// What to process when the beam is connected to a target -/datum/status_effect/cosmic_beam/proc/on_beam_tick(mob/living/target) - if(target.adjustFireLoss(3, updating_health = FALSE)) - target.updatehealth() +/datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target, mob/living/user) + if(isstargazer(target)) + return + target.AddElement(cosmic_effect_trail, /obj/effect/forcefield/cosmic_field/star_touch) /// What to remove when the beam disconnects from a target /datum/status_effect/cosmic_beam/proc/on_beam_release(mob/living/target) - if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) - target.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + if(isstargazer(target)) + return + target.RemoveElement(cosmic_effect_trail, /obj/effect/forcefield/cosmic_field/star_touch) diff --git a/code/modules/antagonists/heretic/magic/void_conduit.dm b/code/modules/antagonists/heretic/magic/void_conduit.dm index 0b7d325e3f8..4ba5e0d547b 100644 --- a/code/modules/antagonists/heretic/magic/void_conduit.dm +++ b/code/modules/antagonists/heretic/magic/void_conduit.dm @@ -28,6 +28,7 @@ icon_state = "void_conduit" anchored = TRUE density = TRUE + max_integrity = 150 ///Overlay to apply to the tiles in range of the conduit var/static/image/void_overlay = image(icon = 'icons/turf/overlays.dmi', icon_state = "voidtile") ///List of tiles that we added an overlay to, so we can clear them when the conduit is deleted @@ -99,13 +100,9 @@ else affected_mob.apply_status_effect(/datum/status_effect/void_chill, 1) - if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly)) - var/obj/affected_door = thing_to_affect - affected_door.take_damage(rand(15, 30)) - - if(istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) - var/obj/structure/affected_structure = thing_to_affect - affected_structure.take_damage(rand(10, 20)) + if(istype(thing_to_affect, /obj/machinery/door) || istype(thing_to_affect, /obj/structure/door_assembly) || istype(thing_to_affect, /obj/structure/window) || istype(thing_to_affect, /obj/structure/grille)) + var/obj/affected_structure = thing_to_affect + affected_structure.take_damage(rand(15, 30)) /datum/looping_sound/void_conduit mid_sounds = 'sound/ambience/misc/ambiatm1.ogg' diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 473fa057cf5..74f00d6fba6 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -10,7 +10,7 @@ ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi' school = SCHOOL_FORBIDDEN - cooldown_time = 25 SECONDS + cooldown_time = 20 SECONDS invocation = "RE'L'TY PH'S'E." invocation_type = INVOCATION_WHISPER @@ -57,7 +57,7 @@ if(living_mob.can_block_magic(antimagic_flags)) continue living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) - living_mob.apply_status_effect(/datum/status_effect/void_chill, 1) + living_mob.apply_status_effect(/datum/status_effect/void_chill, 2) /obj/effect/temp_visual/voidin icon = 'icons/effects/96x96.dmi' diff --git a/code/modules/antagonists/heretic/magic/void_prison.dm b/code/modules/antagonists/heretic/magic/void_prison.dm index a70c4e36ffa..9a57213d01d 100644 --- a/code/modules/antagonists/heretic/magic/void_prison.dm +++ b/code/modules/antagonists/heretic/magic/void_prison.dm @@ -53,7 +53,7 @@ /datum/status_effect/void_prison/on_remove() if(!IS_HERETIC(owner)) - owner.apply_status_effect(/datum/status_effect/void_chill, 3) + owner.apply_status_effect(/datum/status_effect/void_chill, 1) if(stasis_overlay) //Free our prisoner owner.remove_traits(list(TRAIT_GODMODE, TRAIT_NO_TRANSFORM, TRAIT_SOFTSPOKEN), TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 4e73ff6f49b..b705940846e 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -1,7 +1,6 @@ /datum/action/cooldown/spell/aoe/void_pull name = "Void Pull" - desc = "Calls the void, damaging, knocking down, and stunning people nearby. \ - Distant foes are also pulled closer to you (but not damaged)." + desc = "Calls the void, damaging, knocking down, pulling people closer, and stunning people nearby." background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' @@ -14,12 +13,7 @@ invocation = "BR'NG F'RTH TH'M T' M'." invocation_type = INVOCATION_WHISPER spell_requirements = NONE - - aoe_radius = 7 - /// The radius of the actual damage circle done before cast - var/damage_radius = 1 - /// The radius of the stun applied to nearby people on cast - var/stun_radius = 4 + aoe_radius = 2 // Before the cast, we do some small AOE damage around the caster /datum/action/cooldown/spell/aoe/void_pull/before_cast(atom/cast_on) @@ -29,14 +23,9 @@ new /obj/effect/temp_visual/voidin(get_turf(cast_on)) - // Before we cast the actual effects, deal AOE damage to anyone adjacent to us - for(var/mob/living/nearby_living as anything in get_things_to_cast_on(cast_on, damage_radius)) - nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) - nearby_living.apply_status_effect(/datum/status_effect/void_chill, 1) - -/datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 1) +/datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center) var/list/things = list() - for(var/mob/living/nearby_mob in view(radius_override || aoe_radius, center)) + for(var/mob/living/nearby_mob in view(aoe_radius, center)) if(nearby_mob == owner || nearby_mob == center) continue // Don't grab people who are tucked away or something @@ -53,11 +42,9 @@ // For the actual cast, we microstun people nearby and pull them in /datum/action/cooldown/spell/aoe/void_pull/cast_on_thing_in_aoe(mob/living/victim, atom/caster) - // If the victim's within the stun radius, they're stunned / knocked down - if(get_dist(victim, caster) < stun_radius) - victim.AdjustKnockdown(3 SECONDS) - victim.AdjustParalyzed(0.5 SECONDS) - - // Otherwise, they take a few steps closer + victim.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) + victim.apply_status_effect(/datum/status_effect/void_chill, 3) + victim.AdjustKnockdown(3 SECONDS) + victim.AdjustParalyzed(0.5 SECONDS) for(var/i in 1 to 3) victim.forceMove(get_step_towards(victim, caster)) diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm index 16e3440ebbe..b05546328bf 100644 --- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -1,14 +1,14 @@ /datum/action/cooldown/spell/aoe/wave_of_desperation name = "Wave Of Desperation" desc = "Removes your restraints, repels and knocks down adjacent people, and applies certain effects of the Mansus Grasp upon everything nearby. \ - Cannot be cast unless you are restrained, and the stress renders you unconscious 12 seconds later!" + Cannot be cast unless you are restrained, and the stress renders you unconscious 12 seconds later! (Can be casted without a focus)" background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' button_icon_state = "uncuff" sound = 'sound/effects/magic/swap.ogg' - school = SCHOOL_FORBIDDEN + school = SCHOOL_EVOCATION cooldown_time = 5 MINUTES invocation = "F'K 'FF." diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 780676407cf..cf0f65278fc 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -24,6 +24,7 @@ owner.alpha = initial(owner.alpha) owner.pass_flags &= ~(PASSCLOSEDTURF | PASSGLASS | PASSGRILLE | PASSMACHINE | PASSSTRUCTURE | PASSTABLE | PASSMOB | PASSDOORS | PASSVEHICLE) owner.forceMove(location) + owner.apply_status_effect(/datum/status_effect/crucible_soul_cooldown) location = null /datum/status_effect/crucible_soul/get_examine_text() @@ -43,6 +44,14 @@ target = active_effect qdel(target) +/datum/status_effect/crucible_soul_cooldown + id = "Crucible Soul Cooldown" + status_type = STATUS_EFFECT_UNIQUE + duration = 2 MINUTES + alert_type = /atom/movable/screen/alert/status_effect/crucible_soul/cooldown + show_duration = TRUE + remove_on_fullheal = TRUE + // DUSK AND DAWN /datum/status_effect/duskndawn id = "Blessing of Dusk and Dawn" @@ -119,6 +128,10 @@ desc = "You phased through reality. You are halfway to your final destination..." icon_state = "crucible" +/atom/movable/screen/alert/status_effect/crucible_soul/cooldown + desc = "You have recently phased through reality. You must wait before you can do so once more." + icon_state = "crucible_cooldown" + /atom/movable/screen/alert/status_effect/duskndawn name = "Blessing of Dusk and Dawn" desc = "Many things hide beyond the horizon. With Owl's help I managed to slip past Sun's guard and Moon's watch." @@ -356,3 +369,24 @@ name = "Blessing of The Moon" desc = "The Moon clouds their vision, as the sun always has yours." icon_state = "moon_hide" + +// Last Resort +/datum/status_effect/heretic_lastresort + id = "heretic_lastresort" + alert_type = /atom/movable/screen/alert/status_effect/heretic_lastresort + duration = 12 SECONDS + status_type = STATUS_EFFECT_REPLACE + tick_interval = STATUS_EFFECT_NO_TICK + +/atom/movable/screen/alert/status_effect/heretic_lastresort + name = "Last Resort" + desc = "Your head spins, heart pumping as fast as it can, losing the fight with the ground. Run to safety!" + icon_state = "lastresort" + +/datum/status_effect/heretic_lastresort/on_apply() + ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + to_chat(owner, span_userdanger("You won't give up that easily! Run to safety!")) + return TRUE + +/datum/status_effect/heretic_lastresort/on_remove() + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 2ed47663fba..0e840f485cd 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -2,6 +2,7 @@ /datum/status_effect/amok id = "amok" status_type = STATUS_EFFECT_REPLACE + remove_on_fullheal = TRUE alert_type = null duration = 10 SECONDS tick_interval = 1 SECONDS @@ -33,6 +34,7 @@ /datum/status_effect/cloudstruck id = "cloudstruck" status_type = STATUS_EFFECT_REPLACE + remove_on_fullheal = TRUE alert_type = null duration = 3 SECONDS on_remove_on_mob_delete = TRUE @@ -103,6 +105,7 @@ /datum/status_effect/star_mark id = "star_mark" alert_type = /atom/movable/screen/alert/status_effect/star_mark + remove_on_fullheal = TRUE duration = 30 SECONDS status_type = STATUS_EFFECT_REPLACE ///overlay used to indicate that someone is marked @@ -130,7 +133,7 @@ return ..() /datum/status_effect/star_mark/on_apply() - if(istype(owner, /mob/living/basic/heretic_summon/star_gazer)) + if(isstargazer(owner)) return FALSE var/mob/living/spell_caster_resolved = spell_caster?.resolve() var/datum/antagonist/heretic_monster/monster = owner.mind?.has_antag_datum(/datum/antagonist/heretic_monster) @@ -154,28 +157,7 @@ /datum/status_effect/star_mark/extended duration = 3 MINUTES - -// Last Resort -/datum/status_effect/heretic_lastresort - id = "heretic_lastresort" - alert_type = /atom/movable/screen/alert/status_effect/heretic_lastresort - duration = 12 SECONDS - status_type = STATUS_EFFECT_REPLACE - tick_interval = STATUS_EFFECT_NO_TICK - -/atom/movable/screen/alert/status_effect/heretic_lastresort - name = "Last Resort" - desc = "Your head spins, heart pumping as fast as it can, losing the fight with the ground. Run to safety!" - icon_state = "lastresort" - -/datum/status_effect/heretic_lastresort/on_apply() - ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) - to_chat(owner, span_userdanger("You are on the brink of losing consciousness, run!")) - return TRUE - -/datum/status_effect/heretic_lastresort/on_remove() - REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) - owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE) +f /// Used by moon heretics to make people mad /datum/status_effect/moon_converted @@ -183,6 +165,8 @@ alert_type = /atom/movable/screen/alert/status_effect/moon_converted duration = STATUS_EFFECT_PERMANENT status_type = STATUS_EFFECT_REPLACE + remove_on_fullheal = TRUE + heal_flag_necessary = HEAL_ADMIN ///used to track damage var/damage_sustained = 0 ///overlay used to indicate that someone is marked @@ -208,12 +192,12 @@ /datum/status_effect/moon_converted/on_apply() RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) // Heals them so people who are in crit can have this affect applied on them and still be of some use for the heretic - owner.adjustBruteLoss( -150 + owner.mob_mood.sanity) + owner.adjustBruteLoss(-150 + owner.mob_mood.sanity) owner.adjustFireLoss(-150 + owner.mob_mood.sanity) to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") - owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) + owner.SetUnconscious(60 SECONDS, ignore_canstun = FALSE) ADD_TRAIT(owner, TRAIT_MUTE, TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) owner.update_appearance(UPDATE_OVERLAYS) @@ -249,6 +233,20 @@ owner.update_appearance(UPDATE_OVERLAYS) return ..() +// exists to apply sleep and deny adding duplicates +/datum/status_effect/moon_slept + id = "moon slept" + duration = 2 MINUTES + status_type = STATUS_EFFECT_UNIQUE + remove_on_fullheal = TRUE + alert_type = null + +/datum/status_effect/moon_slept/on_apply() + . = owner.SetUnconscious(duration * 0.5, ignore_canstun = FALSE) + if(!.) + owner.balloon_alert(owner, "sleep resisted!") + to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, w-wait no that's not right"))) + owner.balloon_alert(owner, "they lie..wait-what are they lying about?") /atom/movable/screen/alert/status_effect/moon_converted name = "Moon Converted" @@ -262,6 +260,7 @@ alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting duration = 10 MINUTES status_type = STATUS_EFFECT_UNIQUE + remove_on_fullheal = TRUE /datum/status_effect/eldritch_painting/on_apply() if(IS_HERETIC_OR_MONSTER(owner)) @@ -389,3 +388,64 @@ name = "Climb Over the Rusted Mountain" desc = "Your every footfall erodes the ground beneath you! Everything crumbles away! Maybe if you looked closer at the mountain in that painting, the path might be clearer..." icon_state = "eldritch_painting_rust" + +/atom/movable/screen/alert/status_effect/eldritch_parade + name = "Lunar Parade" + desc = "You MUST ENTER THE LUNAR PARADE! FOLLOW THE LIGHTS! LET THEM GUIDE YOU!" + icon = 'icons/obj/weapons/guns/projectiles.dmi' + icon_state = "lunar_parade" + +/datum/status_effect/moon_parade + id = "moon_parade" + remove_on_fullheal = TRUE + alert_type = /atom/movable/screen/alert/status_effect/eldritch_parade + duration = 20 SECONDS + tick_interval = -1 + /// The component that leashes us to the parade + var/datum/component/leash/leash_component + /// what atom we are leashed to + var/atom/leashed_to + /// how much damage before we release the leash + var/damage_release_threshold = 50 + /// how much damage we have received so far + var/damage_received = 0 + +/datum/status_effect/moon_parade/on_creation(mob/living/new_owner, atom/leashed_by) + leashed_to = leashed_by + . = ..() + +/datum/status_effect/moon_parade/on_apply() + if(!istype(leashed_to)) + return FALSE + owner.balloon_alert(owner, "you feel unable to move away from the [leashed_to]!") + leash_component = owner.AddComponent(/datum/component/leash, leashed_to, distance = 1) + RegisterSignal(leashed_to, COMSIG_QDELETING, PROC_REF(delete_self)) + RegisterSignal(owner, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(block_move)) + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damage_received)) + return TRUE + +/datum/status_effect/moon_parade/on_remove() + . = ..() + QDEL_NULL(leash_component) + UnregisterSignal(owner, list(COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, COMSIG_MOB_APPLY_DAMAGE)) + if(leashed_to) + UnregisterSignal(leashed_to, COMSIG_QDELETING) + +/datum/status_effect/moon_parade/proc/delete_self(datum/source) + SIGNAL_HANDLER + qdel(src) + +/datum/status_effect/moon_parade/proc/on_damage_received(mob/attacked, damage_amount, damagetype) + SIGNAL_HANDLER + if(damagetype == STAMINA) + return + damage_received += damage_amount + if(damage_received >= damage_release_threshold) + owner.balloon_alert(owner, "you are free!") + qdel(src) + +// Blocks movement in order to make it appear like the character is transfixed to the projectile and wandering after it +// Coded this way because its a simple way to hold the illusion compared to other methods +/datum/status_effect/moon_parade/proc/block_move(datum/source) + SIGNAL_HANDLER + return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE diff --git a/code/modules/antagonists/heretic/status_effects/heretic_passive.dm b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm new file mode 100644 index 00000000000..150f1384a7c --- /dev/null +++ b/code/modules/antagonists/heretic/status_effects/heretic_passive.dm @@ -0,0 +1,586 @@ +#define HERETIC_LEVEL_START 1 +#define HERETIC_LEVEL_UPGRADE 2 +#define HERETIC_LEVEL_FINAL 3 + +/datum/status_effect/heretic_passive + id = "heretic_passive" + duration = STATUS_EFFECT_PERMANENT + status_type = STATUS_EFFECT_REPLACE + alert_type = null + on_remove_on_mob_delete = TRUE + /// Reference to the owning heretic datum + var/datum/antagonist/heretic/heretic_datum + ///What level is our passive currently on + var/passive_level = HERETIC_LEVEL_START + /// Name of the passive, used by the UI + var/name = "Heretic Passive" + var/list/passive_descriptions = list( + "Grants you a passive ability based on your heretic type. This ability will upgrade as you gain more power.", + "Your passive ability has been upgraded, doing something else.", + "Your passive ability has been upgraded to its final form, granting you a powerful new ability.", + ) + +/datum/status_effect/heretic_passive/on_apply() + . = ..() + heretic_datum = GET_HERETIC(owner) + RegisterSignal(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST, PROC_REF(heretic_level_upgrade)) + RegisterSignal(heretic_datum, COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL, PROC_REF(heretic_level_final)) + if(!heretic_datum) + return FALSE + + // Just in case of shenanigans, assume the antag datum is correct about our level + if(heretic_datum.passive_level == 3) + heretic_level_final() + return + if(heretic_datum.passive_level == 2) + heretic_level_upgrade() + return + +/datum/status_effect/heretic_passive/on_remove() + UnregisterSignal(heretic_datum, list( + COMSIG_HERETIC_PASSIVE_UPGRADE_FIRST, + COMSIG_HERETIC_PASSIVE_UPGRADE_FINAL, + )) + heretic_datum = null + return ..() + +/// Gives our first upgrade +/datum/status_effect/heretic_passive/proc/heretic_level_upgrade() + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + passive_level = HERETIC_LEVEL_UPGRADE + heretic_datum.passive_level = HERETIC_LEVEL_UPGRADE + heretic_datum.update_data_for_all_viewers() + if(!heretic_datum.unlimited_blades) + heretic_datum.disable_blade_breaking() + +/// Gives our final upgrade +/datum/status_effect/heretic_passive/proc/heretic_level_final() + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + if(passive_level == HERETIC_LEVEL_START) + heretic_level_upgrade() + passive_level = HERETIC_LEVEL_FINAL + heretic_datum.passive_level = HERETIC_LEVEL_FINAL + heretic_datum.update_data_for_all_viewers() + + +//---- Ash Passive +// Level 1 grants heat and ash storm immunity +// Level 2 grants lava immunity +// Level 3 grants resistance to high pressure +/datum/status_effect/heretic_passive/ash + name = "Vow of Destruction" + passive_descriptions = list( + "Heat and ash storm immunity.", + "Lava immunity.", + "Resistance to high and low pressure." + ) + +/datum/status_effect/heretic_passive/ash/on_apply() + . = ..() + owner.add_traits(list(TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE), REF(src)) + +/datum/status_effect/heretic_passive/ash/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_LAVA_IMMUNE, REF(src)) + +/datum/status_effect/heretic_passive/ash/heretic_level_final() + . = ..() + owner.add_traits(list(TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE), REF(src)) + +/datum/status_effect/heretic_passive/ash/on_remove() + owner.remove_traits(list(TRAIT_RESISTHEAT, TRAIT_ASHSTORM_IMMUNE, TRAIT_LAVA_IMMUNE, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE), REF(src)) + return ..() + +//---- Blade Passive +// Gives you riposte while wielding a heretic blade +// Cooldown starts at 20 and goes down 5 seconds per level +// Level 1 has a 20 second cooldown + counts as block +// Level 2 Makes you immune to fall damage/stun from falling +// Level 3 only has the cooldown reduction (nothing else added) +/datum/status_effect/heretic_passive/blade + name = "Dance of the Brand" + id = "blade_passive" + passive_descriptions = list( + "Being attacked while wielding a Heretic Blade in either hand will deliver a free, instant counterattack to the attacker. This effect can only trigger once every 20 seconds.", + "Immunity to fall damage.", + "Cooldown of the riposte reduced to 10 seconds." + ) + /// The cooldown before we can riposte again + var/base_cooldown = 20 SECONDS + /// The cooldown reduction gained from upgrading + var/cooldown_reduction = 5 SECONDS + /// Whether the counter-attack is ready or not. + /// Used so we can give feedback when it's ready again + var/riposte_ready = TRUE + +/datum/status_effect/heretic_passive/blade/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_shield_reaction)) + +/datum/status_effect/heretic_passive/blade/heretic_level_upgrade() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) + +/datum/status_effect/heretic_passive/blade/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_LIVING_CHECK_BLOCK, COMSIG_LIVING_Z_IMPACT)) + +/// Blocks the effects from falling +/datum/status_effect/heretic_passive/blade/proc/z_impact_react(datum/source, levels, turf/fell_on) + SIGNAL_HANDLER + new /obj/effect/temp_visual/mook_dust(fell_on) + owner.visible_message(span_notice("[owner] lands on [fell_on] safely, and quite stylishly on [p_their()] feet!")) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/atom, SpinAnimation), 0.5 SECONDS, 0) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/, emote), "flip") + return ZIMPACT_CANCEL_DAMAGE | ZIMPACT_NO_MESSAGE | ZIMPACT_NO_SPIN + +/// Checks if we can counter-attack +/datum/status_effect/heretic_passive/blade/proc/on_shield_reaction( + mob/living/carbon/human/source, + atom/movable/hitby, + damage = 0, + attack_text = "the attack", + attack_type = MELEE_ATTACK, + armour_penetration = 0, + damage_type = BRUTE, +) + SIGNAL_HANDLER + + if(attack_type != MELEE_ATTACK) + return + + if(!riposte_ready) + return + + if(INCAPACITATED_IGNORING(source, INCAPABLE_GRAB)) + return + + var/mob/living/attacker = hitby.loc + if(!istype(attacker)) + return + + if(!source.Adjacent(attacker)) + return + + // Let's check their held items to see if we can do a riposte + var/obj/item/main_hand = source.get_active_held_item() + var/obj/item/off_hand = source.get_inactive_held_item() + // This is the item that ends up doing the "blocking" (flavor) + var/obj/item/striking_with + + // First we'll check if the offhand is valid + if(!QDELETED(off_hand) && istype(off_hand, /obj/item/melee/sickly_blade)) + striking_with = off_hand + + // Then we'll check the mainhand + // We do mainhand second, because we want to prioritize it over the offhand + if(!QDELETED(main_hand) && istype(main_hand, /obj/item/melee/sickly_blade)) + striking_with = main_hand + + // No valid item in either slot? No riposte + if(!striking_with) + return + + // If we made it here, deliver the strike + INVOKE_ASYNC(src, PROC_REF(counter_attack), source, attacker, striking_with, attack_text) + + // And reset after a bit + riposte_ready = FALSE + addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), (base_cooldown - cooldown_reduction * (passive_level - 1))) + + if(passive_level > HERETIC_LEVEL_START) + return SUCCESSFUL_BLOCK + +/// Does the actual counter-attack +/datum/status_effect/heretic_passive/blade/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) + playsound(get_turf(source), 'sound/items/weapons/parry.ogg', 100, TRUE) + source.balloon_alert(source, "riposte used") + source.visible_message( + span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), + span_warning("You lean into [attack_text] and deliver a sudden riposte back at [target]!"), + span_hear("You hear a clink, followed by a stab."), + ) + weapon.melee_attack_chain(source, target) + +/// Gives feedback to the user +/datum/status_effect/heretic_passive/blade/proc/reset_riposte(mob/living/carbon/human/source) + riposte_ready = TRUE + source.balloon_alert(source, "riposte ready") + +//---- Cosmic Passive +// Level 1 Cosmic fields will speed up the caster and provide stamina regen +// Level 2 Cosmic fields will disable any nearby bombs/TTVs/Syndicate Bombs +// Level 3 Cosmic fields will temporarily slow down bullets that pass through them +/datum/status_effect/heretic_passive/cosmic + name = "Chosen of the Stars" + id = "cosmic_passive" + passive_descriptions = list( + "Cosmic fields speed you up and regenerate stamina.", + "Cosmic fields disrupt grenades or signalers from being activated and turn off already primed grenades.", + "Cosmic fields slow projectiles down." + ) + +/datum/status_effect/heretic_passive/cosmic/tick(seconds_between_ticks) + . = ..() + if(locate(/obj/effect/forcefield/cosmic_field) in get_turf(owner)) + var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. + owner.adjustStaminaLoss(-15 * delta_time, updating_stamina = FALSE) + +/** + * Creates a cosmic field at a given loc + * + * * Args: + * * `loc`: Where the cosmic field is created + * * Optional `creator`: Checks if the passed mob has a cosmic passive. Upgrades the cosmic field based on their passive level + * * Optional `type`: Makes a specific type of cosmic field if we don't want the default + */ +/proc/create_cosmic_field(loc, mob/living/creator, type = /obj/effect/forcefield/cosmic_field) + var/obj/effect/forcefield/cosmic_field/new_field + new_field = new type(loc) + + if(!creator || !ismob(creator)) + return + if(isstargazer(creator)) + new_field.slows_projectiles() + new_field.prevents_explosions() + return + var/datum/status_effect/heretic_passive/cosmic/cosmic_passive = creator.has_status_effect(/datum/status_effect/heretic_passive/cosmic) + if(!cosmic_passive) + return + if(cosmic_passive.passive_level > HERETIC_LEVEL_START) + new_field.prevents_explosions() + if(cosmic_passive.passive_level > HERETIC_LEVEL_UPGRADE) + new_field.slows_projectiles() + +//---- Flesh Passive +// Makes you never get disgust, virus immune and immune to damage from space ants +// Level 2, organs and raw meat heals you. You also become a voracious glutton who likes all food. No slowdown from being fat +// Level 3, being fat gives damage resistance +/datum/status_effect/heretic_passive/flesh + name = "Ravenous Hunger" + id = "flesh_passive" + passive_descriptions = list( + "Immunity to Diseases, Disgust and space ants.", + "Eating organs or meat now heals you, gain the voracious and gluttonous trait and being fat doesn't slow you down.", + "Gain a flat 25% damage and stamina damage reduction when fat as well as baton resistance." + ) + +/datum/status_effect/heretic_passive/flesh/on_apply() + . = ..() + owner.add_traits(list(TRAIT_VIRUSIMMUNE, TRAIT_SPACE_ANT_IMMUNITY), REF(src)) + +/datum/status_effect/heretic_passive/flesh/tick(seconds_between_ticks) + . = ..() + owner.set_disgust(0) + +/datum/status_effect/heretic_passive/flesh/heretic_level_upgrade() + . = ..() + RegisterSignal(owner, COMSIG_LIVING_EAT_FOOD, PROC_REF(on_eat)) + owner.add_traits(list(TRAIT_FAT_IGNORE_SLOWDOWN, TRAIT_VORACIOUS, TRAIT_GLUTTON), REF(src)) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/fat_human = owner + fat_human.on_fat() // Make sure to update the movespeed modifier in case we gain the trait while already fat + var/obj/item/organ/tongue/tongue = fat_human.get_organ_slot(ORGAN_SLOT_TONGUE) + tongue.liked_foodtypes = ALL + tongue.disliked_foodtypes = NONE + tongue.toxic_foodtypes = NONE + +/// Any time you take a bite of something, if it's meat or an organ you will heal some damage +/datum/status_effect/heretic_passive/flesh/proc/on_eat(mob/eater, atom/food) + SIGNAL_HANDLER + var/obj/item/organ/consumed_organ = food + if(istype(consumed_organ) && consumed_organ.foodtype_flags & MEAT) + heal_glutton() // Heal the owner if they eat meat + return + var/obj/item/food/consumed_food = food + if(istype(consumed_food) && consumed_food.foodtypes & MEAT) + heal_glutton() // Heal the owner if they eat meat + +/datum/status_effect/heretic_passive/flesh/proc/heal_glutton() + var/healed_amount = owner.heal_overall_damage(2, 2, updating_health = FALSE) + healed_amount += owner.adjustOxyLoss(-2, FALSE) + healed_amount += owner.adjustToxLoss(-2, FALSE, TRUE) + if(!HAS_TRAIT(owner, TRAIT_NOBLOOD)) + owner.blood_volume += 2.5 + if(!iscarbon(owner)) + return + var/mob/living/carbon/carbon_eater = owner + for(var/obj/item/bodypart/wounded_limb as anything in carbon_eater.bodyparts) + for(var/datum/wound/to_cure as anything in wounded_limb.wounds) + to_cure.remove_wound() + break + if(healed_amount > 0) + owner.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(owner), COLOR_RED) + +/datum/status_effect/heretic_passive/flesh/heretic_level_final() + . = ..() + if(!ishuman(owner)) + return + var/mob/living/carbon/human/fat_human = owner + RegisterSignals(fat_human, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_fat)) + on_fat() + +/// Gives/Removes damage resistance when we become/lose fatness +/datum/status_effect/heretic_passive/flesh/proc/on_fat(datum/source) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/heretic = owner + if(HAS_TRAIT(heretic, TRAIT_FAT)) + heretic.physiology.damage_resistance += 25 + ADD_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src)) + else + heretic.physiology.damage_resistance -= 25 + REMOVE_TRAIT(heretic, TRAIT_BATON_RESISTANCE, REF(src)) + +/datum/status_effect/heretic_passive/flesh/on_remove() + . = ..() + owner.remove_traits(list(TRAIT_VIRUSIMMUNE, TRAIT_SPACE_ANT_IMMUNITY, TRAIT_FAT_IGNORE_SLOWDOWN, TRAIT_VORACIOUS, TRAIT_GLUTTON, TRAIT_BATON_RESISTANCE), REF(src)) + UnregisterSignal(owner, list(COMSIG_LIVING_EAT_FOOD, SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT))) + if(!ishuman(owner)) + return + var/mob/living/carbon/human/heretic = owner + if(!HAS_TRAIT(heretic, TRAIT_FAT)) + return + heretic.physiology.damage_resistance -= 25 + heretic.on_fat() + +//---- Lock Passive +// On gain you can understand and speak every language +// Level 1 Shock immunity + Side knowledge is cheaper +// Level 2 Gains X-ray Vision +// Level 3 your grasp no longer goes on cooldown when opening things +/datum/status_effect/heretic_passive/lock + name = "Open Invitation" + id = "lock_passive" + passive_descriptions = list( + "Shock insulation, all knowledges researched from the shop are cheaper", + "X-ray vision, you can see through walls and objects.", + "Grasp no longer goes on cooldown when used to open a door or locker." + ) + +/datum/status_effect/heretic_passive/lock/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, REF(src)) + RegisterSignal(heretic_datum, COMSIG_HERETIC_SHOP_SETUP, PROC_REF(on_shop_setup)) // Just in case we are applying this after the shop was set up + +/datum/status_effect/heretic_passive/lock/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_XRAY_VISION, REF(src)) + owner.update_sight() + +/datum/status_effect/heretic_passive/lock/heretic_level_final() + . = ..() + ADD_TRAIT(owner, TRAIT_LOCK_GRASP_UPGRADED, REF(src)) + +/datum/status_effect/heretic_passive/lock/on_remove() + UnregisterSignal(owner, COMSIG_HERETIC_SHOP_SETUP) + owner.remove_traits(list(TRAIT_SHOCKIMMUNE, TRAIT_XRAY_VISION, TRAIT_LOCK_GRASP_UPGRADED), REF(src)) + owner.update_sight() + return ..() + +/datum/status_effect/heretic_passive/lock/proc/on_shop_setup(datum/antagonist/heretic/heretic_datum) + SIGNAL_HANDLER + var/list/shop = heretic_datum.heretic_shops[HERETIC_KNOWLEDGE_SHOP] + for(var/knowledge_type in shop) + var/list/heretic_info = shop[knowledge_type] + if(heretic_info) + heretic_info[HKT_COST] = max(1, heretic_info[HKT_COST] - 1) // Reduce cost by 1, minimum of 1 + +//---- Moon Passive +// Heals 5 brain damage per level +// Prevents brain trauma +// Level 2 grants sleep immunity +// Level 3, Mind gate + Ringleader's rise will channel the moon amulet effects +/datum/status_effect/heretic_passive/moon + name = "Do You Hear The Voices Too?" + id = "moon_passive" + passive_descriptions = list( + "Can no longer develop brain traumas, passively regenerates brain health, (this bonus is halved in combat).", + "Sleep immunity, increases the ratio at which your brain damage regenerates.", + "Mind gate and Ringleader's rise will channel the moon amulet effects, further inreases brain regeneration." + ) + /// Built-in moon amulet which channels through your spells + var/obj/item/clothing/neck/heretic_focus/moon_amulet/amulet + /// When were we last attacked? + var/last_attack = 0 + /// How long the combat tag lasts for + var/combat_lockout = 5 SECONDS + /// Boolean if you are wearing the moon amulet + var/amulet_equipped = FALSE + +/datum/status_effect/heretic_passive/moon/on_apply() + . = ..() + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + ADD_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src)) + owner.AddElement(/datum/element/relay_attackers) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/// Saves world.time when we are attacked by anything +/datum/status_effect/heretic_passive/moon/proc/on_attacked(mob/victim, atom/attacker) + SIGNAL_HANDLER + last_attack = world.time + +/datum/status_effect/heretic_passive/moon/tick(seconds_between_ticks) + . = ..() + var/healing_amount = ((world.time > last_attack + combat_lockout) ? -1 * passive_level * seconds_between_ticks : -2 * passive_level * seconds_between_ticks) + if(heretic_datum.ascended) + healing_amount = -15 * seconds_between_ticks + if(!amulet_equipped) + healing_amount *= 0.5 // Half healing if you dont have the moon amulet + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, healing_amount) + + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if(!our_brain) + return + for(var/datum/brain_trauma/trauma as anything in our_brain.traumas) + if(istype(trauma, BRAIN_TRAUMA_MILD) || istype(trauma, BRAIN_TRAUMA_SEVERE)) + our_brain.cure_trauma_type(trauma.type, trauma.resilience) + +/datum/status_effect/heretic_passive/moon/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_SLEEPIMMUNE, REF(src)) + +/datum/status_effect/heretic_passive/moon/heretic_level_final() + . = ..() + amulet = new() + +/datum/status_effect/heretic_passive/moon/on_remove() + var/obj/item/organ/brain/our_brain = owner.get_organ_slot(ORGAN_SLOT_BRAIN) + REMOVE_TRAIT(our_brain, TRAIT_BRAIN_TRAUMA_IMMUNITY, REF(src)) + REMOVE_TRAIT(owner, TRAIT_SLEEPIMMUNE, REF(src)) + UnregisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED) + QDEL_NULL(amulet) + return ..() + +//---- Rust Passive +// Level 2 and 3 will increase our rust strength +// Level 1 provides healing and baton resist when standing on rust +// Level 2 will heal wounds when standing on rust +// Level 3 will restore lost limbs when standing on rust +/datum/status_effect/heretic_passive/rust + name = "Leeching Walk" + id = "rust_passive" + passive_descriptions = list( + "Standing on Rusted tiles heals and purge chems off your body.", + "Standing on Rusted tiles closes up your wounds and heals your organs, you may now rust reinforced floors and walls, healing effect increased.", + "Standing on Rusted tiles regenerates your limbs, you may now rust titanium and plastitanium walls, healing effect increased." + ) + +/datum/status_effect/heretic_passive/rust/on_apply() + . = ..() + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + +/datum/status_effect/heretic_passive/rust/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_LIFE)) + +/datum/status_effect/heretic_passive/rust/heretic_level_upgrade() + . = ..() + if(heretic_datum.rust_strength < 2) + heretic_datum.increase_rust_strength() // Bring us up to 2 + +/datum/status_effect/heretic_passive/rust/heretic_level_final() + . = ..() + if(heretic_datum.rust_strength < 3) + heretic_datum.increase_rust_strength() // Bring us up to 3 + +/* + * Signal proc for [COMSIG_MOVABLE_MOVED]. + * + * Checks if we should have baton resistance on the new turf. + */ +/datum/status_effect/heretic_passive/rust/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) + SIGNAL_HANDLER + + var/turf/mover_turf = get_turf(source) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) + ADD_TRAIT(source, TRAIT_BATON_RESISTANCE, REF(src)) + else + REMOVE_TRAIT(source, TRAIT_BATON_RESISTANCE, REF(src)) + +/** + * Signal proc for [COMSIG_LIVING_LIFE]. + * + * Gradually heals the heretic ([source]) on rust, + * including baton knockdown and stamina damage. + */ +/datum/status_effect/heretic_passive/rust/proc/on_life(mob/living/source, seconds_per_tick, times_fired) + SIGNAL_HANDLER + + var/turf/our_turf = get_turf(source) + if(!HAS_TRAIT(our_turf, TRAIT_RUSTY)) + return + + // Heals all damage + Stamina + var/need_mob_update = FALSE + var/delta_time = DELTA_WORLD_TIME(SSmobs) * 0.5 // SSmobs.wait is 2 secs, so this should be halved. + var/main_healing = 1 + 1 * passive_level * delta_time + var/stam_healing = 5 + 5 * passive_level * delta_time + need_mob_update += source.heal_overall_damage(-main_healing, -main_healing, updating_health = FALSE) + need_mob_update += source.adjustStaminaLoss(-stam_healing, updating_stamina = FALSE) + need_mob_update += source.adjustToxLoss(-main_healing, updating_health = FALSE, forced = TRUE) // Slimes are people too + need_mob_update += source.adjustOxyLoss(-main_healing, updating_health = FALSE) + if(need_mob_update) + source.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(owner), COLOR_BROWN) + // Reduces duration of stuns/etc + var/stun_reduction = 0.5 * passive_level * delta_time + source.AdjustAllImmobility(-stun_reduction) + // Heals blood loss + if(source.blood_volume < BLOOD_VOLUME_NORMAL) + source.blood_volume += 2.5 * delta_time + for(var/datum/reagent/reagent as anything in source.reagents.reagent_list) + source.reagents.remove_reagent(reagent.type, 2 * reagent.purge_multiplier * REM * seconds_per_tick) + + if(!iscarbon(source)) + return + var/mob/living/carbon/carbon_owner = source + if(passive_level < HERETIC_LEVEL_UPGRADE) + return + for(var/obj/item/bodypart/wounded_limb as anything in carbon_owner.bodyparts) + for(var/datum/wound/to_cure as anything in wounded_limb.wounds) + to_cure.remove_wound() + for(var/obj/item/organ/internal as anything in carbon_owner.organs) + internal.apply_organ_damage(round(-2 * seconds_per_tick)) + if(passive_level < HERETIC_LEVEL_FINAL) + return + if(length(carbon_owner.get_missing_limbs())) + carbon_owner.regenerate_limbs() + +//---- Void Passive +// Level 1 Cold and Low pressure resist +// Level 2 No breathe +// Level 3 No slip on water/ice +/datum/status_effect/heretic_passive/void + name = "Aristocrat's Way" + id = "void_passive" + passive_descriptions = list( + "Cold and low pressure immunity.", + "You no longer need to breathe.", + "Water, ice and slippery surfaces no slip you." + ) + +/datum/status_effect/heretic_passive/void/on_apply() + . = ..() + owner.add_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE), REF(src)) + +/datum/status_effect/heretic_passive/void/heretic_level_upgrade() + . = ..() + ADD_TRAIT(owner, TRAIT_NOBREATH, REF(src)) + +/datum/status_effect/heretic_passive/void/heretic_level_final() + . = ..() + owner.add_traits(list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE), REF(src)) + +/datum/status_effect/heretic_passive/void/on_remove() + . = ..() + owner.remove_traits(list(TRAIT_RESISTCOLD, TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE), REF(src)) + +#undef HERETIC_LEVEL_START +#undef HERETIC_LEVEL_UPGRADE +#undef HERETIC_LEVEL_FINAL diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 3069eb9b19d..0812a8dbacd 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -220,7 +220,7 @@ /datum/status_effect/eldritch/cosmic/on_effect() new teleport_effect(get_turf(owner)) - new /obj/effect/forcefield/cosmic_field(get_turf(owner)) + create_cosmic_field(get_turf(owner), owner) do_teleport( owner, get_turf(cosmic_diamond), @@ -258,12 +258,12 @@ /datum/status_effect/eldritch/moon/on_apply() . = ..() - if(owner.can_block_magic(MAGIC_RESISTANCE_MIND)) + if(owner.can_block_magic(MAGIC_RESISTANCE_MOON)) return FALSE ADD_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) owner.emote(pick("giggle", "laugh")) owner.balloon_alert(owner, "you feel unable to hurt a soul!") - RegisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) return TRUE /// Checks for damage so the heretic can't just attack them with another weapon whilst they are unable to fight back @@ -292,7 +292,7 @@ /datum/status_effect/eldritch/moon/on_remove() . = ..() - UnregisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE) + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE) // In case the trait was not removed earlier REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAIT_STATUS_EFFECT(id)) diff --git a/code/modules/antagonists/heretic/status_effects/void_chill.dm b/code/modules/antagonists/heretic/status_effects/void_chill.dm index ce302e21c3a..73d82cefb9e 100644 --- a/code/modules/antagonists/heretic/status_effects/void_chill.dm +++ b/code/modules/antagonists/heretic/status_effects/void_chill.dm @@ -26,6 +26,8 @@ /datum/status_effect/void_chill/on_apply() if(issilicon(owner)) return FALSE + if(IS_HERETIC_OR_MONSTER(owner)) + return FALSE return TRUE /datum/status_effect/void_chill/on_remove() diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index fa2199362ce..51fe408dfef 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -78,6 +78,25 @@ return /obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) + playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) + set_anchored(!anchored) + balloon_alert(user, "[anchored ? "":"un"]anchored") + return ITEM_INTERACT_SUCCESS + if(istype(tool, /obj/item/reagent_containers/cup/beaker/eldritch)) + if(current_mass < max_mass) + balloon_alert(user, "not full enough!") + return ITEM_INTERACT_SUCCESS + var/obj/item/reagent_containers/cup/beaker/eldritch/to_fill = tool + if(to_fill.reagents.total_volume >= to_fill.reagents.maximum_volume) + balloon_alert(user, "flask is full!") + return ITEM_INTERACT_SUCCESS + to_fill.reagents.add_reagent(/datum/reagent/eldritch, 50) + do_item_attack_animation(src, used_item = tool, animation_type = ATTACK_ANIMATION_BLUNT) + current_mass-- + balloon_alert(user, "refilled flask") + return ITEM_INTERACT_SUCCESS + if(isbodypart(tool)) var/obj/item/bodypart/consumed = tool if(!IS_ORGANIC_LIMB(consumed)) @@ -109,26 +128,6 @@ return NONE -/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) - playsound(src, 'sound/items/deconstruct.ogg', 30, TRUE, ignore_walls = FALSE) - set_anchored(!anchored) - balloon_alert(user, "[anchored ? "":"un"]anchored") - return ITEM_INTERACT_SUCCESS - if(istype(tool, /obj/item/reagent_containers/cup/beaker/eldritch)) - if(current_mass < max_mass) - balloon_alert(user, "not full enough!") - return ITEM_INTERACT_SUCCESS - var/obj/item/reagent_containers/cup/beaker/eldritch/to_fill = tool - if(to_fill.reagents.total_volume >= to_fill.reagents.maximum_volume) - balloon_alert(user, "flask is full!") - return ITEM_INTERACT_SUCCESS - to_fill.reagents.add_reagent(/datum/reagent/eldritch, 50) - do_item_attack_animation(src, used_item = tool, animation_type = ATTACK_ANIMATION_BLUNT) - current_mass-- - balloon_alert(user, "refilled flask") - return ITEM_INTERACT_SUCCESS - /obj/structure/destructible/eldritch_crucible/attack_hand(mob/user, list/modifiers) . = ..() if(.) @@ -253,6 +252,8 @@ var/crucible_tip = "Doesn't do anything." /// Typepath to the status effect this applies var/status_effect + /// If you can drink the same potion while the effect is active + var/can_refresh = TRUE /obj/item/eldritch_potion/examine(mob/user) . = ..() @@ -269,6 +270,9 @@ if(!iscarbon(user)) return + if(!can_refresh && user.has_status_effect(status_effect)) + return + playsound(src, 'sound/effects/bubbles/bubbles.ogg', 50, TRUE) if(!IS_HERETIC_OR_MONSTER(user)) @@ -297,7 +301,14 @@ desc = "A glass bottle containing a bright orange, translucent liquid." icon_state = "crucible_soul" status_effect = /datum/status_effect/crucible_soul - crucible_tip = "Allows you to walk through walls. After expiring, you are teleported to your original location. Lasts 15 seconds." + crucible_tip = "Allows you to walk through walls. After expiring, you are teleported to your original location. Lasts 40 seconds." + can_refresh = FALSE + +/obj/item/eldritch_potion/crucible_soul/attack_self(mob/user) + if(user.has_status_effect(/datum/status_effect/crucible_soul_cooldown)) + balloon_alert(user, "on cooldown!") + return TRUE + return ..() /obj/item/eldritch_potion/duskndawn name = "brew of dusk and dawn" diff --git a/code/modules/antagonists/heretic/transmutation_rune.dm b/code/modules/antagonists/heretic/transmutation_rune.dm index f8c44bfd062..fb5ba8de50d 100644 --- a/code/modules/antagonists/heretic/transmutation_rune.dm +++ b/code/modules/antagonists/heretic/transmutation_rune.dm @@ -189,7 +189,7 @@ // This doesn't necessarily mean the ritual will succeed, but it's valid! // Do the animations and associated feedback. flick("[icon_state]_active", src) - playsound(user, 'sound/effects/magic/castsummon.ogg', 75, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10) + playsound(user, 'sound/effects/magic/castsummon.ogg', 50, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_exponent = 10, ignore_walls = FALSE) // - We temporarily make all of our chosen atoms invisible, as some rituals may sleep, // and we don't want people to be able to run off with ritual items. diff --git a/code/modules/antagonists/ninja/energy_katana.dm b/code/modules/antagonists/ninja/energy_katana.dm index 1182bd56873..a03dfa66fd9 100644 --- a/code/modules/antagonists/ninja/energy_katana.dm +++ b/code/modules/antagonists/ninja/energy_katana.dm @@ -88,7 +88,7 @@ var/obj/item/sword = target if(length(line) <= 1 || !teleport(user, line[length(line) - 1])) // teleports to the second last turf, should be adjacent to the target return - if(!user.CanReach(stabbing, target)) + if(!stabbing.IsReachableBy(user, sword?.reach)) return sword.melee_attack_chain(user, stabbing) if(prob(5) && check_holidays(APRIL_FOOLS)) diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index e484a8cd097..5b75e046199 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -58,7 +58,17 @@ /datum/outfit/pirate/space/captain/cardboard name = "Space Pirate Captain (EVA)" - l_hand = /obj/item/nullrod/claymore/saber/pirate + l_hand = /obj/item/fake_e_cutlass + +/obj/item/fake_e_cutlass + name = "fake energy cutlass" + desc = "Damn, son, where'd you find this? (Tell a coder if you do)" + icon = 'icons/obj/weapons/transforming_energy.dmi' + icon_state = "e_cutlass_on" + inhand_icon_state = "e_cutlass_on" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + item_flags = ABSTRACT /datum/outfit/pirate/silverscale name = "Silver Scale Member" diff --git a/code/modules/antagonists/pirate/pirate_roles.dm b/code/modules/antagonists/pirate/pirate_roles.dm index bbde9ea0bef..9d7cf14cbbb 100644 --- a/code/modules/antagonists/pirate/pirate_roles.dm +++ b/code/modules/antagonists/pirate/pirate_roles.dm @@ -205,7 +205,7 @@ outfit = /datum/outfit/pirate/medieval rank = "Footsoldier" -/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/special(mob/living/carbon/spawned_mob) +/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/special(mob/living/carbon/spawned_mob, mob/mob_possessor) . = ..() if(rank == "Footsoldier") spawned_mob.add_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), INNATE_TRAIT) @@ -217,7 +217,7 @@ rank = "Warlord" outfit = /datum/outfit/pirate/medieval/warlord -/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord/special(mob/living/carbon/spawned_mob) +/obj/effect/mob_spawn/ghost_role/human/pirate/medieval/warlord/special(mob/living/carbon/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.dna.add_mutation(/datum/mutation/hulk/superhuman, MUTATION_SOURCE_GHOST_ROLE) spawned_mob.dna.add_mutation(/datum/mutation/gigantism, MUTATION_SOURCE_GHOST_ROLE) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 5f538904073..94e5f0c0484 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -180,20 +180,20 @@ . = ..() var/mob/living/real_mob = mob_override || owner.current real_mob.AddComponentFrom(REF(src), /datum/component/can_flash_from_behind) - RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, PROC_REF(on_flash_success)) + RegisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, PROC_REF(on_flash_success)) /datum/antagonist/rev/head/remove_innate_effects(mob/living/mob_override) . = ..() var/mob/living/real_mob = mob_override || owner.current real_mob.RemoveComponentSource(REF(src), /datum/component/can_flash_from_behind) - UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON) + UnregisterSignal(real_mob, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB) -/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON]. +/// Signal proc for [COMSIG_MOB_SUCCESSFUL_FLASHED_MOB]. /// Bread and butter of revolution conversion, successfully flashing a carbon will make them a revolutionary -/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/carbon/flashed, obj/item/assembly/flash/flash, deviation) +/datum/antagonist/rev/head/proc/on_flash_success(mob/living/source, mob/living/flashed, obj/item/assembly/flash/flash, deviation) SIGNAL_HANDLER - if(flashed.stat == DEAD) + if(flashed.stat == DEAD || issilicon(flashed) || isdrone(flashed)) return if(flashed.stat != CONSCIOUS) to_chat(source, span_warning("[flashed.p_They()] must be conscious before you can convert [flashed.p_them()]!")) diff --git a/code/modules/antagonists/sentient_creature/sentient_creature.dm b/code/modules/antagonists/sentient_creature/sentient_creature.dm index 48b149574f9..b2035471c46 100644 --- a/code/modules/antagonists/sentient_creature/sentient_creature.dm +++ b/code/modules/antagonists/sentient_creature/sentient_creature.dm @@ -23,6 +23,11 @@ var/mob/living/master = owner.enslaved_to?.resolve() if(master) owner.current.copy_languages(master, LANGUAGE_MASTER) + ADD_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src)) + return ..() + +/datum/antagonist/sentient_creature/on_removal() + REMOVE_TRAIT(owner, TRAIT_UNCONVERTABLE, REF(src)) return ..() /datum/antagonist/sentient_creature/ui_static_data(mob/user) diff --git a/code/modules/antagonists/traitor/contractor/contractor_items.dm b/code/modules/antagonists/traitor/contractor/contractor_items.dm index 8d1dbf99e44..86bbaf4168c 100644 --- a/code/modules/antagonists/traitor/contractor/contractor_items.dm +++ b/code/modules/antagonists/traitor/contractor/contractor_items.dm @@ -11,23 +11,23 @@ name = "Contractor Guide" default_raw_text = {"Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives,\ this kit will provide you contracts to take on for TC payments.\ -

Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the\ - Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed\ +

Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the \ + Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed \ to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime.

\ -

Your standard issue contractor baton hits harder than the ones you might be used to, and likely be your go to weapon for kidnapping your\ - targets. The three additional items have been randomly selected from what we had available. We hope they're useful to you for your mission.

\ -

The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep,\ +

Your standard issue contractor baton hits harder than the ones you might be used to, and likely be your go to weapon for kidnapping your \ + targets.

\ +

The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep, \ with two Rep being provided each time you complete a contract.

\

Using the tablet

\
    \
  1. Open the Syndicate Contract Uplink program.
  2. \
  3. Here, you can accept a contract, and redeem your TC payments from completed contracts.
  4. \ -
  5. The payment number shown in brackets is the bonus you'll receive when bringing your target alive. You receive the\ +
  6. The payment number shown in brackets is the bonus you'll receive when bringing your target alive. You receive the \ other number regardless of if they were alive or dead.
  7. \ -
  8. Contracts are completed by bringing the target to designated dropoff, calling for extraction, and putting them\ +
  9. Contracts are completed by bringing the target to designated dropoff, calling for extraction, and putting them \ inside the pod.
  10. \
\ -

Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it\ +

Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it \ unavailable to take on again.

\

The tablet can also be recharged at any cell charger.

\

Extracting

\ @@ -38,7 +38,7 @@
  • Grab your target, and drag them into the pod.
  • \ \

    Ransoms

    \ -

    We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back\ - from where you sent them off from in several minutes time. Don't worry, we give you a cut of what we get paid. We pay this into whatever\ +

    We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back + from where you sent them off from in several minutes time. Don't worry, we give you a cut of what we get paid. We pay this into whatever \ ID card you have equipped, on top of the TC payment we give.

    \

    Good luck agent. You can burn this document with the supplied lighter.

    "} diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index e0244a59b29..922ce111d7b 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -422,7 +422,7 @@ /obj/item/soulstone/proc/check_menu(mob/user, obj/structure/constructshell/shell) if(!istype(user)) return FALSE - if(user.incapacitated || !user.is_holding(src) || !user.CanReach(shell, src)) + if(user.incapacitated || !user.is_holding(src) || !shell.IsReachableBy(user, reach)) return FALSE return TRUE @@ -494,7 +494,7 @@ /// Called when a ghost is chosen to become a shade. /obj/item/soulstone/proc/on_poll_concluded(mob/living/master, mob/living/victim, mob/dead/observer/ghost) - if(isnull(victim) || master.incapacitated || !master.is_holding(src) || !master.CanReach(victim, src)) + if(isnull(victim) || master.incapacitated || !master.is_holding(src) || !victim.IsReachableBy(master, reach)) return FALSE if(isnull(ghost?.client)) to_chat(master, span_danger("There were no spirits willing to become a shade.")) diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index a30588f333d..068ebebeba3 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -360,7 +360,7 @@ /obj/item/canvas/proc/can_select_frame(mob/user) if(!istype(loc, /obj/structure/sign/painting)) return FALSE - if(!user?.CanReach(loc) || IS_DEAD_OR_INCAP(user)) + if(!loc.IsReachableBy(user) || IS_DEAD_OR_INCAP(user)) return FALSE if(!last_patron || !IS_WEAKREF_OF(user?.mind, last_patron)) return FALSE @@ -930,7 +930,7 @@ var/our_dir = get_dir(user, on_wall) var/check_dir = our_dir & (EAST|WEST) ? NORTH : EAST var/turf/closed/wall/second_wall = get_step(on_wall, check_dir) - if(!istype(second_wall) || !user.CanReach(second_wall)) + if(!istype(second_wall) || !second_wall.IsReachableBy(user)) to_chat(user, span_warning("You need a reachable wall to the [check_dir == EAST ? "right" : "left"] of this one to mount this frame!")) return FALSE if(check_wall_item(second_wall, our_dir, wall_external)) diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 8c8900cb025..bc28b4146ea 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -62,7 +62,7 @@ /obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - flash_carbon(user, user, confusion_duration = 15 SECONDS, targeted = FALSE) + flash_mob(user, user, confusion_duration = 15 SECONDS, targeted = FALSE) return FALSE return TRUE @@ -91,8 +91,8 @@ if(user) targets -= user to_chat(user, span_danger("[src] emits a blinding light!")) - for(var/mob/living/carbon/nearby_carbon in targets) - flash_carbon(nearby_carbon, user, confusion_duration, targeted = FALSE, generic_message = TRUE) + for(var/mob/living/nearby_living in targets) + flash_mob(nearby_living, user, confusion_duration, targeted = FALSE, generic_message = TRUE) return TRUE /obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE) @@ -136,13 +136,13 @@ * * targeted - determines if it was aoe or targeted * * generic_message - checks if it should display default message. */ -/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE) +/obj/item/assembly/flash/proc/flash_mob(mob/living/flashed, mob/user, confusion_duration = 15 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null) if(!istype(flashed)) - return + return FALSE if(user) - log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src) + log_combat(user, flashed, "[targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", src) else //caused by emp/remote signal - flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]", LOG_ATTACK) + flashed.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"] [extra_log]", LOG_ATTACK) if(generic_message && flashed != user) to_chat(flashed, span_danger("[src] emits a blinding light!")) @@ -150,9 +150,9 @@ var/deviation = calculate_deviation(flashed, user || src) if(user) - var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_CARBON, flashed, src, deviation) + var/sigreturn = SEND_SIGNAL(user, COMSIG_MOB_PRE_FLASHED_MOB, flashed, src, deviation) if(sigreturn & STOP_FLASH) - return + return FALSE if(sigreturn & DEVIATION_OVERRIDE_FULL) deviation = DEVIATION_FULL @@ -163,28 +163,50 @@ //If you face away from someone they shouldn't notice any effects. if(deviation == DEVIATION_FULL) - return + return FALSE - if(targeted) - var/flash_result = flashed.flash_act(1, 1) - if(flash_result == FLASH_COMPLETED) - return //Behavior was overwritten, so we just skip the flashy stunny part and go with the override behavior instead + var/flash_result = flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE) + if(!flash_result) + if(targeted) + if(user) + visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!")) + else + to_chat(flashed, span_danger("[src] fails to blind you!")) + return FALSE - if(flash_result) - flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) - visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) + flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) + + if(!targeted) + return TRUE + + if(flash_result != FLASH_COMPLETED) //If the behavior was overwritten, we just skip the flashy stunny part and go with the override behavior instead + if(issilicon(flashed)) + if(flashed.is_blind()) + var/flash_duration = rand(8,12) SECONDS + flashed.Paralyze(flash_duration) + flashed.set_temp_blindness_if_lower(flash_duration) + if(user) + user.visible_message(span_warning("[user] overloads [flashed]'s sensors and computing with the flash!"), span_danger("You overload [flashed]'s sensors and computing with the flash!")) + else + to_chat(flashed, "[src] overloads your sensors and computing!") + else + flashed.set_temp_blindness_if_lower( (rand(5,15) SECONDS)) + if(user) + user.visible_message(span_warning("[user] blinds [flashed] with the flash!"), span_danger("You blind [flashed] with the flash!")) + else + to_chat(flashed, "you're blinded by [src]!") + else //easy way to make sure that you can only long stun someone who is facing in your direction flashed.adjustStaminaLoss(rand(80, 120) * (1 - (deviation * 0.5))) flashed.Knockdown(rand(25, 50) * (1 - (deviation * 0.5))) - SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_CARBON, flashed, src, deviation) + if(user) + visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) + else + to_chat(flashed, "you're blinded by [src]!") - else if(user) - visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!")) - else - to_chat(flashed, span_danger("[src] fails to blind you!")) - else - if(flashed.flash_act()) - flashed.set_confusion_if_lower(confusion_duration * CONFUSION_STACK_MAX_MULTIPLIER) + if(user) + SEND_SIGNAL(user, COMSIG_MOB_SUCCESSFUL_FLASHED_MOB, flashed, src, deviation) + return TRUE /** * Handles the directionality of the attack @@ -201,18 +223,24 @@ if(HAS_TRAIT(victim, TRAIT_SPINNING)) return DEVIATION_NONE + // I don't want to mess with cyborgs' deep-rooted weakness to flashes + if(issilicon(victim)) + return DEVIATION_NONE + if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim if(carbon_victim.get_eye_protection() < FLASH_PROTECTION_SENSITIVE) // If we have really bad flash sensitivity, usually due to really sensitive eyes, we get flashed from all directions return DEVIATION_NONE + var/turf/attacker_turf = get_turf(attacker) + // Are they on the same tile? We'll return partial deviation. This may be someone flashing while lying down // or flashing someone they're stood on the same turf as, or a borg flashing someone buckled to them. - if(victim.loc == attacker.loc) + if(victim.loc == attacker_turf) return DEVIATION_PARTIAL // If the victim was looking at the attacker, this is the direction they'd have to be facing. - var/victim_to_attacker = get_dir(victim, attacker) + var/victim_to_attacker = get_dir(victim, attacker_turf) // The victim's dir is necessarily a cardinal value. var/victim_dir = victim.dir @@ -241,29 +269,15 @@ return FALSE . = TRUE - if(iscarbon(M)) - flash_carbon(M, user, confusion_duration = 5 SECONDS, targeted = TRUE) - return - if(issilicon(M)) - var/mob/living/silicon/robot/flashed_borgo = M - log_combat(user, flashed_borgo, "flashed", src) - update_icon(ALL, TRUE) - if(flashed_borgo.flash_act(affect_silicon = TRUE)) - if(flashed_borgo.is_blind()) - var/flash_duration = rand(8,12) SECONDS - flashed_borgo.Paralyze(flash_duration) - flashed_borgo.set_temp_blindness_if_lower(flash_duration) - user.visible_message(span_warning("[user] overloads [flashed_borgo]'s sensors and computing with the flash!"), span_danger("You overload [flashed_borgo]'s sensors and computing with the flash!")) - else - user.visible_message(span_warning("[user] blinds [flashed_borgo] with the flash!"), span_danger("You blind [flashed_borgo] with the flash!")) - flashed_borgo.set_temp_blindness_if_lower( (rand(5,15) SECONDS)) - flashed_borgo.set_confusion_if_lower(5 SECONDS * CONFUSION_STACK_MAX_MULTIPLIER) - else - user.visible_message(span_warning("[user] fails to blind [flashed_borgo] with the flash!"), span_warning("You fail to blind [flashed_borgo] with the flash!")) + if(!issilicon(M)) + flash_mob(M, user, confusion_duration = 5 SECONDS, targeted = TRUE) return + flash_silicon(M, user) user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to blind [M] with the flash!")) +/obj/item/assembly/flash/proc/flash_silicon(mob/living/silicon/silicon) + /obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) if(holder) return FALSE @@ -354,42 +368,43 @@ /obj/item/assembly/flash/hypnotic/burn_out() return -/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, confusion_duration = 15, targeted = TRUE, generic_message = FALSE) - if(!istype(M)) - return +/obj/item/assembly/flash/hypnotic/flash_mob(mob/living/flashed, mob/user, confusion_duration = 5 SECONDS, targeted = TRUE, generic_message = FALSE, extra_log = null) if(user) - log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src) + log_combat(user, flashed, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", src) else //caused by emp/remote signal - M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", LOG_ATTACK) - if(generic_message && M != user) - to_chat(M, span_notice("[src] emits a soothing light...")) - if(targeted) - if(M.flash_act(1, 1)) - var/hypnosis = FALSE - if(M.hypnosis_vulnerable()) - hypnosis = TRUE + flashed.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"] [extra_log]", LOG_ATTACK) + + if(generic_message && flashed != user) + to_chat(flashed, span_notice("[src] emits a soothing light...")) + + if(!flashed.flash_act(1, override_blindness_check = targeted, affect_silicon = TRUE)) + if(targeted) if(user) - user.visible_message(span_danger("[user] blinds [M] with the flash!"), span_danger("You hypno-flash [M]!")) - - if(!hypnosis) - to_chat(M, span_hypnophrase("The light makes you feel oddly relaxed...")) - M.adjust_confusion_up_to(10 SECONDS, 20 SECONDS) - M.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) - M.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) - M.adjust_pacifism(10 SECONDS) + user.visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_warning("You fail to hypno-flash [flashed]!")) else - M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + to_chat(flashed, span_danger("[src] fails to blind you!")) + return FALSE - else if(user) - user.visible_message(span_warning("[user] fails to blind [M] with the flash!"), span_warning("You fail to hypno-flash [M]!")) - else - to_chat(M, span_danger("[src] fails to blind you!")) + if(!targeted) + to_chat(flashed, span_notice("Such a pretty light...")) + flashed.adjust_confusion_up_to(confusion_duration, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER) + flashed.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS) + flashed.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS) + flashed.adjust_pacifism(4 SECONDS) + return TRUE - else if(M.flash_act()) - to_chat(M, span_notice("Such a pretty light...")) - M.adjust_confusion_up_to(4 SECONDS, 20 SECONDS) - M.adjust_dizzy_up_to(8 SECONDS, 40 SECONDS) - M.adjust_drowsiness_up_to(8 SECONDS, 40 SECONDS) - M.adjust_pacifism(4 SECONDS) + if(user) + user.visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_danger("You hypno-flash [flashed]!")) + else + to_chat(flashed, "You're blinded by [src]!") + + if(!flashed.hypnosis_vulnerable()) + to_chat(flashed, span_hypnophrase("The light makes you feel oddly relaxed...")) + flashed.adjust_confusion_up_to(confusion_duration * 2, confusion_duration * 2 * CONFUSION_STACK_MAX_MULTIPLIER) + flashed.adjust_dizzy_up_to(20 SECONDS, 40 SECONDS) + flashed.adjust_drowsiness_up_to(20 SECONDS, 40 SECONDS) + flashed.adjust_pacifism(10 SECONDS) + else + flashed.apply_status_effect(/datum/status_effect/trance, 200, TRUE) #undef CONFUSION_STACK_MAX_MULTIPLIER diff --git a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm index 1942b78cc9a..3a3d505bc19 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/airlock_pump.dm @@ -24,7 +24,8 @@ icon = 'icons/obj/machines/atmospherics/unary_devices.dmi' icon_state = "airlock_pump" pipe_state = "airlock_pump" - use_power = ACTIVE_POWER_USE + use_power = IDLE_POWER_USE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION can_unwrench = TRUE welded = FALSE @@ -122,7 +123,10 @@ . = ..() if(mapload) can_unwrench = FALSE - + var/datum/gas_mixture/distro_air = airs[1] + var/datum/gas_mixture/waste_air = airs[2] + distro_air.volume = 1000 + waste_air.volume = 1000 /obj/machinery/atmospherics/components/unary/airlock_pump/post_machine_initialize() . = ..() @@ -153,14 +157,6 @@ tile_air_pressure = max(0, local_turf.return_air().return_pressure()) on_dock_request(tile_air_pressure) -/obj/machinery/atmospherics/components/unary/airlock_pump/Initialize(mapload) - . = ..() - var/datum/gas_mixture/distro_air = airs[1] - var/datum/gas_mixture/waste_air = airs[2] - distro_air.volume = 1000 - waste_air.volume = 1000 - - /obj/machinery/atmospherics/components/unary/airlock_pump/on_deconstruction(disassembled) . = ..() if(cycling_set_up) @@ -176,6 +172,12 @@ to_chat(user, span_warning("You cannot unwrench [src], wait for the cycle completion!")) return FALSE +/obj/machinery/atmospherics/components/unary/airlock_pump/set_on(active) + . = ..() + if(active) + update_use_power(ACTIVE_POWER_USE) + else + update_use_power(IDLE_POWER_USE) /obj/machinery/atmospherics/components/unary/airlock_pump/process_atmos() if(!on) @@ -336,7 +338,6 @@ return TRUE - ///Complete/Abort cycle with the passed message /obj/machinery/atmospherics/components/unary/airlock_pump/proc/stop_cycle(message = null, unbolt_only = FALSE) if(!on) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index c8bfd8628e9..4f1f4a2aa64 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -17,7 +17,6 @@ ..() update_appearance() - /obj/machinery/atmospherics/components/unary/click_alt(mob/living/beno) beno.handle_ventcrawl(src) return CLICK_ACTION_SUCCESS diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 362e2d1c9e7..f61ebf3766b 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -12,6 +12,9 @@ icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 1.25 + initialize_directions = NONE var/spawn_id = null var/spawn_temp = T20C /// Moles of gas to spawn per second @@ -26,9 +29,6 @@ var/power_draw_dynamic_kpa_coeff = 0.5 var/broken = FALSE var/broken_message = "ERROR" - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - initialize_directions = NONE /obj/machinery/atmospherics/miner/Initialize(mapload) . = ..() diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index 0e742c63347..14ab028fc48 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -148,13 +148,16 @@ var/click_on_hoop = TRUE var/mob/living/thrower = throwingdatum?.get_thrower() + if(!istype(thrower)) + return + // aim penalty for not clicking directly on the hoop when shooting if(!istype(backboard) || backboard != src) click_on_hoop = FALSE score_chance *= 0.5 // aim penalty for spinning while shooting - if(istype(thrower) && HAS_TRAIT(thrower, TRAIT_SPINNING)) + if(HAS_TRAIT(thrower, TRAIT_SPINNING)) score_chance *= 0.5 if(prob(score_chance)) diff --git a/code/modules/bitrunning/virtual_domain/domains/wendigo.dm b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm index 6db7c3337b6..469234f0819 100644 --- a/code/modules/bitrunning/virtual_domain/domains/wendigo.dm +++ b/code/modules/bitrunning/virtual_domain/domains/wendigo.dm @@ -8,10 +8,10 @@ map_name = "wendigo" reward_points = BITRUNNER_REWARD_HIGH -/obj/effect/mob_spawn/corpse/human/bitrunner/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/bitrunner/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) -/obj/effect/mob_spawn/corpse/human/cyber_police/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/cyber_police/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm index fa0339cde9c..96085ca5c01 100644 --- a/code/modules/cards/cardhand.dm +++ b/code/modules/cards/cardhand.dm @@ -80,6 +80,7 @@ /obj/item/toy/cards/cardhand/item_interaction(mob/living/user, obj/item/tool, list/modifiers) var/obj/item/toy/singlecard/card + var/interacting_with_deck = FALSE if(istype(tool, /obj/item/toy/singlecard)) card = tool @@ -93,7 +94,8 @@ to_chat(user, span_warning("\The [dealer_deck] is stacked too high!")) return ITEM_INTERACT_BLOCKING - card = dealer_deck.draw(user) + card = dealer_deck.get_top_card(user) + interacting_with_deck = TRUE if(!card) return NONE @@ -101,6 +103,9 @@ if(insert(card)) if(LAZYACCESS(modifiers, RIGHT_CLICK)) card.Flip() + if(interacting_with_deck) + var/obj/item/toy/cards/deck/dealer_deck = tool + dealer_deck.draw(user) return ITEM_INTERACT_SUCCESS to_chat(user, span_warning("You can't hold any more cards in your hand!")) diff --git a/code/modules/cards/cards.dm b/code/modules/cards/cards.dm index fbfa2a39658..046c3e47906 100644 --- a/code/modules/cards/cards.dm +++ b/code/modules/cards/cards.dm @@ -30,7 +30,7 @@ return . var/mob/thrower = throwingdatum?.get_thrower() - if(!thrower) // if a mob didn't throw it (need two people to play 52 pickup) + if(!istype(thrower)) // if a mob didn't throw it (need two people to play 52 pickup) return if(count_cards() == 0) @@ -113,15 +113,16 @@ /** * Draws a card from the deck or hand of cards. * - * Draws the top card unless a card arg is supplied then it picks that specific card - * and returns it (the card arg is used by the radial menu for cardhands to select - * specific cards out of the cardhand) + * Draws the top card, removing it from the associated card atoms list, + * unless a card arg is supplied; then it picks that specific card, removes it from the + * associated card atoms list, and returns it (the card arg is used by the radial menu for cardhands to select + * specific cards out of the cardhand). * Arguments: * * mob/living/user - The user drawing the card. * * obj/item/toy/singlecard/card (optional) - The card drawn from the hand **/ /obj/item/toy/cards/proc/draw(mob/living/user, obj/item/toy/singlecard/card) - if(!isliving(user) || !user.can_perform_action(src, NEED_DEXTERITY| FORBID_TELEKINESIS_REACH)) + if(!isliving(user) || !user.can_perform_action(src, NEED_DEXTERITY | FORBID_TELEKINESIS_REACH)) return if(count_cards() == 0) diff --git a/code/modules/cards/deck/blank.dm b/code/modules/cards/deck/blank.dm index 841e338fbdb..49792446c6f 100644 --- a/code/modules/cards/deck/blank.dm +++ b/code/modules/cards/deck/blank.dm @@ -5,7 +5,6 @@ icon_state = "deck_white_full" deckstyle = "white" has_unique_card_icons = FALSE - is_standard_deck = FALSE decksize = 25 can_play_52_card_pickup = FALSE @@ -13,9 +12,7 @@ icon_state = "deck_black_full" deckstyle = "black" -/obj/item/toy/cards/deck/blank/Initialize(mapload) - . = ..() - +/obj/item/toy/cards/deck/blank/initialize_cards() for(var/_ in 1 to decksize) initial_cards += /datum/deck_card/blank diff --git a/code/modules/cards/deck/cas.dm b/code/modules/cards/deck/cas.dm index fc713574c89..bab01179c6a 100644 --- a/code/modules/cards/deck/cas.dm +++ b/code/modules/cards/deck/cas.dm @@ -10,7 +10,6 @@ icon_state = "deck_white_full" deckstyle = "white" has_unique_card_icons = FALSE - is_standard_deck = FALSE decksize = 150 can_play_52_card_pickup = FALSE @@ -26,8 +25,7 @@ GLOBAL_LIST_INIT(card_decks, list( white = world.file2list("strings/cas_white.txt") )) -/obj/item/toy/cards/deck/cas/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/cas/initialize_cards() var/list/cards_against_space = GLOB.card_decks[deckstyle] var/list/possible_cards = cards_against_space.Copy() diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm index 61d25ca9288..aa6bc6beec1 100644 --- a/code/modules/cards/deck/deck.dm +++ b/code/modules/cards/deck/deck.dm @@ -16,8 +16,6 @@ var/shuffle_time = DECK_SHUFFLE_TIME /// Deck shuffling cooldown. COOLDOWN_DECLARE(shuffle_cooldown) - /// If the deck is the standard 52 playing card deck (used for poker and blackjack) - var/is_standard_deck = TRUE /// The amount of cards to spawn in the deck (optional) var/decksize = 54 /// The description of the cardgame that is played with this deck (used for memories) @@ -26,21 +24,25 @@ var/obj/machinery/computer/holodeck/holodeck /// If the cards in the deck have different card faces icons (blank and CAS decks do not) var/has_unique_card_icons = TRUE + /// The base sprite for the deck. + var/deck_base_icon = "deck_" /// The art style of deck used (determines both deck and card icons used) var/deckstyle = "nanotrasen" /obj/item/toy/cards/deck/Initialize(mapload) . = ..() - // Can't hold more cards than we spawn with - card_limit = decksize AddElement(/datum/element/drag_pickup) AddComponent(/datum/component/two_handed, attacksound='sound/items/cards/cardflip.ogg') register_context() - if(!is_standard_deck) - return + initialize_cards() - // generate a normal playing card deck + if(length(initial_cards)) + card_limit = length(initial_cards) + +/// Generates the cards in this deck. If not overridden, generates a standard 52-card deck (and 2 jokers). +/obj/item/toy/cards/deck/proc/initialize_cards() + SHOULD_CALL_PARENT(FALSE) // you should be overriding this for subtypes, probably initial_cards += "Joker Clown" initial_cards += "Joker Mime" for(var/suit in list("Hearts", "Spades", "Clubs", "Diamonds")) @@ -109,6 +111,16 @@ user.balloon_alert_to_viewers("shuffles the deck") addtimer(CALLBACK(src, PROC_REF(CardgameEvent), user), 60 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) +/** + * Grabs the top card in the deck, but does not actually manipulate the deck. + */ +/obj/item/toy/cards/deck/proc/get_top_card(mob/living/user) + if(count_cards() == 0) + to_chat(user, span_warning("There are no more cards to draw!")) + return + var/list/cards = fetch_card_atoms() + return cards[1] + /// This checks if nearby mobs are playing a cardgame and triggers a mood and memory /obj/item/toy/cards/deck/proc/CardgameEvent(mob/living/dealer) var/card_players = list() @@ -159,13 +171,13 @@ /obj/item/toy/cards/deck/update_icon_state() switch(count_cards()) if(27 to INFINITY) - icon_state = "deck_[deckstyle]_full" + icon_state = "[deck_base_icon][deckstyle]_full" if(11 to 27) - icon_state = "deck_[deckstyle]_half" + icon_state = "[deck_base_icon][deckstyle]_half" if(1 to 11) - icon_state = "deck_[deckstyle]_low" + icon_state = "[deck_base_icon][deckstyle]_low" else - icon_state = "deck_[deckstyle]_empty" + icon_state = "[deck_base_icon][deckstyle]_empty" return ..() /obj/item/toy/cards/deck/insert(obj/item/toy/card_item) @@ -196,7 +208,7 @@ return . var/mob/living/thrower = throwingdatum?.get_thrower() - if(!thrower) // if a mob didn't throw it (need two people to play 52 pickup) + if(!istype(thrower)) // if a mob didn't throw it (need two people to play 52 pickup) return target.visible_message(span_warning("[target] is forced to play 52 card pickup!"), span_warning("You are forced to play 52 card pickup.")) @@ -221,5 +233,19 @@ resistance_flags = NONE shuffle_time = DECK_SYNDIE_SHUFFLE_TIME +/// A card shoe. For holding a lot of cards, but not for committing card-based psychological warfare (crashing people by throwing 100+ cards at them). +/obj/item/toy/cards/deck/cardshoe + name = "card shoe" + desc = "A clear plastic card dispenser for holding a large amount of cards. For better or for worse, \ + the dispenser is designed to prevent a haphazard scattering of cards if thrown." + icon_state = "deckshoe_empty" // woe, codersprites upon thee + card_limit = 432 // 8 decks of 54 cards. if... you somehow need to do that much card gaming. + can_play_52_card_pickup = FALSE + deck_base_icon = "deckshoe" + deckstyle = "" // no deck style because it wouldn't matter + +/obj/item/toy/cards/deck/cardshoe/initialize_cards() + return + #undef DECK_SHUFFLE_TIME #undef DECK_SYNDIE_SHUFFLE_TIME diff --git a/code/modules/cards/deck/kotahi.dm b/code/modules/cards/deck/kotahi.dm index c4c625445a7..0e0307c400f 100644 --- a/code/modules/cards/deck/kotahi.dm +++ b/code/modules/cards/deck/kotahi.dm @@ -4,10 +4,8 @@ cardgame_desc = "KOTAHI game" icon_state = "deck_kotahi_full" deckstyle = "kotahi" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/kotahi/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/kotahi/initialize_cards() for(var/colour in list("Red","Yellow","Green","Blue")) initial_cards += "[colour] 0" //kotahi decks have only one colour of each 0, weird huh? for(var/k in 0 to 1) //two of each colour of number diff --git a/code/modules/cards/deck/tarot.dm b/code/modules/cards/deck/tarot.dm index e68a8fe4ded..5fa7f25e61e 100644 --- a/code/modules/cards/deck/tarot.dm +++ b/code/modules/cards/deck/tarot.dm @@ -7,10 +7,8 @@ cardgame_desc = "tarot card reading" icon_state = "deck_tarot_full" deckstyle = "tarot" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/tarot/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/tarot/initialize_cards() for(var/suit in list("Hearts", "Pikes", "Clovers", "Tiles")) for(var/i in 1 to 10) initial_cards += "[i] of [suit]" diff --git a/code/modules/cards/deck/wizoff.dm b/code/modules/cards/deck/wizoff.dm index 21eb37d96c6..d7e67825c4a 100644 --- a/code/modules/cards/deck/wizoff.dm +++ b/code/modules/cards/deck/wizoff.dm @@ -5,10 +5,8 @@ cardgame_desc = "Wiz-Off game" icon_state = "deck_wizoff_full" deckstyle = "wizoff" - is_standard_deck = FALSE -/obj/item/toy/cards/deck/wizoff/Initialize(mapload) - . = ..() +/obj/item/toy/cards/deck/wizoff/initialize_cards() var/card_list = strings("wizoff.json", "wizard") initial_cards += new /datum/deck_card/of_type(/obj/item/toy/singlecard/wizoff_ruleset) // ruleset should be the top card for(var/card in card_list) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index c3106c426b2..d1323786f25 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -38,6 +38,7 @@ /obj/item/organ/ears/cybernetic/upgraded = TRUE, /obj/item/organ/ears/cybernetic/whisper = TRUE, /obj/item/organ/ears/cybernetic/xray = TRUE, + /obj/item/organ/ears/cybernetic/volume = TRUE, ) /datum/bounty/item/medical/liver diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 275248fed67..0638efd406d 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -99,7 +99,7 @@ var/cost = pack.get_cost() if(applied_coupon) //apply discount price cost *= (1 - applied_coupon.discount_pct_off) - if(paying_account && !pack.goody) //privately purchased and not a goody means 1.1x the cost + if(paying_account?.add_to_accounts && !pack.goody) //privately purchased and not a goody means 1.1x the cost cost *= 1.1 return round(cost) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 762fa1dcfa5..6c6e9b5b6a3 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -7,7 +7,7 @@ ///Can the supply console send the shuttle back and forth? Used in the UI backend. var/can_send = TRUE - ///Can this console only send requests? + ///Can this console only send requests? Typically used at the cargo front desk for pedestrians. var/requestonly = FALSE ///Can you approve requests placed for cargo? Works differently between the app and the computer. var/can_approve_requests = TRUE @@ -103,11 +103,9 @@ message = blockade_warning data["message"] = message - var/list/amount_by_name = list() var/cart_list = list() for(var/datum/supply_order/order in SSshuttle.shopping_list) if(cart_list[order.pack.name]) - amount_by_name[order.pack.name] += 1 cart_list[order.pack.name][1]["amount"]++ cart_list[order.pack.name][1]["cost"] += order.get_final_cost() if(order.department_destination) @@ -116,7 +114,6 @@ cart_list[order.pack.name][1]["paid"]++ continue - amount_by_name[order.pack.name] += 1 cart_list[order.pack.name] = list(list( "cost_type" = order.cost_type, "object" = order.pack.name, @@ -124,8 +121,8 @@ "id" = order.id, "amount" = 1, "orderer" = order.orderer, - "paid" = !isnull(order.paying_account) ? 1 : 0, //number of orders purchased privatly - "dep_order" = order.department_destination ? 1 : 0, //number of orders purchased by a department + "paid" = !!order.paying_account?.add_to_accounts, //number of orders purchased privatly + "dep_order" = !!order.department_destination, //number of orders purchased by a department "can_be_cancelled" = order.can_be_cancelled, )) data["cart"] = list() @@ -136,15 +133,14 @@ data["requests"] = list() for(var/datum/supply_order/order in SSshuttle.request_list) var/datum/supply_pack/pack = order.pack - amount_by_name[pack.name] += 1 data["requests"] += list(list( "object" = pack.name, "cost" = pack.get_cost(), "orderer" = order.orderer, "reason" = order.reason, "id" = order.id, + "account" = order.paying_account ? order.paying_account.account_holder : "Cargo Department" )) - data["amount_by_name"] = amount_by_name return data @@ -238,33 +234,45 @@ rank = "Silicon" var/datum/bank_account/account - if(self_paid && isliving(user)) + if(isliving(user)) var/mob/living/living_user = user var/obj/item/card/id/id_card = living_user.get_idcard(TRUE) - if(!istype(id_card)) - say("No ID card detected.") - return - if(IS_DEPARTMENTAL_CARD(id_card)) - say("The [src] rejects [id_card].") - return - account = id_card.registered_account - if(!istype(account)) - say("Invalid bank account.") - return - var/list/access = id_card.GetAccess() - if(pack.access_view && !(pack.access_view in access)) - say("[id_card] lacks the requisite access for this purchase.") - return + account = id_card?.registered_account // We can still assign an account for request department purposes. + if(self_paid) + if(!istype(id_card)) + say("No ID card detected.") + return + if(IS_DEPARTMENTAL_CARD(id_card)) + say("The [src] rejects [id_card].") + return + if(!istype(account)) + say("Invalid bank account.") + return + var/list/access = id_card.GetAccess() + if(pack.access_view && !(pack.access_view in access)) + say("[id_card] lacks the requisite access for this purchase.") + return // The list we are operating on right now var/list/working_list = SSshuttle.shopping_list var/reason = "" - if(requestonly && !self_paid) + var/datum/bank_account/personal_department + if(requestonly && !self_paid && !pack.goody) working_list = SSshuttle.request_list reason = tgui_input_text(user, "Reason", name, max_length = MAX_MESSAGE_LEN) if(isnull(reason)) return + name = account?.account_holder + if(account?.account_job) + personal_department = SSeconomy.get_dep_account(account.account_job.paycheck_department) + if(!(personal_department.account_holder == "Cargo Budget")) + var/dept_choice = tgui_alert(user, "Which department are you requesting this for?", "Choose department to request from", list("Cargo Budget", "[personal_department.account_holder]")) + if(!dept_choice) + return + if(dept_choice == "Cargo Budget") + personal_department = SSeconomy.get_dep_account(cargo_account) + if(pack.goody && !self_paid) playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) say("ERROR: Small crates may only be purchased by private accounts.") @@ -276,6 +284,9 @@ say("ERROR: No more then [CARGO_MAX_ORDER] of any pack may be ordered at once") return + if(!self_paid) + account = personal_department + amount = clamp(amount, 1, CARGO_MAX_ORDER - similar_count) for(var/count in 1 to amount) var/obj/item/coupon/applied_coupon @@ -294,6 +305,7 @@ reason = reason, paying_account = account, coupon = applied_coupon, + department_destination = reason ? TRUE : FALSE, // Hijacking reason as a way to determine if an order's requested from at least one budget charge_on_purchase = TRUE, // SKYRAT EDIT ADDITION ) working_list += order diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 379d337f67b..3638a539686 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -190,7 +190,7 @@ if(prob(50)) the_toy = pick_weight_recursive(GLOB.arcade_prize_pool) //BUBBERSTATION CHANGE: USES PICK_WEIGHT_RECURSIVE else - the_toy = pick(subtypesof(/obj/item/toy/plush)) + the_toy = /obj/effect/spawner/random/entertainment/plushie_delux new the_toy(C) /datum/supply_pack/costumes_toys/wizard diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 56d9a1427aa..61a962e88cb 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -121,7 +121,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// If the selected species has this in its /datum/species/var/external_organs, /// will show the feature as selectable. - var/relevant_external_organ = null + var/relevant_organ = null /// If the selected species has this head_flag by default, /// will show the feature as selectable. @@ -333,7 +333,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// Checks if this preference is relevant and thus visible to the passed preferences object. /datum/preference/proc/has_relevant_feature(datum/preferences/preferences) - if(isnull(relevant_inherent_trait) && isnull(relevant_external_organ) && isnull(relevant_head_flag) && isnull(relevant_body_markings && isnull(relevant_mutant_bodypart))) // BUBBER EDIT ADDITION + if(isnull(relevant_inherent_trait) && isnull(relevant_organ) && isnull(relevant_head_flag) && isnull(relevant_body_markings && isnull(relevant_mutant_bodypart))) // BUBBER EDIT ADDITION return TRUE return current_species_has_savekey(preferences) diff --git a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm index ba4b4d03e90..2d852c96a02 100644 --- a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm +++ b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm @@ -33,7 +33,6 @@ // Before tgui preferences menu, "traitor" would handle both roundstart, midround, and latejoin. // These were split apart. /datum/preferences/proc/migrate_antagonists() - migrate_antagonist(ROLE_HERETIC, list(ROLE_HERETIC_SMUGGLER)) migrate_antagonist(ROLE_MALF, list(ROLE_MALF_MIDROUND)) migrate_antagonist(ROLE_OPERATIVE, list(ROLE_OPERATIVE_MIDROUND, ROLE_LONE_OPERATIVE)) migrate_antagonist(ROLE_REV_HEAD, list(ROLE_PROVOCATEUR)) diff --git a/code/modules/client/preferences/species_features/felinid.dm b/code/modules/client/preferences/species_features/felinid.dm index cfc6cd86f03..aa7d92720ef 100644 --- a/code/modules/client/preferences/species_features/felinid.dm +++ b/code/modules/client/preferences/species_features/felinid.dm @@ -4,13 +4,13 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/tail/cat + relevant_organ = /obj/item/organ/tail/cat /datum/preference/choiced/tail_felinid/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_felinid) /datum/preference/choiced/tail_felinid/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features[FEATURE_TAIL] = value + target.dna.features[FEATURE_TAIL_CAT] = value /datum/preference/choiced/tail_felinid/create_default_value() var/datum/sprite_accessory/tails/felinid/cat/tail = /datum/sprite_accessory/tails/felinid/cat @@ -21,7 +21,7 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES can_randomize = FALSE - relevant_external_organ = /obj/item/organ/ears/cat + relevant_organ = /obj/item/organ/ears/cat /datum/preference/choiced/felinid_ears/init_possible_values() return assoc_to_keys_features(SSaccessories.ears_list) diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index d379328074c..253ce97841a 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -64,7 +64,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Frills" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/frills + relevant_organ = /obj/item/organ/frills /datum/preference/choiced/lizard_frills/init_possible_values() return assoc_to_keys_features(SSaccessories.frills_list) @@ -81,7 +81,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Horns" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/horns + relevant_organ = /obj/item/organ/horns /datum/preference/choiced/lizard_horns/init_possible_values() return assoc_to_keys_features(SSaccessories.horns_list) @@ -137,7 +137,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Snout" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/snout + relevant_organ = /obj/item/organ/snout /datum/preference/choiced/lizard_snout/init_possible_values() return assoc_to_keys_features(SSaccessories.snouts_list) @@ -152,7 +152,7 @@ savefile_key = "feature_lizard_spines" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/spines + relevant_organ = /obj/item/organ/spines /datum/preference/choiced/lizard_spines/init_possible_values() return assoc_to_keys_features(SSaccessories.spines_list) @@ -164,7 +164,7 @@ savefile_key = "feature_lizard_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/tail/lizard + relevant_organ = /obj/item/organ/tail/lizard /datum/preference/choiced/lizard_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_lizard) diff --git a/code/modules/client/preferences/species_features/monkey.dm b/code/modules/client/preferences/species_features/monkey.dm index 2cdf998f849..7259d8b20b8 100644 --- a/code/modules/client/preferences/species_features/monkey.dm +++ b/code/modules/client/preferences/species_features/monkey.dm @@ -3,7 +3,7 @@ savefile_key = "feature_monkey_tail" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/tail/monkey + relevant_organ = /obj/item/organ/tail/monkey can_randomize = FALSE /datum/preference/choiced/monkey_tail/init_possible_values() diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm index fac5d42e6c0..d8729fa978d 100644 --- a/code/modules/client/preferences/species_features/moth.dm +++ b/code/modules/client/preferences/species_features/moth.dm @@ -5,7 +5,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Antennae" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/antennae + relevant_organ = /obj/item/organ/antennae /datum/preference/choiced/moth_antennae/init_possible_values() return assoc_to_keys_features(SSaccessories.moth_antennae_list) @@ -86,7 +86,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Moth wings" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/wings/moth + relevant_organ = /obj/item/organ/wings/moth /datum/preference/choiced/moth_wings/init_possible_values() return assoc_to_keys_features(SSaccessories.moth_wings_list) diff --git a/code/modules/client/preferences/species_features/mushperson.dm b/code/modules/client/preferences/species_features/mushperson.dm index 5eed4d3b4ef..bd001f40b78 100644 --- a/code/modules/client/preferences/species_features/mushperson.dm +++ b/code/modules/client/preferences/species_features/mushperson.dm @@ -3,7 +3,7 @@ savefile_key = "feature_mushperson_cap" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_external_organ = /obj/item/organ/mushroom_cap + relevant_organ = /obj/item/organ/mushroom_cap /datum/preference/choiced/mushroom_cap/init_possible_values() return assoc_to_keys_features(SSaccessories.caps_list) diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index 866dc64c539..085de3a1e20 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -6,7 +6,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Hairstyle" should_generate_icons = TRUE - relevant_external_organ = /obj/item/organ/pod_hair + relevant_organ = /obj/item/organ/pod_hair /datum/preference/choiced/pod_hair/init_possible_values() return assoc_to_keys_features(SSaccessories.pod_hair_list) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 198cb6b27a9..7cccab27ea2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -72,17 +72,6 @@ if(!icon_state) item_flags |= ABSTRACT -/obj/item/clothing/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - var/mob/M = user - - if(ismecha(M.loc)) // stops inventory actions in a mech - return - - if(loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) - add_fingerprint(user) - /obj/item/food/clothing name = "temporary moth clothing snack item" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object. <--- stinky idiot wrote this" diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 4d7951a62f6..84173608562 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -6,6 +6,7 @@ #define MODE_SHUTTLE "shuttle" #define MODE_PIPE_CONNECTABLE "connectable" #define MODE_ATMOS_THERMAL "atmospheric-thermal" +#define MODE_AREA_BLUEPRINTS "area-blueprints" #define TEMP_SHADE_CYAN 273.15 #define TEMP_SHADE_GREEN 283.15 #define TEMP_SHADE_YELLOW 300 @@ -19,13 +20,17 @@ actions_types = list(/datum/action/item_action/toggle_mode) glass_colour_type = /datum/client_colour/glass_colour/gray gender = PLURAL - vision_flags = NONE color_cutoffs = null - - var/list/modes = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_NONE) + /// List of selectable modes that can be used by the goggles + var/list/modes = list(MODE_NONE, MODE_MESON, MODE_TRAY) + /// The current mode string that is selected from the modes list (used for icons) var/mode = MODE_NONE + /// The current mode index that is selected from the modes list + var/mode_index = 1 + /// The distance for how far we can see special objects (only used for pipes and wires) var/range = 1 + /// A cache of tracked pipes used in MODE_PIPE_CONNECTABLE var/list/connection_images = list() /obj/item/clothing/glasses/meson/engine/Initialize(mapload) @@ -39,7 +44,8 @@ return ..() /obj/item/clothing/glasses/meson/engine/proc/toggle_mode(mob/user, voluntary) - mode = modes[mode] + mode_index = WRAP_UP(mode_index, modes.len) + mode = modes[mode_index] to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [mode ? "to [mode] mode":"off"][voluntary ? ".":"!"]") if(connection_images.len) connection_images.Cut() @@ -60,6 +66,9 @@ if(MODE_SHUTTLE) change_glass_color(/datum/client_colour/glass_colour/red) + if(MODE_AREA_BLUEPRINTS) + change_glass_color(/datum/client_colour/glass_colour/lightyellow) + if(MODE_NONE) change_glass_color(initial(glass_colour_type)) @@ -89,6 +98,8 @@ show_connections() if(MODE_ATMOS_THERMAL) atmos_thermal(user) + if(MODE_AREA_BLUEPRINTS) + show_blueprints(user) /obj/item/clothing/glasses/meson/engine/proc/show_shuttle() var/mob/living/carbon/human/user = loc @@ -142,9 +153,7 @@ inhand_icon_state = "trayson-t-ray" desc = "Used by engineering staff to see underfloor objects such as cables and pipes." range = 2 - - - modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_PIPE_CONNECTABLE, MODE_PIPE_CONNECTABLE = MODE_ATMOS_THERMAL, MODE_ATMOS_THERMAL = MODE_NONE) // atmos techs now finally have 3 modes on their goggles! + modes = list(MODE_NONE, MODE_TRAY, MODE_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL) // atmos techs now finally have 3 modes on their goggles! /obj/item/clothing/glasses/meson/engine/tray/dropped(mob/user) . = ..() @@ -156,8 +165,7 @@ icon_state = "trayson-shuttle" inhand_icon_state = "trayson-shuttle" desc = "Used to see the boundaries of shuttle regions." - - modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE) + modes = list(MODE_NONE, MODE_SHUTTLE) /obj/item/clothing/glasses/meson/engine/atmos_imaging @@ -166,14 +174,29 @@ icon_state = "trayson-atmospheric-thermal" inhand_icon_state = "trayson-meson" glass_colour_type = /datum/client_colour/glass_colour/gray - - modes = list(MODE_NONE = MODE_ATMOS_THERMAL, MODE_ATMOS_THERMAL = MODE_NONE) + modes = list(MODE_NONE, MODE_ATMOS_THERMAL) /obj/item/clothing/glasses/meson/engine/atmos_imaging/update_icon_state() icon_state = inhand_icon_state = "trayson-[mode]" return ..() +/obj/item/clothing/glasses/meson/engine/admin + name = "admin imaging goggles" + desc = "Used by Nanotrasen admins to detect blueprint areas, pipes, thermal, wiring, and pipes." + range = 7 + modes = list(MODE_NONE, MODE_TRAY, MODE_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL, MODE_AREA_BLUEPRINTS) +/proc/show_blueprints(mob/viewer, range = 7, duration = 10) + if(!ismob(viewer) || !viewer.client) + return + for(var/turf/viewable_turf in view(range, viewer)) + var/area/selected_area = get_area(viewable_turf) + var/obj/area_overlay = image(selected_area.icon, viewable_turf, initial(selected_area.icon_state), TOPDOWN_ABOVE_WATER_LAYER) + SET_PLANE_EXPLICIT(area_overlay, ABOVE_GAME_PLANE, viewable_turf) + area_overlay.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA + area_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + area_overlay.alpha = 255 + flick_overlay_global(area_overlay, list(viewer.client), duration) /proc/atmos_thermal(mob/viewer, range = 5, duration = 10) if(!ismob(viewer) || !viewer.client) @@ -211,6 +234,7 @@ #undef MODE_SHUTTLE #undef MODE_PIPE_CONNECTABLE #undef MODE_ATMOS_THERMAL +#undef MODE_AREA_BLUEPRINTS #undef TEMP_SHADE_CYAN #undef TEMP_SHADE_GREEN #undef TEMP_SHADE_YELLOW diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 7f95d68f2a2..d9a4c493e78 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -178,7 +178,7 @@ icon_state = "lizardskin_shoes" inhand_icon_state = null -/obj/item/clothing/shoes/kim +/obj/item/clothing/shoes/jackboots/kim name = "aerostatic boots" desc = "A crisp, clean set of boots for working long hours on the beat." icon_state = "aerostatic_boots" diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index 6e19f18b452..004a1d60460 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -168,12 +168,10 @@ return ..() attacking_item.forceMove(src) -/obj/item/clothing/shoes/sneakers/orange/allow_attack_hand_drop(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/C = user - if(C.shoes == src && attached_cuffs) - to_chat(user, span_warning("You need help taking these off!")) - return FALSE +/obj/item/clothing/shoes/sneakers/orange/can_mob_unequip(mob/user) + if(user.get_item_by_slot(slot_flags) == src && attached_cuffs) + to_chat(user, span_warning("You need help taking these off!")) + return FALSE return ..() /obj/item/clothing/shoes/sneakers/orange/mouse_drop_dragged(atom/over_object, mob/user) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 0a6affdafd1..d75e5407798 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -123,8 +123,8 @@ return CONTEXTUAL_SCREENTIP_SET /obj/item/clothing/head/helmet/space/plasmaman/click_alt(mob/user) - if(user.can_perform_action(src)) - adjust_visor(user) + adjust_visor(user) + return CLICK_ACTION_SUCCESS /obj/item/clothing/head/helmet/space/plasmaman/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_welding_screen)) diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 33a12caccd1..297aedc2ed8 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -64,10 +64,9 @@ /obj/item/clothing/suit/toggle/labcoat/paramedic/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, -3) //FISH DOCTOR?! + allowed += /obj/item/crowbar/power/paramedic //START SKYRAT EDIT ADDITION - allowed += list( - /obj/item/storage/medkit, - ) + allowed += /obj/item/storage/medkit //END SKYRAT EDIT /obj/item/clothing/suit/toggle/labcoat/mad diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 82550085236..dcba4c5449b 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -7,14 +7,13 @@ abstract_type = /obj/item/clothing/under body_parts_covered = CHEST|GROIN|LEGS|ARMS slot_flags = ITEM_SLOT_ICLOTHING - interaction_flags_click = NEED_DEXTERITY + interaction_flags_click = NEED_DEXTERITY|ALLOW_RESTING armor_type = /datum/armor/clothing_under supports_variations_flags = CLOTHING_DIGITIGRADE_MASK equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg' pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg' limb_integrity = 30 - interaction_flags_click = ALLOW_RESTING /// Has this undersuit been freshly laundered and, as such, imparts a mood bonus for wearing var/freshly_laundered = FALSE @@ -175,8 +174,8 @@ /obj/item/clothing/under/dropped(mob/living/user) . = ..() - update_wearer_status() - GLOB.suit_sensors_list -= user + if(user.get_item_by_slot(ITEM_SLOT_ICLOTHING) == src) + GLOB.suit_sensors_list -= user // Start suit sensor handling diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index 8a6ab4a8c0a..cc041f7fb7b 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -1024,8 +1024,7 @@ // I mean is it really that bad if they don't even know half this stuff is added to them. // It's like, forbidden knowledge. It fits with the mansus theme - great excuse for poor design! knowledge_to_grant = list( - /datum/heretic_knowledge/blade_grasp, - /datum/heretic_knowledge/blade_dance, + /datum/heretic_knowledge/limited_amount/starting/base_blade, /datum/heretic_knowledge/blade_upgrade/blade, ) @@ -1067,7 +1066,7 @@ ) knowledge_to_grant = list( - /datum/heretic_knowledge/cosmic_grasp, + /datum/heretic_knowledge/limited_amount/starting/base_cosmic, ) spells_to_add = list( diff --git a/code/modules/detectivework/detective_scan_category.dm b/code/modules/detectivework/detective_scan_category.dm new file mode 100644 index 00000000000..e5d279a35cd --- /dev/null +++ b/code/modules/detectivework/detective_scan_category.dm @@ -0,0 +1,115 @@ +GLOBAL_LIST_INIT_TYPED(detective_scan_categories, /datum/detective_scan_category, initialize_detective_scan_categories()) + +/proc/initialize_detective_scan_categories() + var/list/categories = list() + for(var/datum/detective_scan_category/category_path as anything in subtypesof(/datum/detective_scan_category)) + var/datum/detective_scan_category/existing_category = categories[category_path::id] + if(!isnull(existing_category)) + stack_trace("`[category_path]` has duplicate id - `[category_path::id]` of `[existing_category.type]`") + continue + + categories[category_path::id] = new category_path + + return categories + +/datum/detective_scan_category + /// Category ID. Must be defined in `code/__DEFINES/security.dm` + var/id = "no id" + /// Name of scan category. Used in UIs and in paper + var/name = "no name" + /// Order the data with this category will be sorted by + var/display_order = 0 + /// Fontawesome icon used in TGUI near this category data entry + var/ui_icon = "question" + /// Fontawesome icon color used in TGUI near this category data entry + var/ui_icon_color = "white" + +/// Generates report data used in `/datum/detective_scanner_log/proc/generate_report_text()` +/datum/detective_scan_category/proc/generate_report_data(list/data) + SHOULD_NOT_OVERRIDE(TRUE) + + var/list/report_text = list() + report_text += "
    [name]
    " + + for(var/entry in data) + report_text += format_report_entry(entry, data[entry]) + + report_text += "
    " + return report_text + +/// Formats entered log data. Can be used to have unique formating per each category +/datum/detective_scan_category/proc/format_report_entry(entry, entry_associated_value) + return "[entry]
    " + +/datum/detective_scan_category/fingers + id = DETSCAN_CATEGORY_FINGERS + name = "Fingerprints" + display_order = 1 + ui_icon = "fingerprint" + ui_icon_color = "yellow" + +/datum/detective_scan_category/blood + id = DETSCAN_CATEGORY_BLOOD + name = "Blood DNA, Type" + display_order = 2 + ui_icon = "droplet" + ui_icon_color = "red" + +/datum/detective_scan_category/blood/format_report_entry(entry, entry_associated_value) + return "[entry], [entry_associated_value]
    " + +/datum/detective_scan_category/fiber + id = DETSCAN_CATEGORY_FIBER + name = "Fibers" + display_order = 3 + ui_icon = "shirt" + ui_icon_color = "green" + +/datum/detective_scan_category/drink + id = DETSCAN_CATEGORY_REAGENTS + name = "Reagents" + display_order = 4 + ui_icon = "flask" + ui_icon_color = "blue" + +/datum/detective_scan_category/drink/format_report_entry(entry, entry_associated_value) + return "[entry]: [entry_associated_value] u.
    " + +/datum/detective_scan_category/access + id = DETSCAN_CATEGORY_ACCESS + name = "ID Access" + display_order = 5 + ui_icon = "id-card" + ui_icon_color = "blue" + +/datum/detective_scan_category/access/format_report_entry(entry, entry_associated_value) + var/list/associated_value_list = entry_associated_value + return "[entry]: [associated_value_list]
    " + +/datum/detective_scan_category/setting + id = DETSCAN_CATEGORY_SETTINGS + name = "Active settings" + display_order = 6 + ui_icon = "wrench" + ui_icon_color = "orange" + +/datum/detective_scan_category/holy + id = DETSCAN_CATEGORY_HOLY + name = "Holy data" + display_order = 7 + ui_icon = "book-bible" + ui_icon_color = "brown" + +/datum/detective_scan_category/illegal + id = DETSCAN_CATEGORY_ILLEGAL + name = "Illegal tech" + display_order = 8 + ui_icon = "handcuffs" + ui_icon_color = "red" + +/datum/detective_scan_category/notes + id = DETSCAN_CATEGORY_NOTES + name = "Additional notes" + ui_icon = "clipboard" + ui_icon_color = "yellow" + display_order = 9 diff --git a/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm b/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm new file mode 100644 index 00000000000..5dbc390e4ca --- /dev/null +++ b/code/modules/detectivework/detective_scanner_data/detective_scanner_data_entry.dm @@ -0,0 +1,25 @@ +/proc/cmp_detective_scanner_data_entry(datum/detective_scanner_data_entry/a, datum/detective_scanner_data_entry/b) + return cmp_numeric_asc(a.display_order, b.display_order) + +/datum/detective_scanner_data_entry + /// Category this data entry is related to + var/category + /// Order this entry will be displayed in TGUI and paper report + var/display_order = 0 + /// List of data for this entry. Displayed in UIs and paper report + var/list/data = list() + +/datum/detective_scanner_data_entry/New(category, display_order, data) + src.category = category + src.display_order = display_order + if(!isnull(data)) + src.data += data + +/datum/detective_scanner_data_entry/ui_data(mob/user) + var/list/ui_data = list() + ui_data["category"] = category + ui_data["data"] = data + return ui_data + +/datum/detective_scanner_data_entry/proc/add_data(data) + src.data += data diff --git a/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm b/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm new file mode 100644 index 00000000000..c1b107b2046 --- /dev/null +++ b/code/modules/detectivework/detective_scanner_data/detective_scanner_log_entry.dm @@ -0,0 +1,65 @@ +/datum/detective_scanner_log + /// Name of the scanned atom + var/scan_target + /// Time the scan was performed at + var/scan_time + /// `data_entries` is an assoc list, which can't use `BINARY_INSERT` + /// And to not perform sorting pipeline every time new data is added, + /// this var will be utilized to only sort list when it's required + var/sorted = TRUE + /// Scan data for current log + var/list/data_entries = list() + +/datum/detective_scanner_log/ui_data(mob/user) + var/list/ui_data = list() + ui_data["scanTarget"] = scan_target + ui_data["scanTime"] = scan_time + + sort_data_entries() + var/list/data_entries_ui_data = list() + for(var/key,value in data_entries) + var/datum/detective_scanner_data_entry/entry = value + UNTYPED_LIST_ADD(data_entries_ui_data, entry.ui_data(user)) + + ui_data["dataEntries"] = data_entries_ui_data + return ui_data + +/// Adds new data entry to `data_entries` or updates existing one +/// Entries will be not sorted after using it +/// Returns TRUE if `data_entries` can be unsorted +/datum/detective_scanner_log/proc/add_data_entry(scan_category_id, data) + var/datum/detective_scan_category/category = GLOB.detective_scan_categories[scan_category_id] + if(isnull(category)) + stack_trace("scan_category_id - `[scan_category_id]` with no corresponding `/datum/detective_scan_category`") + category = GLOB.detective_scan_categories[DETSCAN_CATEGORY_NOTES] + + var/datum/detective_scanner_data_entry/data_entry = data_entries[category.id] + if(!isnull(data_entry)) + data_entry.add_data(data) + return + + data_entries[scan_category_id] = new /datum/detective_scanner_data_entry(scan_category_id, category.display_order, data) + sorted = (length(data_entries) <= 1) + +/// Sorts the `data_entries` list if it's considered not sorted +/datum/detective_scanner_log/proc/sort_data_entries() + if(!sorted) + sortTim(data_entries, GLOBAL_PROC_REF(cmp_detective_scanner_data_entry), TRUE) + sorted = TRUE + +/// Return text that will be used in printed paper report +/// Called in `/obj/item/detective_scanner/proc/print_report()` +/datum/detective_scanner_log/proc/generate_report_text() + var/list/report_text = list() + report_text += "

    [capitalize(scan_target)] scan at [scan_time]

    " + if(!length(data_entries)) + report_text += "No forensic traces found." + else + sort_data_entries() + for(var/log_category,data_entry in data_entries) + var/datum/detective_scanner_data_entry/data_entry_datum = data_entry + report_text += GLOB.detective_scan_categories[log_category].generate_report_data(data_entry_datum.data) + + report_text += "
    " + + return report_text diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index a686bc9c90a..4b60ee1b8e0 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -44,49 +44,12 @@ var/frNum = ++forensicPrintCount report_paper.name = "FR-[frNum] 'Forensic Record'" - var/list/report_text = list("

    Forensic Record - (FR-[frNum])


    ") + var/list/report_text = list("

    Forensic Record - (FR-[frNum])


    ") - for(var/list/log in log_data) - report_text += "

    [capitalize(log["scan_target"])] scan at [log["scan_time"]]

    " + for(var/datum/detective_scanner_log/log_entry as anything in log_data) + report_text += log_entry.generate_report_text() - if(!log[DETSCAN_CATEGORY_FIBER] && !log[DETSCAN_CATEGORY_BLOOD] && !log[DETSCAN_CATEGORY_FINGERS] && !log[DETSCAN_CATEGORY_DRINK] && !log[DETSCAN_CATEGORY_ACCESS]) - report_text += "No forensic traces found.
    " - continue - - if(log[DETSCAN_CATEGORY_FIBER]) - report_text += "
    [DETSCAN_CATEGORY_FIBER]
    " - for(var/fibers in log[DETSCAN_CATEGORY_FIBER]) - report_text += fibers + "
    " - report_text += "
    " - - if(log[DETSCAN_CATEGORY_BLOOD]) - report_text += "
    [DETSCAN_CATEGORY_BLOOD]
    " - for(var/blood in log[DETSCAN_CATEGORY_BLOOD]) - report_text += "[blood], [log[DETSCAN_CATEGORY_BLOOD][blood]]
    " - report_text += "
    " - - if(log[DETSCAN_CATEGORY_FINGERS]) - report_text += "
    [DETSCAN_CATEGORY_FINGERS]
    " - for(var/fingers in log[DETSCAN_CATEGORY_FINGERS]) - report_text += fingers + "
    " - report_text += "
    " - - if(log[DETSCAN_CATEGORY_DRINK]) - report_text += "
    [DETSCAN_CATEGORY_DRINK]
    " - for(var/reagent in log[DETSCAN_CATEGORY_DRINK]) - report_text += "[reagent]: [log[DETSCAN_CATEGORY_DRINK][reagent]] u.
    " - report_text += "
    " - - if(log[DETSCAN_CATEGORY_ACCESS]) - report_text += "
    [DETSCAN_CATEGORY_ACCESS]
    " - for(var/region in log[DETSCAN_CATEGORY_ACCESS]) - var/list/access_list = log[DETSCAN_CATEGORY_ACCESS][region] - report_text += "[region]: [access_list.Join(", ")]
    " - report_text += "
    " - - report_text += "

    " - - report_text += "

    Notes:


    " + report_text += "

    Notes:


    " report_paper.add_raw_text(report_text.Join()) report_paper.update_appearance() @@ -149,35 +112,38 @@ // GATHER INFORMATION - var/list/log_entry_data = list() + var/datum/detective_scanner_log/log_entry = new // Start gathering - log_entry_data["scan_target"] = scanned_atom.name - log_entry_data["scan_time"] = station_time_timestamp() + log_entry.scan_target = scanned_atom.name + log_entry.scan_time = station_time_timestamp() var/list/atom_fibers = GET_ATOM_FIBRES(scanned_atom) if(length(atom_fibers)) - log_entry_data[DETSCAN_CATEGORY_FIBER] = atom_fibers.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_FIBER, atom_fibers.Copy()) var/list/blood = GET_ATOM_BLOOD_DNA(scanned_atom) if(length(blood)) - log_entry_data[DETSCAN_CATEGORY_BLOOD] = blood.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, blood.Copy()) if(ishuman(scanned_atom)) var/mob/living/carbon/human/scanned_human = scanned_atom if(!scanned_human.gloves) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_FINGERS], md5(scanned_human.dna?.unique_identity)) + log_entry.add_data_entry( + DETSCAN_CATEGORY_FINGERS, + rustg_hash_string(RUSTG_HASH_MD5, scanned_human.dna?.unique_identity) + ) else if(!ismob(scanned_atom)) var/list/atom_fingerprints = GET_ATOM_FINGERPRINTS(scanned_atom) if(length(atom_fingerprints)) - log_entry_data[DETSCAN_CATEGORY_FINGERS] = atom_fingerprints.Copy() + log_entry.add_data_entry(DETSCAN_CATEGORY_FINGERS, atom_fingerprints.Copy()) // Only get reagents from non-mobs. for(var/datum/reagent/present_reagent as anything in scanned_atom.reagents?.reagent_list) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_DRINK], list(present_reagent.name = present_reagent.volume)) + log_entry.add_data_entry(DETSCAN_CATEGORY_REAGENTS, list(present_reagent.name = present_reagent.volume)) // Get blood data from the blood reagent. if(!istype(present_reagent, /datum/reagent/blood)) @@ -188,10 +154,7 @@ if(!blood_DNA || !blood_type) continue - // Add to our copied blood list instead of the original - if(!log_entry_data[DETSCAN_CATEGORY_BLOOD]) - log_entry_data[DETSCAN_CATEGORY_BLOOD] = list() - LAZYSET(log_entry_data[DETSCAN_CATEGORY_BLOOD], blood_DNA, blood_type) + log_entry.add_data_entry(DETSCAN_CATEGORY_BLOOD, list(blood_DNA = blood_type)) if(istype(scanned_atom, /obj/item/card/id)) var/obj/item/card/id/user_id = scanned_atom @@ -202,14 +165,17 @@ var/list/access_names = list() for(var/access_num in access_in_region) access_names += SSid_access.get_access_desc(access_num) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS], region) - LAZYADD(log_entry_data[DETSCAN_CATEGORY_ACCESS][region], english_list(access_names)) + + log_entry.add_data_entry(DETSCAN_CATEGORY_ACCESS, list("[region]" = english_list(access_names))) // sends it off to be modified by the items - SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry_data) + SEND_SIGNAL(scanned_atom, COMSIG_DETECTIVE_SCANNED, user, log_entry) + + // Perform sorting now, because probably this will be never modified + log_entry.sort_data_entries() stoplag(3 SECONDS) - log_data += list(log_entry_data) + log_data += log_entry return TRUE /obj/item/detective_scanner/click_alt(mob/living/user) @@ -217,7 +183,7 @@ /obj/item/detective_scanner/examine(mob/user) . = ..() - if(LAZYLEN(log_data) && !scanner_busy) + if(length(log_data) && !scanner_busy) . += span_notice("Alt-click to clear scanner logs.") @@ -228,8 +194,28 @@ ui.open() /obj/item/detective_scanner/ui_data(mob/user) + var/list/logs = list() + for(var/datum/detective_scanner_log/log as anything in log_data) + UNTYPED_LIST_ADD(logs, log.ui_data(user)) + var/list/data = list() - data["log_data"] = log_data + data["logs"] = logs + return data + +/obj/item/detective_scanner/ui_static_data(mob/user) + var/list/categories = list() + for(var/key,value in GLOB.detective_scan_categories) + var/datum/detective_scan_category/category = value + + var/list/category_data = list() + category_data["name"] = category.name + category_data["uiIcon"] = category.ui_icon + category_data["uiIconColor"] = category.ui_icon_color + + categories[category.id] = category_data + + var/list/data = list() + data["categories"] = categories return data /obj/item/detective_scanner/ui_act(action, params, datum/tgui/ui) @@ -251,7 +237,7 @@ balloon_alert(ui.user, "log deleted") ui.send_update() if("print") - if(!LAZYLEN(log_data)) + if(!length(log_data)) balloon_alert(ui.user, "no logs!") return if(scanner_busy) @@ -263,7 +249,7 @@ addtimer(CALLBACK(src, PROC_REF(safe_print_report)), 3 SECONDS) /obj/item/detective_scanner/proc/clear_logs(mob/living/user) - if(!LAZYLEN(log_data)) + if(!length(log_data)) balloon_alert(user, "no logs!") return CLICK_ACTION_BLOCKING if(scanner_busy) diff --git a/code/modules/fishing/fish_mount.dm b/code/modules/fishing/fish_mount.dm index 903a08801f4..fd9876c57a3 100644 --- a/code/modules/fishing/fish_mount.dm +++ b/code/modules/fishing/fish_mount.dm @@ -103,6 +103,9 @@ playsound(loc, 'sound/machines/click.ogg', 30, TRUE) return ITEM_INTERACT_SUCCESS +/obj/structure/fish_mount/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + /obj/structure/fish_mount/proc/add_fish(obj/item/fish/fish, from_persistence = FALSE, catcher) if(QDELETED(src)) // don't ever try to add a fish to one of these that's already been deleted - and get rid of the one that was created qdel(fish) @@ -113,7 +116,6 @@ mounted_fish.forceMove(loc) fish.forceMove(src) vis_contents += fish - fish.flags_1 |= IS_ONTOP_1 fish.vis_flags |= (VIS_INHERIT_PLANE|VIS_INHERIT_LAYER) fish.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP fish.obj_flags &= ~UNIQUE_RENAME @@ -195,7 +197,6 @@ if(!QDELETED(mounted_fish) && (!persistence_loaded_fish || roll_for_safe_removal())) rotate_fish(0, dir) UnregisterSignal(mounted_fish, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW)) - mounted_fish.flags_1 &= ~IS_ONTOP_1 mounted_fish.vis_flags &= ~(VIS_INHERIT_PLANE|VIS_INHERIT_LAYER) mounted_fish.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP mounted_fish.obj_flags |= UNIQUE_RENAME diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 923c496371a..5d465b6e7ef 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -284,7 +284,7 @@ GLOBAL_LIST_EMPTY(fishing_challenges_by_user) /datum/fishing_challenge/proc/on_float_or_user_move(datum/source) SIGNAL_HANDLER - if(!user.CanReach(location)) + if(!location.IsReachableBy(user)) user.balloon_alert(user, "too far!") interrupt() diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index ce71a616831..907cf0f5908 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -543,13 +543,13 @@ var/list/data = list() data["bait_name"] = format_text(bait?.name) - data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state)) : null + data["bait_icon"] = bait != null ? icon2base64(icon(bait.icon, bait.icon_state, frame = 1)) : null data["line_name"] = format_text(line?.name) - data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state)) : null + data["line_icon"] = line != null ? icon2base64(icon(line.icon, line.icon_state, frame = 1)) : null data["hook_name"] = format_text(hook?.name) - data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state)) : null + data["hook_icon"] = hook != null ? icon2base64(icon(hook.icon, hook.icon_state, frame = 1)) : null data["busy"] = fishing_line diff --git a/code/modules/fishing/sources/subtypes/rifts.dm b/code/modules/fishing/sources/subtypes/rifts.dm index b9d4a7f39e1..b151c963bbf 100644 --- a/code/modules/fishing/sources/subtypes/rifts.dm +++ b/code/modules/fishing/sources/subtypes/rifts.dm @@ -157,11 +157,11 @@ fishfluence.after_drain(user) var/datum/antagonist/heretic/heretic_datum = GET_HERETIC(user) if(heretic_datum) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) to_chat(user, "[span_hear("You hear a whisper...")] [span_hypnophrase("THE HIGHER I RISE, THE MORE I FISH.")]") // They can also gain an extra influence point if they infused their rod. if(HAS_TRAIT(challenge.used_rod, TRAIT_ROD_MANSUS_INFUSED)) - heretic_datum.knowledge_points++ + heretic_datum.adjust_knowledge_points(1) to_chat(user, span_boldnotice("Your infused rod improves your knowledge gain!")) return diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index 5d0beed7ee0..83dcb2ae873 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -41,6 +41,9 @@ return variant = rand(1,3) +/obj/machinery/griddle/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return ..() || (contained in griddled_objects) + /obj/machinery/griddle/proc/on_expose_reagent(atom/parent_atom, datum/reagent/exposing_reagent, reac_volume, methods) SIGNAL_HANDLER @@ -141,7 +144,6 @@ /obj/machinery/griddle/proc/AddToGrill(obj/item/item_to_grill, mob/user) vis_contents += item_to_grill griddled_objects += item_to_grill - item_to_grill.flags_1 |= IS_ONTOP_1 item_to_grill.vis_flags |= VIS_INHERIT_PLANE SEND_SIGNAL(item_to_grill, COMSIG_ITEM_GRILL_PLACED, user) @@ -155,7 +157,6 @@ /obj/machinery/griddle/proc/ItemRemovedFromGrill(obj/item/ungrill) SIGNAL_HANDLER - ungrill.flags_1 &= ~IS_ONTOP_1 ungrill.vis_flags &= ~VIS_INHERIT_PLANE griddled_objects -= ungrill vis_contents -= ungrill diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index a0d0ebad417..a94ca674038 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -46,6 +46,9 @@ remove_shared_particles(particle_type) return ..() +/obj/machinery/oven/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return ..() || istype(contained, /obj/item/plate/oven_tray) + /// Used to determine if the oven appears active and cooking, or offline. /obj/machinery/oven/proc/appears_active() return !open && length(used_tray?.contents) && !(machine_stat & (BROKEN|NOPOWER)) @@ -127,7 +130,6 @@ if(!open) oven_tray.vis_flags |= VIS_HIDE vis_contents += oven_tray - oven_tray.flags_1 |= IS_ONTOP_1 oven_tray.vis_flags |= VIS_INHERIT_PLANE oven_tray.pixel_y = OVEN_TRAY_Y_OFFSET oven_tray.pixel_x = OVEN_TRAY_X_OFFSET @@ -144,7 +146,6 @@ /obj/machinery/oven/proc/tray_removed_from_oven(obj/item/oven_tray) SIGNAL_HANDLER - oven_tray.flags_1 &= ~IS_ONTOP_1 oven_tray.vis_flags &= ~VIS_INHERIT_PLANE vis_contents -= oven_tray used_tray = null diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 859628abc98..eda53ab1777 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -232,7 +232,7 @@ /// We pick up a number of slimes equal to the rating of the matter bin var/slimes_picked = 0 for(var/mob/living/basic/slime/slime in range(1,src)) - if(!CanReach(slime)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor + if(!slime.IsReachableBy(src)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor continue if(slime.stat) var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(slime) diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index f9f65b24cd0..c19c0b75d7b 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -47,6 +47,7 @@ /obj/item/reagent_containers/cup/soup_pot/Initialize(mapload, vol) . = ..() + AddElement(/datum/element/cuffable_item) RegisterSignal(src, COMSIG_ATOM_REAGENT_EXAMINE, PROC_REF(reagent_special_examine)) register_context() diff --git a/code/modules/food_and_drinks/machinery/stove_component.dm b/code/modules/food_and_drinks/machinery/stove_component.dm index 8db59dc2739..824041ac86d 100644 --- a/code/modules/food_and_drinks/machinery/stove_component.dm +++ b/code/modules/food_and_drinks/machinery/stove_component.dm @@ -217,7 +217,7 @@ /datum/component/stove/proc/add_container(obj/item/new_container, mob/user) var/obj/real_parent = parent real_parent.vis_contents += new_container - new_container.flags_1 |= IS_ONTOP_1 + ADD_TRAIT(new_container, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) new_container.vis_flags |= VIS_INHERIT_PLANE container = new_container @@ -230,7 +230,7 @@ /datum/component/stove/proc/remove_container() var/obj/real_parent = parent - container.flags_1 &= ~IS_ONTOP_1 + REMOVE_TRAIT(container, TRAIT_SKIP_BASIC_REACH_CHECK, REF(src)) container.vis_flags &= ~VIS_INHERIT_PLANE real_parent.vis_contents -= container @@ -274,4 +274,3 @@ return var/obj/effect/abstract/shared_particle_holder/soup_smoke = obj_parent.add_shared_particles(particle_type, "[particle_type]_stove_[container_x]") soup_smoke.particles.position = list(container_x, round(ICON_SIZE_Y * 0.66), 0) - diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 225e8d86865..ff210436cc1 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -53,10 +53,12 @@ target.attackby(object_to_eat, user) return TRUE //No normal attack +/obj/item/plate/IsContainedAtomAccessible(atom/contained, atom/movable/user) + return TRUE + ///This proc adds the food to viscontents and makes sure it can deregister if this changes. /obj/item/plate/proc/AddToPlate(obj/item/item_to_plate) vis_contents += item_to_plate - item_to_plate.flags_1 |= IS_ONTOP_1 item_to_plate.vis_flags |= VIS_INHERIT_PLANE RegisterSignal(item_to_plate, COMSIG_MOVABLE_MOVED, PROC_REF(ItemMoved)) RegisterSignal(item_to_plate, COMSIG_QDELETING, PROC_REF(ItemMoved)) @@ -72,7 +74,6 @@ ///This proc cleans up any signals on the item when it is removed from a plate, and ensures it has the correct state again. /obj/item/plate/proc/ItemRemovedFromPlate(obj/item/removed_item) - removed_item.flags_1 &= ~IS_ONTOP_1 removed_item.vis_flags &= ~VIS_INHERIT_PLANE vis_contents -= removed_item UnregisterSignal(removed_item, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING)) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index 574b70ce41f..82713b5c125 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -165,6 +165,10 @@ /datum/reagent/blood = 30, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/pet/dog/breaddog category = CAT_BREAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index de8a2f4e57d..778d559aee0 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -234,6 +234,10 @@ /datum/reagent/consumable/sprinkles = 5, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/pet/cat/cak category = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Felines diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm index 3f62c324a12..82016dab5c3 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -146,3 +146,13 @@ //We can't spawn the abstract food/grown path unit_test_spawn_extras = list(/obj/item/food/grown/banana = 4) category = CAT_DRINK + +/datum/crafting_recipe/lean + name = "lean" + result = /obj/item/reagent_containers/cup/glass/colocup/lean + time = 1 SECONDS + reqs = list(/obj/item/reagent_containers/cup/glass/colocup = 1, + /obj/item/food/gumball = 2, + /datum/reagent/medicine/morphine = 5, + /datum/reagent/consumable/space_up = 15) + category = CAT_DRINK diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 1dead375c9f..ab213c2a2dc 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -170,6 +170,10 @@ /datum/reagent/blood = 50, /datum/reagent/teslium = 1 //To shock the whole thing into life ) + parts = list( + /obj/item/organ/brain, + /obj/item/organ/heart + ) result = /mob/living/basic/bear/butter category = CAT_MISCFOOD diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index c90b60d2f41..b52f031a547 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -56,7 +56,7 @@ /datum/hallucination/delusion/Destroy() if(!QDELETED(hallucinator) && LAZYLEN(delusions)) - hallucinator.client?.images -= flatten_list(delusions) + hallucinator.client?.images -= assoc_to_values(delusions) LAZYNULL(delusions) return ..() diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index 0c1ec753d15..51f9e6566a0 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -1,5 +1,34 @@ // CHAPLAIN NULLROD AND CUSTOM WEAPONS // +GLOBAL_LIST_INIT(nullrod_variants, init_nullrod_variants()) + +/proc/init_nullrod_variants() + var/list/rods = list() + for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod)) + if(!nullrod_type::chaplain_spawnable) + continue + rods[nullrod_type] = nullrod_type::menu_description + //special non-nullrod subtyped shit + rods[/obj/item/toy/plush/carpplushie/nullrod] = "A plushie dealing a little less damage due to its cute form. \ + Capable of blessing one person with the Carp-Sie favor, \ + which grants friendship of all wild space carps. Fits in pockets. Can be worn on the belt." + rods[/obj/item/gun/ballistic/bow/divine] = "A divine bow and 10 quivered holy arrows." + rods[/obj/item/organ/cyberimp/arm/toolkit/shard/scythe] = "A shard that implants itself into your arm, \ + allowing you to conjure forth a vorpal scythe. \ + Allows you to behead targets for empowered strikes. \ + Harms you if you dismiss the scythe without first causing harm to a creature. \ + The shard also causes you to become Morbid, shifting your interests towards the macabre." + rods[/obj/item/melee/skateboard/holyboard] = "A skateboard that grants you flight and anti-magic abilities while ridden. Fits in your bag." + + for(var/obj/item/melee/energy/sword/nullrod/energy_nullrod_type as anything in typesof(/obj/item/melee/energy/sword/nullrod)) + rods[energy_nullrod_type] = "An energy sword, but with a lower force, no armour penetration and a low chance of blocking. Can be switched on and off. \ + Can be stored away easily while off, but impossible while on." + // BUBBER EDIT ADDITION BEGIN + rods[/obj/item/dualsaber/chaplain] = "A huge energy blade, it possesses the unique ability to block projectiles, but the unwieldy nature of it \ + means that you'll be forced to move carefully while it's on. Fits in pockets, and can be worn on the belt when off." + // BUBBER EDIT ADDITION END + return rods + /obj/item/nullrod name = "null rod" desc = "A rod of pure obsidian; its very presence disrupts and dampens 'magical forces'. That's what the guidebook says, anyway." @@ -27,67 +56,20 @@ /obj/item/nullrod/Initialize(mapload) . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) - AddComponent(/datum/component/effect_remover, \ - success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ - success_forcesay = "BEGONE FOUL MAGIKS!!", \ - tip_text = "Clear rune", \ - on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ - effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) - ADD_TRAIT(src, TRAIT_NULLROD_ITEM, INNATE_TRAIT) + AddElement(/datum/element/nullrod_core, chaplain_spawnable) if((GLOB.holy_weapon_type && station_holy_item) || type != /obj/item/nullrod) return - - var/list/rods = list() - for(var/obj/item/nullrod/nullrod_type as anything in typesof(/obj/item/nullrod)) - if(!initial(nullrod_type.chaplain_spawnable)) - continue - rods[nullrod_type] = initial(nullrod_type.menu_description) - //special non-nullrod subtyped shit - rods[/obj/item/gun/ballistic/bow/divine/with_quiver] = "A divine bow and 10 quivered holy arrows." - rods[/obj/item/organ/cyberimp/arm/toolkit/shard/scythe] = "A shard that implants itself into your arm, \ - allowing you to conjure forth a vorpal scythe. \ - Allows you to behead targets for empowered strikes. \ - Harms you if you dismiss the scythe without first causing harm to a creature. \ - The shard also causes you to become Morbid, shifting your interests towards the macabre." - rods[/obj/item/melee/skateboard/holyboard] = "A skateboard that grants you flight and anti-magic abilities while ridden. Fits in your bag." - // BUBBER EDIT ADDITION BEGIN - rods[/obj/item/dualsaber/chaplain] = "A huge energy blade, it possesses the unique ability to block projectiles, but the unwieldy nature of it \ - means that you'll be forced to move carefully while it's on. Fits in pockets, and can be worn on the belt when off." - // BUBBER EDIT ADDITION END - AddComponent(/datum/component/subtype_picker, rods, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) + AddComponent(/datum/component/subtype_picker, GLOB.nullrod_variants, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) /// Callback for subtype picker, invoked when the chaplain picks a new nullrod /obj/item/nullrod/proc/on_holy_weapon_picked(obj/item/nullrod/new_holy_weapon, mob/living/picker) - // Some nullrod variants aren't nullrod subtypes - if(istype(new_holy_weapon)) - new_holy_weapon.on_selected(src, picker) - else // In which case they still need to be marked as one - ADD_TRAIT(new_holy_weapon, TRAIT_NULLROD_ITEM, INNATE_TRAIT) if(!station_holy_item) return GLOB.holy_weapon_type = new_holy_weapon.type SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NULLROD_PICKED) SSblackbox.record_feedback("tally", "chaplain_weapon", 1, "[new_holy_weapon.name]") -/// Called on a new instance of a nullrod when selected -/// Override this to add behavior when a nullrod is picked -/obj/item/nullrod/proc/on_selected(obj/item/nullrod/old_weapon, mob/living/picker) - return - -/// Callback for effect remover, invoked when a cult rune is cleared -/obj/item/nullrod/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) - if(!istype(target, /obj/effect/rune)) - return - - var/obj/effect/rune/target_rune = target - if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE - /obj/item/nullrod/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!")) return (BRUTELOSS|FIRELOSS) @@ -212,33 +194,6 @@ SET_ATTACK_FORCE(attack_modifiers, rand(max(force - 15, 1), force + 15)) return ..() -/obj/item/nullrod/claymore/saber - name = "light energy sword" - desc = "If you strike me down, I shall become more robust than you can possibly imagine." - icon = 'icons/obj/weapons/transforming_energy.dmi' - icon_state = "e_sword_on_blue" - inhand_icon_state = "e_sword_on_blue" - worn_icon_state = "swordblue" - icon_angle = -45 - slot_flags = ITEM_SLOT_BELT - hitsound = 'sound/items/weapons/blade1.ogg' - block_sound = 'sound/items/weapons/block_blade.ogg' - menu_description = "A sharp energy sword which provides a low chance of blocking incoming melee attacks. Can be worn on the belt." - -/obj/item/nullrod/claymore/saber/red - name = "dark energy sword" - desc = "Woefully ineffective when used on steep terrain." - icon_state = "e_sword_on_red" - inhand_icon_state = "e_sword_on_red" - worn_icon_state = "swordred" - -/obj/item/nullrod/claymore/saber/pirate - name = "nautical energy sword" - desc = "Convincing HR that your religion involved piracy was no mean feat." - icon_state = "e_cutlass_on" - inhand_icon_state = "e_cutlass_on" - worn_icon_state = "swordred" - /// Vibro Variant /// This subtype possesses armor penetration and is sharp. @@ -323,6 +278,10 @@ toolspeed = 0.5 //same speed as an active chainsaw chaplain_spawnable = FALSE //prevents being pickable as a chaplain weapon (it has 30 force) +/obj/item/nullrod/vibro/talking/chainsword/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //Thanks goodness it cannot be selected by chappies + /// Other Variants /// Not a special category on their own, but usually possess more unique mechanics @@ -459,17 +418,20 @@ bonus_modifier = 0, \ butcher_sound = hitsound, \ ) + RegisterSignal(src, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, PROC_REF(on_selected)) -/obj/item/nullrod/chainsaw/on_selected(obj/item/nullrod/old_weapon, mob/living/picker) +/obj/item/nullrod/chainsaw/proc/on_selected(datum/source, obj/item/nullrod/old_weapon, mob/living/picker) + SIGNAL_HANDLER if(!iscarbon(picker)) return + to_chat(picker, span_warning("[src] takes the place of your arm!")) var/obj/item/bodypart/active = picker.get_active_hand() var/mob/living/carbon/new_hero = picker new_hero.make_item_prosthetic(src, active.body_zone) /obj/item/nullrod/chainsaw/equipped(mob/living/carbon/user, slot, initial) . = ..() - if(!iscarbon(user)) + if(!iscarbon(user) || HAS_TRAIT_FROM(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)) return if(!(slot & ITEM_SLOT_HANDS)) return @@ -611,26 +573,19 @@ // Carp-sie Plushie - Gives you the carp faction so that you can be friends with carp. -/obj/item/nullrod/carp +/obj/item/toy/plush/carpplushie/nullrod name = "carp-sie plushie" desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie." - icon = 'icons/map_icons/items/_item.dmi' - icon_state = "/obj/item/nullrod/carp" - post_init_icon_state = "map_plushie_carp" - greyscale_config = /datum/greyscale_config/plush_carp - greyscale_colors = "#cc99ff#000000" - inhand_icon_state = "carp_plushie" worn_icon_state = "nullrod" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 15 - attack_verb_continuous = list("bites", "eats", "fin slaps") - attack_verb_simple = list("bite", "eat", "fin slap") - hitsound = 'sound/items/weapons/bite.ogg' - menu_description = "A plushie dealing a little less damage due to its cute form. Capable of blessing one person with the Carp-Sie favor, which grants friendship of all wild space carps. Fits in pockets. Can be worn on the belt." + offspring_type = /obj/item/toy/plush/carpplushie + divine = TRUE -/obj/item/nullrod/carp/Initialize(mapload) +/obj/item/toy/plush/carpplushie/nullrod/Initialize(mapload) . = ..() + AddElement(/datum/element/nullrod_core) AddComponent(/datum/component/faction_granter, FACTION_CARP, holy_role_required = HOLY_ROLE_PRIEST, grant_message = span_boldnotice("You are blessed by Carp-Sie. Wild space carp will no longer attack you.")) // Monk's Staff - Higher block, lower damage. diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index f521b7603ec..f2c7ed53d40 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -60,8 +60,6 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and var/empowerment = SCYTHE_WEAK ///Our bonus to force after we have death knelled. Lasts approximately 2 minutes. var/bonus_force_multiplier = 2 - ///Our initial force before empowerment. For tracking on the item, and in case the item somehow gains more force for some reason before we death knelled. - var/original_force /obj/item/vorpalscythe/examine(mob/user) . = ..() @@ -79,20 +77,13 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and /obj/item/vorpalscythe/Initialize(mapload) . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) - AddComponent(/datum/component/effect_remover, \ - success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ - success_forcesay = "TO DUST WITH YE!! AWAY!!", \ - tip_text = "Clear rune", \ - on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ - effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \ - ) + AddElement(/datum/element/nullrod_core, chaplain_spawnable = FALSE, rune_remove_line = "TO DUST WITH YE!! AWAY!!") // The implant is the actual item the chappie can select AddComponent( /datum/component/butchering, \ speed = 3 SECONDS, \ effectiveness = 125, \ ) - AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //less good at killing revenants, much better at killing plants + AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //also good at killing plants /obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know. @@ -103,6 +94,12 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and return ..() +/obj/item/vorpalscythe/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + if(empowerment == SCYTHE_EMPOWERED) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, bonus_force_multiplier) + + return ..() + //Borrows some amputation shear code, but much more specific /obj/item/vorpalscythe/attack_secondary(mob/living/victim, mob/living/user, params) if(!iscarbon(victim) || user.combat_mode) @@ -180,33 +177,15 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and //Only reset SCTHE_SATED if hitting at least simple mobs or nonmonkey carbons. var/allow_timer_set = FALSE - if(potential_empowerment == SCYTHE_EMPOWERED) - if(empowerment != SCYTHE_EMPOWERED) //We only empower our stats if we beheaded a human with a mind. - original_force = force - force *= bonus_force_multiplier - empowerment = potential_empowerment - allow_timer_set = TRUE - else if(empowerment < potential_empowerment) //so we don't end up weakening our scythe somehow and creating an infinite empowerment loop, only update empowerment if it is better - empowerment = potential_empowerment + if(empowerment < potential_empowerment || empowerment == potential_empowerment) //Reset the timer only if our potential empowerment is equivalent or stronger than our current empowerment allow_timer_set = TRUE + empowerment = potential_empowerment if(potential_empowerment != SCYTHE_WEAK && allow_timer_set) //And finally, if the empowerment was improved and wasn't too weak to get an empowerment, we set/reset our timer addtimer(CALLBACK(src, PROC_REF(scythe_empowerment_end)), (4 MINUTES / empowerment), TIMER_UNIQUE | TIMER_OVERRIDE) /obj/item/vorpalscythe/proc/scythe_empowerment_end() - if(empowerment == SCYTHE_EMPOWERED) - force = original_force - original_force = null empowerment = SCYTHE_WEAK -/obj/item/vorpalscythe/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) - if(!istype(target, /obj/effect/rune)) - return - - var/obj/effect/rune/target_rune = target - if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE - #undef SCYTHE_WEAK #undef SCYTHE_SATED #undef SCYTHE_EMPOWERED diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index b28c6c3e428..eda435e2aec 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -66,15 +66,15 @@ ) belt = /obj/item/modular_computer/pda/heads/cmo ears = /obj/item/radio/headset/heads/cmo - shoes = /obj/item/clothing/shoes/sneakers/blue + shoes = /obj/item/clothing/shoes/sneakers/white l_pocket = /obj/item/laser_pointer/blue r_pocket = /obj/item/pinpointer/crew l_hand = /obj/item/storage/medkit/surgery - backpack = /obj/item/storage/backpack/medic - satchel = /obj/item/storage/backpack/satchel/med - duffelbag = /obj/item/storage/backpack/duffelbag/med - messenger = /obj/item/storage/backpack/messenger/med + backpack = /obj/item/storage/backpack/chief_medic + satchel = /obj/item/storage/backpack/satchel/chief_medic + duffelbag = /obj/item/storage/backpack/duffelbag/chief_medic + messenger = /obj/item/storage/backpack/messenger/chief_medic box = /obj/item/storage/box/survival/medical chameleon_extras = list( diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm b/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm index 8a37031b818..7c1e4f7ddf2 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/mining_site.dm @@ -27,7 +27,7 @@ icon_state = "corpseminer" // Gives the minesite corpses the gutted effect so that the boss ignores them -/obj/effect/mob_spawn/corpse/human/minesite/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/minesite/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.apply_status_effect(/datum/status_effect/gutted) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 6eeffca6d09..acbd5e7332b 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -31,7 +31,7 @@ var/mob/thrown_by = throwingdatum?.get_thrower() if(ismovable(hit_atom) && !caught && (!thrown_by || thrown_by && COOLDOWN_FINISHED(src, freeze_cooldown))) freeze_hit_atom(hit_atom) - if(thrown_by && !caught) + if(istype(thrown_by) && !caught) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, throw_range+2, throw_speed, null, TRUE), 0.1 SECONDS) /obj/item/freeze_cube/proc/freeze_hit_atom(atom/movable/hit_atom) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 3c8722e9773..b6e659462a6 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -661,7 +661,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/item/analyzer/hilbertsanalyzer/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!istype(interacting_with, /obj/item/hilbertshotel)) return ..() - if(!user.CanReach(interacting_with)) + if(!interacting_with.IsReachableBy(user)) to_chat(user, span_warning("It's to far away to scan!")) return ITEM_INTERACT_BLOCKING var/obj/item/hilbertshotel/sphere = interacting_with diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index e4266e59c13..542c2bd36f2 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -11,7 +11,7 @@ /// Tiger cultist corpse but with an exit wound /obj/effect/mob_spawn/corpse/human/tigercultist/perforated -/obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() var/obj/item/bodypart/chest/their_chest = spawned_human.get_bodypart(BODY_ZONE_CHEST) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index c157636b121..2e81e198737 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -91,7 +91,7 @@ var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. var/list/ruins_available = list() //we can try these in the current pass - if(PERFORM_ALL_TESTS(log_mapping)) + if(PERFORM_ALL_TESTS(maptest_log_mapping)) log_mapping("All ruins being loaded for map testing.") switch(mineral_budget_update) //If we use more map configurations, add another case @@ -104,7 +104,7 @@ for(var/key in ruins) var/datum/map_template/ruin/R = ruins[key] - if(PERFORM_ALL_TESTS(log_mapping)) + if(PERFORM_ALL_TESTS(maptest_log_mapping)) R.cost = 0 R.allow_duplicates = FALSE // no multiples for testing R.always_place = !R.unpickable // unpickable ruin means it spawns as a set with another ruin diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm deleted file mode 100644 index bbec54ed356..00000000000 --- a/code/modules/mining/abandoned_crates.dm +++ /dev/null @@ -1,261 +0,0 @@ -//Originally coded by ISaidNo, later modified by Kelenius. Ported from Baystation12. - -/obj/structure/closet/crate/secure/loot - name = "abandoned crate" - desc = "What could be inside?" - icon_state = "securecrate" - base_icon_state = "securecrate" - integrity_failure = 0 //no breaking open the crate - var/code = null - var/lastattempt = null - var/attempts = 10 - var/codelen = 4 - var/qdel_on_open = FALSE - var/spawned_loot = FALSE - tamperproof = 90 - - // Stop people from "diving into" the crate accidentally, and then detonating it. - divable = FALSE - -/obj/structure/closet/crate/secure/loot/Initialize(mapload) - . = ..() - var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") - code = "" - for(var/i in 1 to codelen) - var/dig = pick(digits) - code += dig - digits -= dig //there are never matching digits in the answer - -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/structure/closet/crate/secure/loot/attack_hand(mob/user, list/modifiers) - if(locked) - to_chat(user, span_notice("The crate is locked with a Deca-code lock.")) - var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text|null - if(user.can_perform_action(src) && locked) - var/list/sanitised = list() - var/sanitycheck = TRUE - var/char = "" - var/length_input = length(input) - for(var/i = 1, i <= length_input, i += length(char)) //put the guess into a list - char = input[i] - if(!(char >= "0" && char <= "9")) - sanitycheck = FALSE //if a non-digit is found, reject the input - sanitised += text2num(char) - for(var/i in 1 to length(sanitised) - 1) //compare each digit in the guess to all those following it - for(var/j in i + 1 to length(sanitised)) - if(sanitised[i] == sanitised[j]) - sanitycheck = FALSE //if a digit is repeated, reject the input - if(input == code) - if(!spawned_loot) - spawn_loot() - tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die - togglelock(user) - else if(!input || !sanitycheck || length(sanitised) != codelen) - to_chat(user, span_notice("You leave the crate alone.")) - else - to_chat(user, span_warning("A red light flashes.")) - lastattempt = input - attempts-- - if(attempts == 0) - boom(user) - return - - return ..() - -/obj/structure/closet/crate/secure/loot/click_alt(mob/living/user) - attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. - return CLICK_ACTION_SUCCESS - -/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) - if(locked) - if(W.tool_behaviour == TOOL_MULTITOOL) - to_chat(user, span_notice("DECA-CODE LOCK REPORT:")) - if(attempts == 1) - to_chat(user, span_warning("* Anti-Tamper Bomb will activate on next failed access attempt.")) - else - to_chat(user, span_notice("* Anti-Tamper Bomb will activate after [attempts] failed access attempts.")) - if(lastattempt != null) - var/bulls = 0 //right position, right number - var/cows = 0 //wrong position but in the puzzle - - var/lastattempt_char = "" - var/length_lastattempt = length(lastattempt) - var/lastattempt_it = 1 - - var/code_char = "" - var/length_code = length(code) - var/code_it = 1 - - while(lastattempt_it <= length_lastattempt && code_it <= length_code) // Go through list and count matches - lastattempt_char = lastattempt[lastattempt_it] - code_char = code[code_it] - if(lastattempt_char == code_char) - ++bulls - else if(findtext(code, lastattempt_char)) - ++cows - - lastattempt_it += length(lastattempt_char) - code_it += length(code_char) - - to_chat(user, span_notice("Last code attempt, [lastattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.")) - return - return ..() - -/obj/structure/closet/crate/secure/loot/emag_act(mob/user, obj/item/card/emag/emag_card) - . = ..() - - if(locked) - boom(user) // no feedback since it just explodes, thats its own feedback - return TRUE - return - -/obj/structure/closet/crate/secure/loot/togglelock(mob/user, silent = FALSE) - if(!locked) - . = ..() //Run the normal code. - if(locked) //Double check if the crate actually locked itself when the normal code ran. - //reset the anti-tampering, number of attempts and last attempt when the lock is re-enabled. - tamperproof = initial(tamperproof) - attempts = initial(attempts) - lastattempt = null - return - if(tamperproof) - return - return ..() - -/obj/structure/closet/crate/secure/loot/atom_deconstruct(disassembled = TRUE) - if(locked) - boom() - return - return ..() - -/obj/structure/closet/crate/secure/loot/after_open(mob/living/user, force) - . = ..() - if(qdel_on_open) - qdel(src) - -/obj/structure/closet/crate/secure/loot/proc/spawn_loot() - var/loot = rand(1,100) //100 different crates with varying chances of spawning - switch(loot) - if(1 to 5) //5% chance - new /obj/item/reagent_containers/cup/glass/bottle/rum(src) - new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) - new /obj/item/reagent_containers/cup/glass/bottle/whiskey(src) - new /obj/item/lighter(src) - new /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium(src) - for(var/i in 1 to 3) - new /obj/item/cigarette/rollie(src) - if(6 to 10) - new /obj/item/melee/skateboard/pro(src) - if(11 to 15) - new /mob/living/basic/bot/honkbot(src) - if(16 to 20) - new /obj/item/stack/ore/diamond(src, 10) - if(21 to 25) - for(var/i in 1 to 5) - new /obj/item/poster/random_contraband(src) - if(26 to 30) - new /obj/item/vending_refill/sovietsoda(src) - var/obj/item/circuitboard/machine/vendor/board = new (src) - board.set_type(/obj/machinery/vending/sovietsoda) - if(31 to 35) - new /obj/item/seeds/firelemon(src) - if(36 to 40) - for(var/i in 1 to 5) - new /obj/item/toy/snappop/phoenix(src) - if(41 to 45) - new /obj/item/modular_computer/pda/clear(src) - if(46 to 50) - new /obj/item/storage/box/syndie_kit/chameleon/broken - if(51 to 52) // 2% chance - new /obj/item/melee/baton(src) - if(53 to 54) - new /obj/item/toy/balloon/corgi(src) - if(55 to 56) - var/newitem = pick(subtypesof(/obj/item/toy/mecha)) - new newitem(src) - if(57 to 58) - new /obj/item/toy/balloon/syndicate(src) - if(59 to 60) - new /obj/item/borg/upgrade/modkit/aoe/mobs(src) - new /obj/item/clothing/suit/space(src) - new /obj/item/clothing/head/helmet/space(src) - if(61 to 62) - for(var/i in 1 to 5) - new /obj/item/clothing/head/costume/kitty(src) - new /obj/item/clothing/neck/petcollar(src) - if(63 to 64) - new /obj/item/clothing/shoes/kindle_kicks(src) - if(65 to 66) - new /obj/item/clothing/suit/costume/wellworn_shirt/graphic/ian(src) - new /obj/item/clothing/suit/hooded/ian_costume(src) - if(67 to 68) - var/obj/item/gibtonite/free_bomb = new /obj/item/gibtonite(src) - free_bomb.quality = rand(GIBTONITE_QUALITY_LOW, GIBTONITE_QUALITY_HIGH) - free_bomb.GibtoniteReaction(null, "A secure loot closet has spawned a live") - if(69 to 70) - new /obj/item/stack/ore/bluespace_crystal(src, 5) - if(71 to 72) - new /obj/item/toy/plush/snakeplushie(src) - if(73 to 74) - new /mob/living/basic/pet/gondola(src) - if(75 to 76) - new /obj/item/bikehorn/airhorn(src) - if(77 to 78) - new /obj/item/toy/plush/lizard_plushie(src) - if(79 to 80) - new /obj/item/stack/sheet/mineral/bananium(src, 10) - if(81 to 82) - new /obj/item/bikehorn/airhorn(src) - if(83 to 84) - new /obj/item/toy/plush/beeplushie(src) - if(85 to 86) - new /obj/item/defibrillator/compact(src) - if(87) //1% chance - var/list/cannabis_seeds = typesof(/obj/item/seeds/cannabis) - var/list/cannabis_plants = typesof(/obj/item/food/grown/cannabis) - for(var/i in 1 to rand(2, 4)) - var/seed_type = pick(cannabis_seeds) - new seed_type(src) - for(var/i in 1 to rand(2, 4)) - var/cannabis_type = pick(cannabis_plants) - new cannabis_type(src) - if(88) - new /obj/item/reagent_containers/cup/glass/bottle/lizardwine(src) - if(89) - new /obj/item/melee/energy/sword/bananium(src) - if(90) - new /obj/item/dnainjector/wackymut(src) - if(91) - for(var/i in 1 to 30) - new /mob/living/basic/cockroach/bloodroach(src) - if(92) - new /obj/item/katana(src) - if(93) - new /obj/item/dnainjector/xraymut(src) - if(94) - new /mob/living/basic/mimic/crate(src) - qdel_on_open = TRUE - if(95) - new /obj/item/toy/plush/nukeplushie(src) - if(96) - new /obj/item/banhammer(src) - for(var/i in 1 to 3) - var/obj/effect/mine/sound/bwoink/mine = new (src) - mine.set_anchored(FALSE) - mine.move_resist = MOVE_RESIST_DEFAULT - if(97) - for(var/i in 1 to 4) - new /obj/item/clothing/mask/balaclava(src) - new /obj/item/gun/ballistic/shotgun/toy(src) - new /obj/item/gun/ballistic/automatic/pistol/toy(src) - new /obj/item/gun/ballistic/automatic/toy(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted(src) - new /obj/item/ammo_box/foambox(src) - if(98) - for(var/i in 1 to 3) - new /mob/living/basic/bee/toxin(src) - if(99) - new /obj/item/implanter/sad_trombone(src) - if(100) - new /obj/item/melee/skateboard/hoverboard(src) - spawned_loot = TRUE diff --git a/code/modules/mining/equipment/grapple_gun.dm b/code/modules/mining/equipment/grapple_gun.dm index 99144d84867..5355fe6bbb6 100644 --- a/code/modules/mining/equipment/grapple_gun.dm +++ b/code/modules/mining/equipment/grapple_gun.dm @@ -61,7 +61,7 @@ attacked_atom = singular_turf break - if(user.CanReach(attacked_atom)) + if(attacked_atom.IsReachableBy(user)) return ITEM_INTERACT_BLOCKING var/atom/bullet = fire_projectile(/obj/projectile/grapple_hook, attacked_atom, 'sound/items/weapons/zipline_fire.ogg') diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm index 4a0069660f2..baf71f5cbe3 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm @@ -208,6 +208,14 @@ SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed) target.apply_damage(combined_damage, BRUTE, blocked = def_check) +/obj/item/kinetic_crusher/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(!istype(interacting_with, /obj/item/crusher_trophy)) + return NONE + var/obj/item/crusher_trophy/new_trophy = interacting_with + if(new_trophy.add_to(src, user)) + return ITEM_INTERACT_SUCCESS + return ITEM_INTERACT_BLOCKING + /obj/item/kinetic_crusher/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED)) balloon_alert(user, "wield it first!") diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm index 0a3e49843de..c2aee514722 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm @@ -25,11 +25,6 @@ SHOULD_CALL_PARENT(FALSE) return "errors" -/obj/item/crusher_trophy/attackby(obj/item/attacking_item, mob/living/user) - if(!istype(attacking_item, /obj/item/kinetic_crusher)) - return ..() - add_to(attacking_item, user) - /// Tries to add the trophy to our crusher /obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/crusher, mob/living/user) for(var/obj/item/crusher_trophy/trophy as anything in crusher.trophies) diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index b52c2dc21d3..a88de7ff035 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -60,9 +60,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/item/stack/marker_beacon/click_alt(mob/living/user) var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) - if(isnull(input_color)) - return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) + if(isnull(input_color) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING picked_color = input_color update_appearance() @@ -154,15 +152,12 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/structure/marker_beacon/click_alt(mob/living/user) var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) - if(isnull(input_color)) + if(isnull(input_color) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) - return NONE picked_color = input_color update_appearance() return CLICK_ACTION_SUCCESS - /* Preset marker beacon types, for mapping */ // Set the icon_state here to make it clear for mappers. diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 00620f1074d..3c24a608262 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -73,6 +73,10 @@ hitsound = 'sound/items/weapons/drill.ogg' desc = "An electric mining drill for the especially scrawny." +/obj/item/pickaxe/drill/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handle + /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" icon_state = "diamonddrill" diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm index 8a9e1166eaa..7a475c7b56e 100644 --- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm +++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm @@ -4,6 +4,8 @@ #define BRIMDUST_STACKS_ON_LIFE 1 /// Number of stacks to add if you activate the item in hand #define BRIMDUST_STACKS_ON_USE 3 +/// Overlay alpha per effect stack +#define BRIMDUST_ALPHA_PER_STACK 75 /** * Gives you three stacks of Brimdust Coating, when you get hit by anything it will make a short ranged explosion. @@ -89,7 +91,8 @@ /atom/movable/screen/alert/status_effect/brimdust_coating name = "Brimdust Coating" desc = "You %STACKS% explosive dust, kinetic impacts will cause it to detonate! \ - The explosion will not harm you as long as you're not under atmospheric pressure." + The explosion will not harm you as long as you're not under atmospheric pressure. \ + Click this alert to shake off the dust." /atom/movable/screen/alert/status_effect/brimdust_coating/MouseEntered(location,control,params) desc = initial(desc) @@ -106,6 +109,21 @@ desc = replacetext(desc, "%STACKS%", dust_amount_string) return ..() +/atom/movable/screen/alert/status_effect/brimdust_coating/Click(location, control, params) + . = ..() + if(!.) + return + if(!owner.can_resist()) + return + owner.balloon_alert(owner, "shaking off the dust...") + var/datum/status_effect/stacking/brimdust_coating/dust = attached_effect + if (!do_after(owner, dust.stacks * 1.5 SECONDS, owner)) + return + dust.explode() + // The effect can get deleted from exploding and reducing stacks + if (!QDELETED(dust)) + qdel(dust) + /datum/status_effect/stacking/brimdust_coating/refresh(effect, stacks_to_add) . = ..() add_stacks(stacks_to_add) @@ -115,6 +133,10 @@ if (stacks == 0) return linked_alert.icon_state = "brimdemon_[stacks]" + if (dust_overlay) + owner.cut_overlay(dust_overlay) + dust_overlay.alpha = stacks * BRIMDUST_ALPHA_PER_STACK + owner.add_overlay(dust_overlay) /datum/status_effect/stacking/brimdust_coating/on_creation(mob/living/new_owner, stacks_to_apply) . = ..() @@ -122,16 +144,19 @@ /datum/status_effect/stacking/brimdust_coating/on_apply() . = ..() - dust_overlay = mutable_appearance('icons/effects/weather_effects.dmi', "ash_storm") + dust_overlay.alpha = stacks * BRIMDUST_ALPHA_PER_STACK + dust_overlay.color = COLOR_RED_LIGHT dust_overlay.blend_mode = BLEND_INSET_OVERLAY owner.add_overlay(dust_overlay) + owner.add_shared_particles(/particles/brimdust) RegisterSignal(owner, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_cleaned)) RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage)) /datum/status_effect/stacking/brimdust_coating/on_remove() . = ..() owner.cut_overlay(dust_overlay) + owner.remove_shared_particles(/particles/brimdust) UnregisterSignal(owner, list(COMSIG_MOB_APPLY_DAMAGE, COMSIG_COMPONENT_CLEAN_ACT)) /// When you are cleaned, wash off the buff @@ -162,14 +187,14 @@ new /obj/effect/temp_visual/explosion/fast(origin_turf) var/damage_dealt = blast_damage - var/list/possible_targets = range(1, origin_turf) - if(lavaland_equipment_pressure_check(origin_turf)) - possible_targets -= owner - else + var/safe_explosion = lavaland_equipment_pressure_check(origin_turf) + if(!safe_explosion) damage_dealt *= pressure_modifier owner.apply_status_effect(/datum/status_effect/brimdust_concussion) - for(var/mob/living/target in possible_targets) + for(var/mob/living/target in range(1, origin_turf) - (safe_explosion ? list(owner, owner.buckled) : null)) + if (safe_explosion && owner.faction_check_atom(target)) + continue var/armor = target.run_armor_check(attack_flag = BOMB) target.apply_damage(damage_dealt, damagetype = BURN, blocked = armor, spread_damage = TRUE) @@ -202,3 +227,4 @@ #undef BRIMDUST_LIFE_APPLY_COOLDOWN #undef BRIMDUST_STACKS_ON_LIFE #undef BRIMDUST_STACKS_ON_USE +#undef BRIMDUST_ALPHA_PER_STACK diff --git a/code/modules/mining/equipment/monster_organs/rush_gland.dm b/code/modules/mining/equipment/monster_organs/rush_gland.dm index 8012286975a..e446296f9d8 100644 --- a/code/modules/mining/equipment/monster_organs/rush_gland.dm +++ b/code/modules/mining/equipment/monster_organs/rush_gland.dm @@ -2,7 +2,7 @@ #define HEALTH_DANGER_ZONE 30 /** - * On use in hand, makes you run really fast for 5 seconds and ignore injury movement decrease. + * On use in hand, makes you run faster for a bit and ignore injury movement decrease. * On use when implanted, run for longer and ignore all negative movement. Automatically triggers if health is low (to escape). */ /obj/item/organ/monster_core/rush_gland @@ -37,13 +37,13 @@ INVOKE_ASYNC(src, PROC_REF(trigger_organ_action)) /** - * Status effect: Makes you run really fast and ignore speed penalties for a short duration. + * Status effect: Makes you run faster and ignore damage speed penalties for a short duration. * If you run into a wall indoors you will fall over and lose the buff. * If you run into someone you both fall over. */ /datum/status_effect/lobster_rush id = "lobster_rush" - duration = 3 SECONDS + duration = 30 SECONDS alert_type = /atom/movable/screen/alert/status_effect/lobster_rush show_duration = TRUE var/spawned_last_move = FALSE @@ -55,50 +55,58 @@ /datum/status_effect/lobster_rush/on_apply() . = ..() - RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(owner, COMSIG_MOVABLE_BUMP, PROC_REF(on_bump)) - owner.add_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) + ADD_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, TRAIT_STATUS_EFFECT(id)) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush) to_chat(owner, span_notice("You feel your blood pumping!")) /datum/status_effect/lobster_rush/on_remove() . = ..() - UnregisterSignal(owner, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_BUMP)) - owner.remove_traits(list(TRAIT_IGNORESLOWDOWN, TRAIT_TENTACLE_IMMUNE), TRAIT_STATUS_EFFECT(id)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_BUMP)) + REMOVE_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, TRAIT_STATUS_EFFECT(id)) owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) to_chat(owner, span_notice("Your pulse returns to normal.")) /// Spawn an afterimage every other step, because every step was too many -/datum/status_effect/lobster_rush/proc/on_move() +/datum/status_effect/lobster_rush/proc/on_move(datum/source, atom/old_loc, dir) SIGNAL_HANDLER + if (!isturf(old_loc) || !isturf(owner.loc)) + return if (!spawned_last_move) - new /obj/effect/temp_visual/decoy/fading(owner.loc, owner) + new /obj/effect/temp_visual/decoy/fading(old_loc, owner, 150) spawned_last_move = !spawned_last_move /datum/status_effect/lobster_rush/proc/on_bump(mob/living/source, atom/target) SIGNAL_HANDLER if (!target.density) return - if (isliving(target)) - source.visible_message(span_warning("[source] crashes into [target]!")) - smack_into(source) - smack_into(target) - qdel(src) - return if (lavaland_equipment_pressure_check(get_turf(source))) return smack_into(source) source.visible_message(span_warning("[source] crashes into [target]!")) + if (isliving(target)) + smack_into(target) qdel(src) /datum/status_effect/lobster_rush/proc/smack_into(mob/living/target) - target.Knockdown(5 SECONDS) - target.apply_damage(40, STAMINA) - target.apply_damage(20, BRUTE, spread_damage = TRUE) + target.Knockdown(2 SECONDS) + target.apply_damage(30, STAMINA) + target.apply_damage(10, BRUTE, spread_damage = TRUE) /// You get a longer buff if you take the time to implant it in yourself /datum/status_effect/lobster_rush/extended - duration = 5 SECONDS + duration = 60 SECONDS + +/datum/status_effect/lobster_rush/extended/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/lobster_rush/extended/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) /// Action used by the rush gland /datum/action/cooldown/monster_core_action/adrenal_boost @@ -106,6 +114,6 @@ desc = "Pump your rush gland to give yourself a boost of speed. \ Impacts with objects can be dangerous under atmospheric pressure." button_icon_state = "lobster_gland_stable" - cooldown_time = 90 SECONDS + cooldown_time = 180 SECONDS #undef HEALTH_DANGER_ZONE diff --git a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm index ec32f5a4d07..6faf813094b 100644 --- a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm +++ b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm @@ -24,39 +24,40 @@ reach = 2 attack_icon = 'icons/effects/effects.dmi' attack_icon_state = "cain_abel_attack" - ///our current combo count + /// Our current combo count var/combo_count = 0 - ///the maximum combo we can reach + /// The maximum combo we can reach var/max_combo = 6 - ///percentage boost we get on every combo + /// Percentage boost we get on every combo var/damage_boost = 1.15 - ///pixel offsets of our wisps - var/static/list/wisp_offsets = list( - list(9, 12), - list(14, 0), - list(9, -12), - list(-9, 12), - list(-14, 0), - list(-9, -12), - ) - ///what throw mode we're using + /// Animation positions used by wisps + var/static/list/animation_steps + /// What throw mode we're using var/throw_mode = THROW_MODE_CRYSTALS - ///flames we have up! + /// Flames we have up! var/list/current_wisps = list() - ///cooldown till we can throw blades again + /// Cooldown till we can throw blades again COOLDOWN_DECLARE(throw_cooldown) /obj/item/cain_and_abel/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = force, force_wielded = force) + if (length(animation_steps)) + return + animation_steps = list( + new /datum/abel_wisp_frame(-18, -2, MOB_LAYER, EASE_OUT, EASE_IN), + new /datum/abel_wisp_frame(-6, -6, ABOVE_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(6, -6, ABOVE_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(18, -2, MOB_LAYER, EASE_OUT, EASE_IN), + new /datum/abel_wisp_frame(6, 2, BELOW_MOB_LAYER, EASE_IN, EASE_OUT), + new /datum/abel_wisp_frame(-6, 2, BELOW_MOB_LAYER, EASE_IN, EASE_OUT), + ) /obj/item/cain_and_abel/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) . = ..() - if(!isliving(old_loc)) - return - - unset_user(old_loc) + if(isliving(old_loc)) + unset_user(old_loc) /obj/item/cain_and_abel/proc/unset_user(mob/living/source) if(HAS_TRAIT(source, TRAIT_RELAYING_ATTACKER)) @@ -65,7 +66,6 @@ set_combo(new_value = 0, user = source) UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED)) - /obj/item/cain_and_abel/equipped(mob/user, slot) . = ..() @@ -92,8 +92,6 @@ for(var/index in 0 to (length(current_wisps) - 1)) addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS) - - set_combo(new_value = 0, user = user) return ITEM_INTERACT_SUCCESS /obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user) @@ -117,29 +115,55 @@ user.balloon_alert(user, "crystals [throw_mode == THROW_MODE_CRYSTALS ? "activated" : "deactivated"]") return TRUE -/obj/item/cain_and_abel/proc/set_combo(new_value, mob/living/user) - combo_count = (new_value <= max_combo) ? new_value : 0 - handle_wisps(user) +/obj/item/cain_and_abel/proc/set_combo(new_value, mob/living/user, instant = FALSE) + new_value = clamp(new_value, 0, max_combo) + if (new_value == combo_count) + return -/obj/item/cain_and_abel/proc/handle_wisps(mob/living/user) - var/should_remove = length(current_wisps) > combo_count - var/wisps_to_alter = abs(combo_count - length(current_wisps)) - - for(var/i = 1, i <= wisps_to_alter, i++) - if(!should_remove) + if (new_value > combo_count) + for (var/i in 1 to new_value - combo_count) add_wisp(user) - continue - var/obj/my_wisp = current_wisps[i] - remove_wisp(my_wisp) + else + for (var/i in 1 to combo_count - new_value) + remove_wisp(current_wisps[i], instant) + + combo_count = new_value /obj/item/cain_and_abel/proc/add_wisp(mob/living/user) var/obj/effect/overlay/blood_wisp/new_wisp = new(src) current_wisps += new_wisp - var/list/position = wisp_offsets[length(current_wisps)] user.vis_contents += new_wisp - new_wisp.pixel_x = position[1] - new_wisp.pixel_y = position[2] RegisterSignal(new_wisp, COMSIG_QDELETING, PROC_REF(on_wisp_delete)) + for (var/wisp_index in 1 to length(current_wisps)) + var/obj/effect/overlay/blood_wisp/wisp = current_wisps[wisp_index] + var/spawn_index = floor(length(animation_steps) / length(current_wisps) * wisp_index) + var/datum/abel_wisp_frame/spawn_position = animation_steps[spawn_index] + + // Latest added wisp is teleported to its spawn position, others animate from their current position + if (wisp_index == length(current_wisps)) + wisp.pixel_w = spawn_position.x + wisp.pixel_z = spawn_position.y + wisp.layer = spawn_position.layer + else + animate(wisp, tag = "wisp_anim_x") + animate(wisp, tag = "wisp_anim_y") + + var/start_index = spawn_index % length(animation_steps) + 1 + var/datum/abel_wisp_frame/position = animation_steps[start_index] + animate(wisp, pixel_w = position.x, layer = position.layer, time = 0.6 SECONDS, loop = -1, tag = "wisp_anim_x") + // We need to animate x and y coordinates separately as they have different easing steps + for (var/frame_index in 1 to length(animation_steps) - 1) + // Get actual index starting from our *next* animation step, not initial position + var/anim_index = (start_index + frame_index - 1) % length(animation_steps) + 1 + position = animation_steps[anim_index] + animate(time = 0.6 SECONDS, pixel_w = position.x, layer = position.layer, easing = SINE_EASING | position.x_easing) + + animate(wisp, time = 0.6 SECONDS, pixel_z = position.y, loop = -1, tag = "wisp_anim_y") + for (var/frame_index in 1 to length(animation_steps) - 1) + // Get actual index starting from our *next* animation step, not initial position + var/anim_index = (start_index + frame_index - 1) % length(animation_steps) + 1 + position = animation_steps[anim_index] + animate(time = 0.6 SECONDS, pixel_z = position.y, easing = SINE_EASING | position.y_easing) /obj/item/cain_and_abel/proc/on_wisp_delete(datum/source) SIGNAL_HANDLER @@ -148,7 +172,27 @@ /obj/item/cain_and_abel/proc/fire_wisp(atom/user, atom/target) user.fire_projectile(/obj/projectile/dagger_wisp, target) + set_combo(combo_count - 1, user, TRUE) -/obj/item/cain_and_abel/proc/remove_wisp(obj/wisp_to_remove) +/obj/item/cain_and_abel/proc/remove_wisp(obj/wisp_to_remove, instant = FALSE) + if (instant) + qdel(wisp_to_remove) + return animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS) QDEL_IN(wisp_to_remove, 0.2 SECONDS) + +/// Frame data for cain & abel wisps so we don't have to make list monstrocities +/datum/abel_wisp_frame + var/x = 0 + var/y = 0 + var/layer = MOB_LAYER + var/x_easing = NONE + var/y_easing = NONE + +/datum/abel_wisp_frame/New(x, y, layer, x_easing, y_easing) + . = ..() + src.x = x + src.y = y + src.layer = layer + src.x_easing = x_easing + src.y_easing = y_easing diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm index d19da3b9569..e3984219bd0 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm @@ -1,6 +1,5 @@ //effect when we're swinging wildly around /obj/effect/temp_visual/dagger_slash - name = "Blood Wisp" mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE @@ -19,10 +18,10 @@ //flames we collect around our body /obj/effect/overlay/blood_wisp + name = "Blood Wisp" mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE - vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE - layer = ABOVE_HUD_PLANE + vis_flags = VIS_INHERIT_PLANE icon = 'icons/effects/effects.dmi' icon_state = "blood_wisp" light_power = 2 diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm index 5d02ebde6f1..cb095c47b27 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm @@ -175,7 +175,7 @@ // consumer.dna.features = list( // FEATURE_MUTANT_COLOR = "#A02720", // FEATURE_TAIL_LIZARD = "Dark Tiger", - // FEATURE_TAIL = "None", + // FEATURE_TAIL_CAT = "None", // FEATURE_SNOUT = "Sharp", // FEATURE_HORNS = "Curled", // FEATURE_EARS = "None", diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm index 940ad9405d3..520502aaf30 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm @@ -75,7 +75,7 @@ /obj/item/hierophant_club/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) // If our target is the beacon and the hierostaff is next to the beacon, we're trying to pick it up. - if (interacting_with == beacon) + if (interacting_with == beacon || !isturf(interacting_with.loc)) return NONE if (!blink_activated) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 54cb5fc6e7d..fb2ae8dd46a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -96,8 +96,8 @@ /obj/structure/closet/crate/necropolis/colossus name = "colossus chest" -/obj/structure/closet/crate/necropolis/colossus/bullet_act(obj/projectile/proj) - if(istype(proj, /obj/projectile/colossus)) +/obj/structure/closet/crate/necropolis/colossus/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(istype(hitting_projectile, /obj/projectile/colossus)) return BULLET_ACT_FORCE_PIERCE return ..() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 6e7340dbac7..159711837e9 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -648,7 +648,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "eldritch coin" desc = "A surprisingly heavy, ornate coin. Its sides seem to depict a different image each time you look." icon_state = "coin_heretic" - custom_materials = list(/datum/material/diamond =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma =HALF_SHEET_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT) sideslist = list("heretic", "blade") heads_name = "heretic" has_action = TRUE @@ -679,17 +679,4 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ continue target_airlock.lock() -/obj/item/coin/eldritch/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) - if(!istype(interacting_with, /obj/machinery/door/airlock)) - return NONE - if(!IS_HERETIC(user)) - user.adjustBruteLoss(5) - user.adjustFireLoss(5) - return ITEM_INTERACT_BLOCKING - var/obj/machinery/door/airlock/target_airlock = interacting_with - to_chat(user, span_warning("You insert [src] into the airlock.")) - target_airlock.emag_act(user, src) - qdel(src) - return ITEM_INTERACT_SUCCESS - #undef ORESTACK_OVERLAYS_MAX diff --git a/code/modules/mob/living/basic/bots/dedbot.dm b/code/modules/mob/living/basic/bots/dedbot.dm index 07d81bcda83..607d788b430 100644 --- a/code/modules/mob/living/basic/bots/dedbot.dm +++ b/code/modules/mob/living/basic/bots/dedbot.dm @@ -109,7 +109,7 @@ /datum/action/cooldown/mob_cooldown/exenterate/proc/slash_em(atom/caster) for(var/mob/living/victim in range(ability_range, caster)) - if(faction_check(victim.faction, immune_factions) && owner.CanReach(victim)) + if(faction_check(victim.faction, immune_factions) && victim.IsReachableBy(owner)) continue to_chat(caster, span_warning("You slice [victim]!")) to_chat(victim, span_warning("You are cut by [caster]'s blades!")) diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index d78f7d66a41..9059e4a5247 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -372,7 +372,7 @@ update_bot_mode(new_mode = BOT_IDLE) return - if(CanReach(patient)) + if(patient.IsReachableBy(src)) melee_attack(patient) /datum/id_trim/medibot diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 2c23f4bb8dc..dde3c9bb77c 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -597,7 +597,7 @@ . = ..() var/list/reachable_turfs = list() for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc)) - if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf)) + if(adjacent_turf == owner.loc || !adjacent_turf.IsReachableBy(owner) || !isopenturf(adjacent_turf)) continue reachable_turfs += adjacent_turf @@ -625,10 +625,10 @@ /datum/action/cooldown/exquisite_bunch/Trigger(mob/clicker, trigger_flags, atom/target) if(activating) return - var/bunch_turf = get_step(owner.loc, owner.dir) + var/atom/bunch_turf = get_step(owner.loc, owner.dir) if(!bunch_turf) return - if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) + if(!bunch_turf.IsReachableBy(owner) || !isopenturf(bunch_turf)) owner.balloon_alert(owner, "can't do that here!") return activating = TRUE diff --git a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm index 0b6e434558e..a29bf295369 100644 --- a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm +++ b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm @@ -36,20 +36,19 @@ smashes_walls = FALSE melee_attack_cooldown = 2 SECONDS -/mob/living/basic/construct/juggernaut/bullet_act(obj/projectile/bullet) - if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) +/mob/living/basic/construct/juggernaut/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(!istype(hitting_projectile, /obj/projectile/energy) && !istype(hitting_projectile, /obj/projectile/beam)) return ..() - if(!prob(40 - round(bullet.damage / 3))) // reflect chance + if(!prob(40 - round(hitting_projectile.damage / 3))) // reflect chance return ..() - apply_damage(bullet.damage * 0.5, bullet.damage_type) + apply_damage(hitting_projectile.damage * 0.5, hitting_projectile.damage_type) visible_message( - span_danger("\The [bullet] is reflected by [src]'s armored shell!"), - span_userdanger("\The [bullet] is reflected by your armored shell!"), + span_danger("\The [hitting_projectile] is reflected by [src]'s armored shell!"), + span_userdanger("\The [hitting_projectile] is reflected by your armored shell!"), ) - bullet.reflect(src) - + hitting_projectile.reflect(src) return BULLET_ACT_FORCE_PIERCE // complete projectile permutation // Alternate juggernaut themes diff --git a/code/modules/mob/living/basic/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm index 6ddaea0e51a..10d7ccc442a 100644 --- a/code/modules/mob/living/basic/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -295,3 +295,6 @@ if(built_in_camera?.can_use()) return TRUE return ..() + +/mob/living/basic/drone/hypnosis_vulnerable() + return FALSE //It obeys its laws diff --git a/code/modules/mob/living/basic/heretic/ash_spirit.dm b/code/modules/mob/living/basic/heretic/ash_spirit.dm index fed64db8adc..61735861524 100644 --- a/code/modules/mob/living/basic/heretic/ash_spirit.dm +++ b/code/modules/mob/living/basic/heretic/ash_spirit.dm @@ -18,6 +18,9 @@ var/static/list/actions_to_add = list( /datum/action/cooldown/spell/fire_sworn, /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, - /datum/action/cooldown/spell/pointed/cleave, ) grant_actions_by_list(actions_to_add) + +/mob/living/basic/heretic_summon/ash_spirit/Life(seconds_per_tick, times_fired) + . = ..() + adjustBruteLoss(-3) // 3 health passively healing diff --git a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm index 6f8c2e5c96f..ca627fd4044 100644 --- a/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm +++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm @@ -33,6 +33,7 @@ ) AddElement(/datum/element/death_drops, loot) GRANT_ACTION(/datum/action/cooldown/spell/jaunt/mirror_walk) + ADD_TRAIT(src, TRAIT_UNHITTABLE_BY_LASERS, INNATE_TRAIT) /mob/living/basic/heretic_summon/maid_in_the_mirror/death(gibbed) var/turf/death_turf = get_turf(src) @@ -50,14 +51,14 @@ return // If we have health, we take some damage - if(health > (maxHealth * 0.125)) + if(health > (maxHealth * 0.02)) visible_message( span_warning("[src] seems to fade in and out slightly."), span_userdanger("[user]'s gaze pierces your every being!"), ) recent_examiner_refs += user_ref - apply_damage(maxHealth * 0.1) // We take 10% of our health as damage upon being examined + apply_damage(maxHealth * 0.02) // We take 2% of our health as damage upon being examined playsound(src, 'sound/effects/ghost2.ogg', 40, TRUE) addtimer(CALLBACK(src, PROC_REF(clear_recent_examiner), user_ref), recent_examine_damage_cooldown, TIMER_DELETE_ME) animate(src, alpha = 120, time = 0.5 SECONDS, easing = ELASTIC_EASING, loop = 2, flags = ANIMATION_PARALLEL) @@ -78,3 +79,10 @@ recent_examiner_refs -= mob_ref heal_overall_damage(5) + +/mob/living/basic/heretic_summon/maid_in_the_mirror/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!. || !isliving(target)) + return + var/mob/living/living_target = target + living_target.apply_status_effect(/datum/status_effect/void_chill, 1) diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index ec28da95352..6ea05af3665 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -35,29 +35,94 @@ mob_size = MOB_SIZE_HUGE layer = LARGE_MOB_LAYER flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + lighting_cutoff_red = 12 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 34 + sight = SEE_TURFS|SEE_MOBS|SEE_OBJS ai_controller = /datum/ai_controller/basic_controller/star_gazer + /// Reference to the mob which summoned us + var/datum/weakref/summoner + /// How far we can go before being pulled back + var/leash_range = 20 + /// Timer for finding a ghost so it doesn't spam dead chat with requests + var/begging_timer + ///---- Abilities given to the star gazer mob + var/list/abilities_to_grant = list( + /datum/action/cooldown/spell/conjure/cosmic_expansion, + /datum/action/cooldown/spell/pointed/projectile/star_blast, + /datum/action/cooldown/recall_stargazer, + /datum/action/cooldown/spell/stargazer_laser, + ) -/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload) +/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload, mob/living/master) . = ..() + for(var/datum/action/cooldown/spell/spell as anything in abilities_to_grant) + spell = new spell(src) + spell.Grant(src) + var/datum/action/cooldown/spell/stargazer_laser/laser = locate() in actions + if(master) + summoner = WEAKREF(master) + if(laser) + laser.our_master = WEAKREF(master) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/effect/temp_visual/cosmic_domain) + AddElement(/datum/element/death_drops, death_loot) AddElement(/datum/element/death_drops, /obj/effect/temp_visual/cosmic_domain) AddElement(/datum/element/death_explosion, 3, 6, 12) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) AddElement(/datum/element/wall_smasher, ENVIRONMENT_SMASH_RWALLS) AddElement(/datum/element/simple_flying) - AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) + AddElement(/datum/element/effect_trail/cosmic_field/antiprojectile, /obj/effect/forcefield/cosmic_field/fast) AddElement(/datum/element/ai_target_damagesource) AddComponent(/datum/component/regenerator, outline_colour = "#b97a5d") ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_LAVA_IMMUNE, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_ASHSTORM_IMMUNE, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) ADD_TRAIT(src, TRAIT_MARTIAL_ARTS_IMMUNE, MEGAFAUNA_TRAIT) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_MAGICALLY_GIFTED, INNATE_TRAIT) set_light(4, l_color = "#dcaa5b") + INVOKE_ASYNC(src, PROC_REF(beg_for_ghost)) + RegisterSignal(src, COMSIG_MOB_GHOSTIZED, PROC_REF(beg_for_ghost)) + +/mob/living/basic/heretic_summon/star_gazer/Destroy() + deltimer(begging_timer) + return ..() + +/// Tries to find a ghost to take control of the mob. If no ghost accepts, ask again in a bit +/mob/living/basic/heretic_summon/star_gazer/proc/beg_for_ghost() + if(timeleft(begging_timer) && !client) + return + begging_timer = addtimer(CALLBACK(src, PROC_REF(beg_for_ghost)), 2 MINUTES, TIMER_STOPPABLE | TIMER_UNIQUE) // Keep begging until someone accepts + var/mob/chosen_ghost = SSpolling.poll_ghost_candidates( + "Do you want to play as an ascended heretic's stargazer?", + check_jobban = ROLE_HERETIC, + poll_time = 20 SECONDS, + ignore_category = POLL_IGNORE_HERETIC_MONSTER, + alert_pic = mutable_appearance('icons/effects/eldritch.dmi', "cosmic_diamond"), + jump_target = src, + role_name_text = "star gazer", + amount_to_pick = 1 + ) + if(chosen_ghost) + PossessByPlayer(chosen_ghost.key) + deltimer(begging_timer) + +/// Connects these two mobs by a leash +/mob/living/basic/heretic_summon/star_gazer/proc/leash_to(atom/movable/leashed, atom/movable/leashed_to) + leashed.AddComponent(\ + /datum/component/leash,\ + owner = leashed_to,\ + distance = leash_range,\ + force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out,\ + force_teleport_in_effect = /obj/effect/temp_visual/guardian/phase,\ + ) // Star gazer attacks everything around itself applies a spooky mark /mob/living/basic/heretic_summon/star_gazer/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + if(target == summoner?.resolve()) + return FALSE . = ..() if (!. || !isliving(target)) return @@ -74,6 +139,261 @@ do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) log_combat(src, nearby_mob, "slashed") +/datum/action/cooldown/recall_stargazer + name = "Seek master" + desc = "Teleports you to your master" + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "stargazer_menu" + check_flags = NONE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/recall_stargazer/Activate(atom/target) + var/mob/living/basic/heretic_summon/star_gazer/real_owner = owner + var/mob/living/master = real_owner.summoner?.resolve() + if(!master) + return FALSE + do_teleport(owner, master, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE) + StartCooldown() + return TRUE + +/datum/action/cooldown/spell/stargazer_laser + name = "Star Gaze" + desc = "Generates a massive death beam that eradicates everything in it's path. \ + Has it's own gravitational pull, sucking in new victims." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "gazer_beam_charge" + check_flags = NONE + cooldown_time = 30 SECONDS + invocation = "SH''P D' W''P" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + /// list of turfs we are hitting while shooting our beam + var/list/turf/targets + /// The laser beam we generate + var/datum/beam/giga_laser + /// Timer that handles the damage ticking + var/damage_timer + /// Reference to our summoner so that we don't disintegrate them by accident + var/datum/weakref/our_master + /// The overlay on the caster when they fire the beam + var/obj/effect/abstract/gazer_orb/orb_visual + /// The visual effect at the beginning of the laser + var/obj/effect/abstract/gazer_beam/beam_visual + /// List of visual effects for the beam, in between and in the end + var/list/beam_fillings + /// Sound loop for the active laser + var/datum/looping_sound/gazer_beam/sound_loop + /// The visual effect at the end of the laser + var/obj/effect/abstract/gazer_beamend/end_visual + /// Tracks how many times the beam has processed, after the maximum amount of cycles it will forcibly end the beam + var/cycle_tracker = 0 + +/datum/action/cooldown/spell/stargazer_laser/cast(atom/target) + . = ..() + + cooldown_time = initial(cooldown_time) + if(damage_timer) + stop_beaming() + + var/turf/check_turf = get_step(owner, owner.dir) + var/list/turf/targets_left = list() + targets_left += get_step(check_turf, turn(owner.dir, 90)) + var/list/turf/targets_right = list() + targets_right += get_step(check_turf, turn(owner.dir, -90)) + LAZYINITLIST(targets) + while(check_turf && length(targets) < 20) + targets += check_turf + check_turf = get_step(check_turf, owner.dir) + targets_left += get_step(check_turf, turn(owner.dir, 90)) + targets_right += get_step(check_turf, turn(owner.dir, -90)) + if(!LAZYLEN(targets)) + return + + RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_DIR_CHANGE), PROC_REF(stop_beaming)) + beam_fillings = list() + cycle_tracker = 0 + orb_visual = new(get_step(owner, owner.dir)) + var/beam_timer = addtimer(CALLBACK(src, PROC_REF(open_laser), owner, targets), 2.2 SECONDS, TIMER_STOPPABLE) + playsound(owner, 'sound/mobs/non-humanoids/stargazer/beam_open.ogg', 50, FALSE) + if(!do_after(owner, 3 SECONDS, owner)) + cooldown_time = 1 SECONDS + deltimer(beam_timer) + QDEL_NULL(orb_visual) + QDEL_NULL(beam_visual) + QDEL_NULL(end_visual) + for(var/atom/to_delete as anything in beam_fillings) + QDEL_NULL(to_delete) + targets = null + return + + sound_loop.start(owner) + QDEL_NULL(orb_visual) + beam_visual.icon_state = "gazer_beam_active" + beam_visual.update_appearance(UPDATE_ICON) + end_visual.icon_state = "gazer_beam_end" + end_visual.update_appearance(UPDATE_ICON) + targets += targets_left + targets += targets_right + process_beam() + +/datum/action/cooldown/spell/stargazer_laser/Destroy() + QDEL_NULL(sound_loop) + return ..() + +/datum/action/cooldown/spell/stargazer_laser/New(Target, original) + . = ..() + sound_loop = new + +/// Spawns the beginning of the laser, uses `targets` to determine the rotation +/datum/action/cooldown/spell/stargazer_laser/proc/open_laser(mob/owner, list/turf/targets) + beam_visual = new(get_step(get_step(owner, owner.dir), owner.dir), targets[length(targets)]) + end_visual = new(targets[length(targets)], owner) + for(var/turf/to_fill as anything in (get_line(targets[4], targets[length(targets)-2]))) + var/obj/effect/abstract/gazer_beam_filling/new_filling = new(to_fill, owner.dir) + beam_fillings += new_filling + +// Visual effect of the big orb when you start channeling the laser +/obj/effect/abstract/gazer_orb + icon = 'icons/effects/160x160.dmi' + icon_state = "gazer_beam_charge" + SET_BASE_VISUAL_PIXEL(-64, -64) + +// Visual effect at the start of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beam + icon = 'icons/effects/beam96x96.dmi' + SET_BASE_VISUAL_PIXEL(-32, -32) + +/obj/effect/abstract/gazer_beam/Initialize(mapload, turf/target) + . = ..() + if(!target) + return INITIALIZE_HINT_QDEL + var/Angle = get_angle_raw(x, y, pixel_x, pixel_y, target.x , target.y, target.pixel_x, target.pixel_y) + var/matrix/transform_matrix = matrix() + Angle = round(Angle, 45) + transform_matrix.Turn(Angle-90) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_start", src) + +// Visual effect of the middle of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beam_filling + icon = 'icons/effects/beam.dmi' + icon_state = "gazer_beam" + +/obj/effect/abstract/gazer_beam_filling/Initialize(mapload, direction) + . = ..() + if(!direction) + return INITIALIZE_HINT_QDEL + var/Angle = dir2angle(direction) + var/matrix/transform_matrix = matrix() + transform_matrix.Turn(Angle) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_end_opening", src) + +/obj/effect/abstract/gazer_beam_filling/proc/pull_victims() + for(var/atom/movable/movable_atom in orange(5, src)) + if((movable_atom.anchored || movable_atom.move_resist >= MOVE_FORCE_EXTREMELY_STRONG)) + continue + if(ismob(movable_atom)) + var/mob/pulled_mob = movable_atom + if(pulled_mob.mob_negates_gravity()) + continue + step_towards(movable_atom, src) + +// Visual effect at the end of the beam, has an opening/active/closing state +/obj/effect/abstract/gazer_beamend + icon = 'icons/effects/beam.dmi' + +/obj/effect/abstract/gazer_beamend/Initialize(mapload, atom/origin) + . = ..() + if(!origin) + return INITIALIZE_HINT_QDEL + var/Angle = get_angle_raw(origin.x , origin.y, origin.pixel_x, origin.pixel_y, x, y, pixel_x, pixel_y) + var/matrix/transform_matrix = matrix() + Angle = round(Angle, 45) + transform_matrix.Turn(Angle) + transform_matrix.Scale(2, 2) + transform = transform_matrix + flick("gazer_beam_end_opening", src) + +/datum/looping_sound/gazer_beam + mid_sounds = list('sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg') + mid_length = 109 + volume = 80 + +/obj/effect/ebeam/phase_in // Beam subtype that has a "windup" phase + alpha = 0 + +/obj/effect/ebeam/phase_in/Initialize(mapload) + . = ..() + animate(src, 2 SECONDS, alpha = 255, transform = matrix(3, 1, MATRIX_SCALE)) + +/obj/effect/ebeam/phased_in/Initialize(mapload, beam_owner) // phased in, fully powered laser + . = ..() + transform = matrix(2, 2, MATRIX_SCALE) + +/// Recursive proc which affects whatever is caught within the beam +/datum/action/cooldown/spell/stargazer_laser/proc/process_beam() + if(cycle_tracker > 33) + stop_beaming() + for(var/obj/effect/abstract/gazer_beam_filling/fillings as anything in beam_fillings) + if(prob(98)) + continue + // 2% chance to pull you towards the beam + fillings.pull_victims() + for(var/turf/target as anything in targets) + if(iswallturf(target)) + var/turf/closed/wall/wall_target = target + wall_target.dismantle_wall(devastated = TRUE) + continue + if(isfloorturf(target)) + var/turf/open/floor/to_burn = target + to_burn.burn_tile() + for(var/victim in target) + if(isobj(victim)) + var/obj/to_obliterate = victim + if(to_obliterate.resistance_flags & INDESTRUCTIBLE) + continue + to_obliterate.atom_destruction(FIRE) + if(isliving(victim)) + if(victim == our_master?.resolve()) + continue + var/mob/living/living_victim = victim + if(living_victim.stat > CONSCIOUS) + playsound(living_victim, 'sound/effects/supermatter.ogg', 80, TRUE) + living_victim.visible_message( + span_danger("You see [living_victim] engulfed in the scorching wrath of the cosmos. \ + For a moment, you see their silhouette flail in agony before fading to mere atoms."), + span_boldbig(span_hypnophrase("THE POWER OF THE COSMOS ITSELF POURS OUT OVER YOUR FORM. \ + WAVES OF HEAT LATCH ONTO YOUR BODY, PULLING IT APART AT THE SEAMS. \ + YOUR TOTAL ANNIHILATION TAKES ONLY A MOMENT BEFORE YOU ARE REDUCED BACK TO WHAT YOU ALWAYS WERE. \ + MOTES OF MERE DUST...")) + ) + living_victim.dust() + living_victim.emote("scream") + living_victim.apply_status_effect(/datum/status_effect/star_mark) + living_victim.apply_damage(damage = 30, damagetype = BURN, spread_damage = TRUE) + cycle_tracker++ + damage_timer = addtimer(CALLBACK(src, PROC_REF(process_beam)), 0.3 SECONDS, TIMER_STOPPABLE) + +/// Stops the beam after we cancel it +/datum/action/cooldown/spell/stargazer_laser/proc/stop_beaming() + SIGNAL_HANDLER + sound_loop.stop() + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_ATOM_DIR_CHANGE)) + QDEL_NULL(giga_laser) + QDEL_NULL(beam_visual) + QDEL_NULL(end_visual) + QDEL_LIST(beam_fillings) + deltimer(damage_timer) + damage_timer = null + targets = null + /datum/ai_controller/basic_controller/star_gazer blackboard = list( BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index d52cc1742c7..9a531a7bb45 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -83,7 +83,7 @@ if(stat != CONSCIOUS) return COMPONENT_BULLET_PIERCED - ///high penetration bullets should still go through. No goldgrub can save you from the colossus' death bolts. + /// High penetration bullets should still go through. No goldgrub can save you from the colossus' death bolts. if(prob(hitting_projectile.armour_penetration)) return NONE @@ -94,6 +94,7 @@ playsound(src, 'sound/effects/splat.ogg', 50, TRUE) for(var/obj/item/stack/ore/ore in src) ore.forceMove(loc) + if(!gibbed) visible_message(span_danger("[src] spits out its consumed ores!")) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm index 68a31816fd4..63842f05ef5 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -112,7 +112,7 @@ /datum/ai_behavior/goliath_dig/perform(seconds_per_tick, datum/ai_controller/controller, target_key) var/turf/target_turf = controller.blackboard[target_key] var/mob/living/basic/basic_mob = controller.pawn - if(!basic_mob.CanReach(target_turf)) + if(!target_turf.IsReachableBy(basic_mob)) return AI_BEHAVIOR_DELAY basic_mob.melee_attack(target_turf) return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm index 44f84da8fa7..ae9fd3d3de2 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm @@ -37,7 +37,7 @@ var/times_to_attack = 4 /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/Activate(atom/target) - if(owner.CanReach(target)) + if(target.IsReachableBy(owner)) attack_combo(target) StartCooldown() return TRUE @@ -74,14 +74,14 @@ owner.throw_at(target = final_turf, range = 7, speed = 1, spin = FALSE, callback = CALLBACK(src, PROC_REF(attack_combo), target)) /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_combo(atom/target) - if(!owner.CanReach(target)) + if(!target.IsReachableBy(owner)) return FALSE for(var/i in 0 to (times_to_attack - 1)) addtimer(CALLBACK(src, PROC_REF(attack_target), target), i * attack_interval) /datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_target(atom/target) - if(!owner.CanReach(target) || owner.stat == DEAD) + if(!target.IsReachableBy(owner) || owner.stat == DEAD) return var/mob/living/basic/basic_owner = owner basic_owner.melee_attack(target, ignore_cooldown = TRUE) diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm index 576cc24cf82..174180cec33 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm @@ -299,8 +299,7 @@ GLOBAL_LIST_EMPTY(raptor_population) icon_dead = "raptor_black_dead" maxHealth = 400 health = 400 - speed = 1 - ridable_component = /datum/component/riding/creature/raptor/fast + speed = 1.5 melee_damage_lower = 20 melee_damage_upper = 25 raptor_color = RAPTOR_BLACK @@ -312,8 +311,7 @@ GLOBAL_LIST_EMPTY(raptor_population) icon_state = "raptor_yellow" icon_living = "raptor_yellow" icon_dead = "raptor_yellow_dead" - ridable_component = /datum/component/riding/creature/raptor/fast - speed = 1 + speed = 1.5 raptor_color = RAPTOR_YELLOW dex_description = "This breed possesses greasy fast speed, DEMON speed, making light work of long pilgrimages. It's said that a thunderclap could be heard when this breed reaches its maximum speed." child_path = /mob/living/basic/raptor/baby_raptor/yellow diff --git a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm index cd1439b3c5f..e7224e29d87 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/raptor_dex.dm @@ -21,7 +21,7 @@ var/list/data = list() var/mob/living/basic/raptor/my_raptor = raptor.resolve() - data["raptor_image"] = icon2base64(getFlatIcon(image(icon = my_raptor.icon, icon_state = my_raptor.icon_state))) + data["raptor_image"] = icon2base64(icon(icon = my_raptor.icon, icon_state = my_raptor.icon_state, frame = 1)) data["raptor_attack"] = my_raptor.melee_damage_lower data["raptor_health"] = my_raptor.maxHealth data["raptor_speed"] = my_raptor.speed @@ -33,7 +33,7 @@ var/obj/effect/overlay/happiness_overlay/display = new display.set_hearts(happiness_percentage) display.pixel_y = ICON_SIZE_Y * 0.5 - data["raptor_happiness"] = icon2base64(getFlatIcon(display)) + data["raptor_happiness"] = icon2base64(getFlatIcon(display, no_anim = TRUE)) qdel(display) var/datum/raptor_inheritance/inherit = my_raptor.inherited_stats diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 33271e7dec8..4501d83caae 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -165,7 +165,7 @@ /mob/living/basic/mining_drone/ui_static_data(mob/user) var/list/data = list() - data["bot_icon"] = icon2base64(getFlatIcon(src)) + data["bot_icon"] = icon2base64(getFlatIcon(src, no_anim = TRUE)) data["possible_colors"] = list() for(var/color in possible_colors) data["possible_colors"] += list(list( diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index b2bd8e47976..f0c7a1d5f54 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -292,7 +292,7 @@ possible_headwear += item if(!length(possible_headwear)) for(var/obj/item/item in orange(1)) - if(ispath(item.dog_fashion, /datum/dog_fashion/head) && CanReach(item)) + if(ispath(item.dog_fashion, /datum/dog_fashion/head) && item.IsReachableBy(src)) possible_headwear += item if(!length(possible_headwear)) return diff --git a/code/modules/mob/living/basic/pets/pet_designer.dm b/code/modules/mob/living/basic/pets/pet_designer.dm index 988fee66038..dd2096ec36b 100644 --- a/code/modules/mob/living/basic/pets/pet_designer.dm +++ b/code/modules/mob/living/basic/pets/pet_designer.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(pet_options, list( for(var/color in possible_colors) demo_carrier.set_greyscale(possible_colors[color]) - list_to_return[color] = icon2base64(getFlatIcon(demo_carrier)) + list_to_return[color] = icon2base64(getFlatIcon(demo_carrier, no_anim = TRUE)) qdel(demo_carrier) return list_to_return diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index 610db57f1c0..918ea15206a 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -85,7 +85,7 @@ for(var/atom/movable/movable in orange(victim, 1)) if(movable == victim) continue - if(!victim.CanReach(movable) || movable.invisibility > victim.see_invisible) + if(!movable.IsReachableBy(victim) || movable.invisibility > victim.see_invisible) continue candidates += movable if(!length(candidates)) diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index 8d417ccae7c..cfdf6840ff2 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -65,7 +65,7 @@ /mob/living/basic/ghost/proc/give_identity() if(random_identity) ghost_hairstyle = random_hairstyle() //This only gives us the hairstyle name, not the icon_state (which we need). - ghost_hair_color = "#[random_color()]" + ghost_hair_color = random_hair_color() if(prob(50)) //Only a chance at also getting facial hair ghost_facial_hairstyle = random_facial_hairstyle() diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm index 0739a9c1b4e..71eebf9d42c 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm @@ -299,7 +299,7 @@ /mob/living/basic/revenant/narsie_act() return //most humans will now be either bones or harvesters, but we're still un-alive. -/mob/living/basic/revenant/bullet_act() +/mob/living/basic/revenant/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(!HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) || dormant) return BULLET_ACT_FORCE_PIERCE return ..() diff --git a/code/modules/mob/living/basic/trooper/syndicate.dm b/code/modules/mob/living/basic/trooper/syndicate.dm index 37a81219152..ff5bf51725a 100644 --- a/code/modules/mob/living/basic/trooper/syndicate.dm +++ b/code/modules/mob/living/basic/trooper/syndicate.dm @@ -37,9 +37,9 @@ r_hand = /obj/item/knife/combat/survival var/projectile_deflect_chance = 0 -/mob/living/basic/trooper/syndicate/melee/bullet_act(obj/projectile/projectile) +/mob/living/basic/trooper/syndicate/melee/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(prob(projectile_deflect_chance)) - visible_message(span_danger("[src] blocks [projectile] with its shield!")) + visible_message(span_danger("[src] blocks [hitting_projectile] with its shield!")) return BULLET_ACT_BLOCK return ..() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 8d2dd60bea0..1990112411a 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -272,12 +272,12 @@ trauma_desc = conditional_tooltip("Deep-rooted ", "Repair via Lobotomy.", add_tooltips) if(TRAUMA_RESILIENCE_WOUND) trauma_desc = conditional_tooltip("Fracture-derived ", "Repair via treatment of wounds afflicting the head.", add_tooltips) - // BUBBER EDIT CHANGE BEGIN - Blessed Lobotomy if(TRAUMA_RESILIENCE_MAGIC) + // BUBBER EDIT CHANGE BEGIN - Blessed lobotomy trauma_desc = conditional_tooltip("Soul-bound ", "Repair via Blessed Lobotomy.", add_tooltips) + // BUBBER EDIT CHANGE END - Blessed lobotomy if(TRAUMA_RESILIENCE_ABSOLUTE) trauma_desc = conditional_tooltip("Permanent ", "Irreparable under normal circumstances.", add_tooltips) - // BUBBER EDIT CHANGE FINISH trauma_desc += capitalize(trauma.scan_desc) LAZYADD(trauma_text, trauma_desc) if(LAZYLEN(trauma_text)) @@ -340,6 +340,8 @@ return ..() /obj/item/organ/brain/on_life(seconds_per_tick, times_fired) + if(HAS_TRAIT(src, TRAIT_BRAIN_DAMAGE_NODEATH)) + return if(damage >= BRAIN_DAMAGE_DEATH) //rip to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out...")) owner.investigate_log("has been killed by brain damage.", INVESTIGATE_DEATHS) @@ -543,6 +545,9 @@ . += BT /obj/item/organ/brain/proc/can_gain_trauma(datum/brain_trauma/trauma, resilience, natural_gain = FALSE) + if(HAS_TRAIT(src, TRAIT_BRAIN_TRAUMA_IMMUNITY)) + return FALSE + if(!ispath(trauma)) trauma = trauma.type if(!initial(trauma.can_gain)) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 40a54828940..8e5a7296786 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -77,10 +77,8 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/click_alt(mob/living/user) var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, max_length = MAX_NAME_LEN) - if(isnull(input_seed)) + if(isnull(input_seed) || !user.can_perform_action(src)) return CLICK_ACTION_BLOCKING - if(!user.can_perform_action(src)) - return to_chat(user, span_notice("You set the personality seed to \"[input_seed]\".")) ask_role = input_seed update_appearance() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index b8d24e1996b..10f581ffa24 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -263,13 +263,12 @@ // chest maybe because getting slammed in the chest would knock it off your face while dead AddComponent(/datum/component/knockoff, knockoff_chance = 40, target_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST), slots_knockoffable = slot_flags) -/obj/item/clothing/mask/facehugger/allow_attack_hand_drop(mob/living/carbon/human/user) - if(!real || sterile || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) +/obj/item/clothing/mask/facehugger/can_mob_unequip(mob/user) + if(!real || sterile || stat == DEAD || user.get_organ_by_type(/obj/item/organ/body_egg/alien_embryo)) return ..() - if(istype(user) && ishuman(loc) && stat != DEAD) - if(user == loc && user.get_item_by_slot(slot_flags) == src) - to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) - return FALSE + if(user.get_item_by_slot(slot_flags) == src) + to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) + return FALSE return ..() /obj/item/clothing/mask/facehugger/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7786c20e67c..51d1f668a8e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1090,18 +1090,6 @@ /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() -/mob/living/carbon/proc/hypnosis_vulnerable() - if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE)) - return FALSE - if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess)) - return TRUE - if(IsSleeping() || IsUnconscious()) - return TRUE - if(HAS_TRAIT(src, TRAIT_DUMB)) - return TRUE - if(mob_mood.sanity < SANITY_UNSTABLE) - return TRUE - /mob/living/carbon/wash(clean_types) . = ..() // Wash equipped stuff that cannot be covered diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 18c5b58edd2..50b4bec3c76 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -85,6 +85,12 @@ return ..() /mob/living/carbon/send_item_attack_message(obj/item/weapon, mob/living/user, hit_area, def_zone) + // In the future replace these with parent call if the item attack message proc is ever unshittified + if(SEND_SIGNAL(weapon, COMSIG_SEND_ITEM_ATTACK_MESSAGE_OBJECT, src, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(SEND_SIGNAL(src, COMSIG_SEND_ITEM_ATTACK_MESSAGE_CARBON, weapon, user) & SIGNAL_MESSAGE_MODIFIED) + return TRUE + if(!weapon.force && !length(weapon.attack_verb_simple) && !length(weapon.attack_verb_continuous)) return var/obj/item/bodypart/hit_bodypart = get_bodypart(def_zone) diff --git a/code/modules/mob/living/carbon/carbon_stripping.dm b/code/modules/mob/living/carbon/carbon_stripping.dm index 054444c4815..66f2b8b6b99 100644 --- a/code/modules/mob/living/carbon/carbon_stripping.dm +++ b/code/modules/mob/living/carbon/carbon_stripping.dm @@ -6,14 +6,15 @@ key = STRIPPABLE_ITEM_BACK item_slot = ITEM_SLOT_BACK -/datum/strippable_item/mob_item_slot/back/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/back/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/back/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/mask key = STRIPPABLE_ITEM_MASK diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index d49952521cc..72ca6d302a4 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -106,6 +106,19 @@ return FALSE return ..() +/datum/emote/living/carbon/mchitter + key = "chitter" + key_third_person = "chitters" + message = "chitters!" + message_mime = "chitters silently?" + sound = 'sound/mobs/humanoids/moth/moth_chitter.ogg' + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + +/datum/emote/living/carbon/mchitter/can_run_emote(mob/living/carbon/user, status_check, intentional, params) + if(!ismoth(user)) + return FALSE + return ..() + /datum/emote/living/carbon/moan key = "moan" key_third_person = "moans" @@ -113,6 +126,19 @@ message_mime = "appears to moan!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE +/datum/emote/living/carbon/msqueak + key = "squeak" + key_third_person = "squeaks" + message = "squeaks!" + message_mime = "squeaks silently?" + sound = 'sound/mobs/humanoids/moth/moth_squeak.ogg' + emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + +/datum/emote/living/carbon/msqueak/can_run_emote(mob/living/carbon/user, status_check, intentional, params) + if(!ismoth(user)) + return FALSE + return ..() + /datum/emote/living/carbon/noogie key = "noogie" key_third_person = "noogies" diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 4829759c91f..b7bc0c0fa72 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -629,7 +629,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/list/new_features = list() var/static/list/organs_to_randomize = list() - for(var/obj/item/organ/organ_path as anything in mutant_organs) + for(var/obj/item/organ/organ_path as anything in get_organs()) if(!organ_path.bodypart_overlay) continue var/overlay_path = initial(organ_path.bodypart_overlay) @@ -1512,22 +1512,18 @@ GLOBAL_LIST_EMPTY(features_by_species) return cached_features var/list/features = list() + var/list/mut_organs = get_organs() for (var/preference_type in GLOB.preference_entries) var/datum/preference/preference = GLOB.preference_entries[preference_type] if ( \ (preference.relevant_inherent_trait in inherent_traits) \ - || (preference.relevant_external_organ in get_mut_organs()) \ + || (preference.relevant_organ in mut_organs) \ || (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \ || (preference.relevant_body_markings in body_markings) \ ) features += preference.savefile_key - for (var/obj/item/organ/organ_type as anything in mutant_organs) - var/preference = initial(organ_type.preference) - if (!isnull(preference)) - features += preference - GLOB.features_by_species[type] = features return features @@ -1574,7 +1570,8 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/get_hiss_sound(mob/living/carbon/human/human) return -/datum/species/proc/get_mut_organs(include_brain = TRUE) +/// Returns a list of all organ typepaths this species probably has +/datum/species/proc/get_organs(include_brain = TRUE) var/list/mut_organs = list() mut_organs += mutant_organs if (include_brain) @@ -1591,7 +1588,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return mut_organs /datum/species/proc/get_types_to_preload() - return get_mut_organs(FALSE) + return get_organs(FALSE) /* /datum/species/proc/get_mut_organs(include_brain = TRUE) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 2623385d21c..2d181758915 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -122,7 +122,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features[FEATURE_MOTH_WINGS] = get_consistent_feature_entry(SSaccessories.moth_wings_list) target.dna.features[FEATURE_SNOUT] = get_consistent_feature_entry(SSaccessories.snouts_list) target.dna.features[FEATURE_SPINES] = get_consistent_feature_entry(SSaccessories.spines_list) - target.dna.features[FEATURE_TAIL] = get_consistent_feature_entry(SSaccessories.tails_list_felinid) // it's a lie + target.dna.features[FEATURE_TAIL_CAT] = get_consistent_feature_entry(SSaccessories.tails_list_felinid) // it's a lie target.dna.features[FEATURE_TAIL_LIZARD] = get_consistent_feature_entry(SSaccessories.tails_list_lizard) target.dna.features[FEATURE_TAIL_MONKEY] = get_consistent_feature_entry(SSaccessories.tails_list_monkey) target.dna.features[FEATURE_TAIL_FISH] = get_consistent_feature_entry(SSaccessories.tails_list_fish) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 54bbe948c71..64f828d7231 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -57,37 +57,17 @@ message_mime = "mumbles silently!" emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE -/datum/emote/living/carbon/human/scream - key = "scream" - key_third_person = "screams" - message = "screams!" - message_mime = "acts out a scream!" - emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE - specific_emote_audio_cooldown = 10 SECONDS - vary = TRUE - -/datum/emote/living/carbon/human/scream/can_run_emote(mob/user, status_check = TRUE , intentional, params) - if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) - return FALSE - return ..() - -/datum/emote/living/carbon/human/scream/get_sound(mob/living/carbon/human/user) - if(!istype(user)) - return - return user.dna.species.get_scream_sound(user) - -/datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream. +/datum/emote/living/carbon/human/screech // basically scream 2.0 key = "screech" key_third_person = "screeches" message = "screeches!" message_mime = "screeches silently." emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE + specific_emote_audio_cooldown = 10 SECONDS vary = FALSE -/datum/emote/living/carbon/human/scream/screech/should_play_sound(mob/user, intentional) - if(ismonkey(user)) - return TRUE - return ..() +/datum/emote/living/carbon/human/screech/get_sound(mob/living/carbon/human/user) + return user.dna.species.get_scream_sound(user) /datum/emote/living/carbon/human/pale key = "pale" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 230737bbfbb..a9747075efb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -39,30 +39,31 @@ covering_part += equipped return covering_part -/mob/living/carbon/human/bullet_act(obj/projectile/bullet, def_zone, piercing_hit = FALSE) - if(bullet.firer == src && bullet.original == src) //can't block or reflect when shooting yourself +/mob/living/carbon/human/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(hitting_projectile.firer == src && hitting_projectile.original == src) //can't block or reflect when shooting yourself return ..() - if(bullet.reflectable) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message( - span_danger("\The [bullet] gets reflected by [src]!"), - span_userdanger("\The [bullet] gets reflected by [src]!"), - ) - // Finds and plays the block_sound of item which reflected - for(var/obj/item/held_item in held_items) - if(held_item.IsReflect(def_zone)) - playsound(src, held_item.block_sound, BLOCK_SOUND_VOLUME, TRUE) - // Find a turf near or on the original location to bounce to - if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit - return loc.projectile_hit(bullet, def_zone, piercing_hit) - bullet.reflect(src) - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + // The projectile cannot be reflected or you failed to pass a reflection% check + if (!hitting_projectile.reflectable || !check_reflect(def_zone)) + return ..() + visible_message( + span_danger("\The [hitting_projectile] gets reflected by [src]!"), + span_userdanger("\The [hitting_projectile] gets reflected by [src]!"), + ) + // Finds and plays the block_sound of item which reflected + for(var/obj/item/held_item in held_items) + if(held_item.IsReflect(def_zone)) + playsound(src, held_item.block_sound, BLOCK_SOUND_VOLUME, TRUE) + // Find a turf near or on the original location to bounce to + if(!isturf(loc)) // Open canopy mech (ripley) check. if we're inside something and still got hit + return loc.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) + hitting_projectile.reflect(src) + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + +/mob/living/carbon/human/bullet_act(obj/projectile/bullet, def_zone, piercing_hit, blocked) if(check_block(bullet, bullet.damage, "\the [bullet]", PROJECTILE_ATTACK, bullet.armour_penetration, bullet.damage_type)) - bullet.on_hit(src, 100, def_zone, piercing_hit) - return BULLET_ACT_HIT - + return ..(bullet, def_zone, piercing_hit, 100) return ..() ///Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index 6b94c681bf1..8a768a83d82 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -45,25 +45,23 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_JUMPSUIT item_slot = ITEM_SLOT_ICLOTHING -/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_actions(atom/source, mob/user) - var/obj/item/clothing/under/jumpsuit = get_item(source) +/datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + var/obj/item/clothing/under/jumpsuit = item if (!istype(jumpsuit)) - return null + return - var/list/actions = list() if(jumpsuit.has_sensor == HAS_SENSORS) - actions += "adjust_sensor" + . += "adjust_sensor" if(jumpsuit.can_adjust) - actions += "adjust_jumpsuit" + . += "adjust_jumpsuit" if(length(jumpsuit.attached_accessories)) - actions += "strip_accessory" + . += "strip_accessory" - return actions - -/datum/strippable_item/mob_item_slot/jumpsuit/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/jumpsuit/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if (!..()) return - var/obj/item/clothing/under/jumpsuit = get_item(source) + var/obj/item/clothing/under/jumpsuit = item if (!istype(jumpsuit)) return null @@ -168,24 +166,25 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_FEET item_slot = ITEM_SLOT_FEET -/datum/strippable_item/mob_item_slot/feet/get_alternate_actions(atom/source, mob/user) - var/obj/item/clothing/shoes/shoes = get_item(source) +/datum/strippable_item/mob_item_slot/feet/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + var/obj/item/clothing/shoes/shoes = item if (!istype(shoes) || shoes.fastening_type == SHOES_SLIPON) - return null + return switch (shoes.tied) if (SHOES_UNTIED) - return list("knot") + . += "knot" if (SHOES_TIED) - return list("untie") + . += "untie" if (SHOES_KNOTTED) - return list("unknot") + . += "unknot" -/datum/strippable_item/mob_item_slot/feet/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/feet/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - var/obj/item/clothing/shoes/shoes = get_item(source) + var/obj/item/clothing/shoes/shoes = item if (!istype(shoes)) return switch(action_key) @@ -198,14 +197,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_SUIT_STORAGE item_slot = ITEM_SLOT_SUITSTORE -/datum/strippable_item/mob_item_slot/suit_storage/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/suit_storage/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/suit_storage/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/suit_storage/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if(!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/id key = STRIPPABLE_ITEM_ID @@ -216,14 +216,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( key = STRIPPABLE_ITEM_BELT item_slot = ITEM_SLOT_BELT -/datum/strippable_item/mob_item_slot/belt/get_alternate_actions(atom/source, mob/user) - return get_strippable_alternate_action_internals(get_item(source), source) +/datum/strippable_item/mob_item_slot/belt/get_alternate_actions(atom/source, mob/user, obj/item/item) + . = ..() + . += get_strippable_alternate_action_internals(item, source) -/datum/strippable_item/mob_item_slot/belt/perform_alternate_action(atom/source, mob/user, action_key) +/datum/strippable_item/mob_item_slot/belt/perform_alternate_action(atom/source, mob/user, action_key, obj/item/item) if (!..()) return - if(action_key in get_strippable_alternate_action_internals(get_item(source), source)) - strippable_alternate_action_internals(get_item(source), source, user) + if(action_key in get_strippable_alternate_action_internals(item, source)) + strippable_alternate_action_internals(item, source, user) /datum/strippable_item/mob_item_slot/pocket /// Which pocket we're referencing. Used for visible text. diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 827716b91a6..610743a474a 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -5,7 +5,7 @@ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DWARF), SIGNAL_REMOVETRAIT(TRAIT_DWARF)), PROC_REF(on_dwarf_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_TOO_TALL), SIGNAL_REMOVETRAIT(TRAIT_TOO_TALL)), PROC_REF(on_tootall_trait)) - RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT)), PROC_REF(on_fat)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FAT), SIGNAL_REMOVETRAIT(TRAIT_FAT), SIGNAL_ADDTRAIT(TRAIT_FAT_IGNORE_SLOWDOWN), SIGNAL_REMOVETRAIT(TRAIT_FAT_IGNORE_SLOWDOWN)), PROC_REF(on_fat)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NOHUNGER), SIGNAL_REMOVETRAIT(TRAIT_NOHUNGER)), PROC_REF(on_nohunger)) RegisterSignal(src, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, PROC_REF(check_pocket_weght)) @@ -37,7 +37,7 @@ hud_used?.hunger?.update_hunger_bar() mob_mood?.update_nutrition_moodlets() - if(HAS_TRAIT(src, TRAIT_FAT)) + if(HAS_TRAIT(src, TRAIT_FAT) && !HAS_TRAIT(src, TRAIT_FAT_IGNORE_SLOWDOWN)) add_movespeed_modifier(/datum/movespeed_modifier/obesity) else remove_movespeed_modifier(/datum/movespeed_modifier/obesity) 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 18625c2f95d..91187cda0ce 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -26,95 +26,18 @@ /// Yummy! species_cookie = /obj/item/food/nugget -/datum/species/human/felinid/on_species_gain(mob/living/carbon/carbon_being, datum/species/old_species, pref_load, regenerate_icons) - if(ishuman(carbon_being)) - var/mob/living/carbon/human/target_human = carbon_being - if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! - target_human.dna.features[FEATURE_TAIL] = "Cat" - if(target_human.dna.features[FEATURE_EARS] == "None") - target_human.dna.features[FEATURE_EARS] = "Cat" - /* SKYRAT EDIT -- START -- ORIGINAL - if(target_human.dna.features[FEATURE_EARS] == "None") - mutantears = /obj/item/organ/ears - else - var/obj/item/organ/ears/cat/ears = new(FALSE, target_human.dna.features[FEATURE_EARS]) - ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) - */ - if(target_human.dna.features[FEATURE_EARS] == "Cat") - var/obj/item/organ/ears/cat/ears = new - ears.Insert(target_human, movement_flags = DELETE_IF_REPLACED) - else - mutantears = /obj/item/organ/ears - // SKYRAT EDIT -- END +/datum/species/human/felinid/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons = TRUE, replace_missing = TRUE) + if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! + if(human_who_gained_species.dna.features[FEATURE_TAIL_CAT] == SPRITE_ACCESSORY_NONE) + human_who_gained_species.dna.features[FEATURE_TAIL_CAT] = get_consistent_feature_entry(SSaccessories.tails_list_felinid) + if(human_who_gained_species.dna.features[FEATURE_EARS] == SPRITE_ACCESSORY_NONE) + human_who_gained_species.dna.features[FEATURE_EARS] = get_consistent_feature_entry(SSaccessories.ears_list) + + // Swapping out feline ears for normal ol' human ears if they have invisible cat ears. + if(human_who_gained_species.dna.features[FEATURE_EARS] == SPRITE_ACCESSORY_NONE) + mutantears = /obj/item/organ/ears return ..() -/datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) - var/list/features = ..() - features[FEATURE_EARS] = pick("None", "Cat") - return features - -/datum/species/human/felinid/get_laugh_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/laugh/womanlaugh.ogg' - return pick( - 'sound/mobs/humanoids/human/laugh/manlaugh1.ogg', - 'sound/mobs/humanoids/human/laugh/manlaugh2.ogg', - ) - - -/datum/species/human/felinid/get_cough_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return pick( - 'sound/mobs/humanoids/human/cough/female_cough1.ogg', - 'sound/mobs/humanoids/human/cough/female_cough2.ogg', - 'sound/mobs/humanoids/human/cough/female_cough3.ogg', - 'sound/mobs/humanoids/human/cough/female_cough4.ogg', - 'sound/mobs/humanoids/human/cough/female_cough5.ogg', - 'sound/mobs/humanoids/human/cough/female_cough6.ogg', - ) - return pick( - 'sound/mobs/humanoids/human/cough/male_cough1.ogg', - 'sound/mobs/humanoids/human/cough/male_cough2.ogg', - 'sound/mobs/humanoids/human/cough/male_cough3.ogg', - 'sound/mobs/humanoids/human/cough/male_cough4.ogg', - 'sound/mobs/humanoids/human/cough/male_cough5.ogg', - 'sound/mobs/humanoids/human/cough/male_cough6.ogg', - ) - - -/datum/species/human/felinid/get_cry_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return pick( - 'sound/mobs/humanoids/human/cry/female_cry1.ogg', - 'sound/mobs/humanoids/human/cry/female_cry2.ogg', - ) - return pick( - 'sound/mobs/humanoids/human/cry/male_cry1.ogg', - 'sound/mobs/humanoids/human/cry/male_cry2.ogg', - 'sound/mobs/humanoids/human/cry/male_cry3.ogg', - ) - - -/datum/species/human/felinid/get_sneeze_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/sneeze/female_sneeze1.ogg' - return 'sound/mobs/humanoids/human/sneeze/male_sneeze1.ogg' - -/datum/species/human/felinid/get_sigh_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return SFX_FEMALE_SIGH - return SFX_MALE_SIGH - -/datum/species/human/felinid/get_sniff_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return 'sound/mobs/humanoids/human/sniff/female_sniff.ogg' - return 'sound/mobs/humanoids/human/sniff/male_sniff.ogg' - -/datum/species/human/felinid/get_snore_sound(mob/living/carbon/human/felinid) - if(felinid.physique == FEMALE) - return SFX_SNORE_FEMALE - return SFX_SNORE_MALE - /datum/species/human/felinid/get_hiss_sound(mob/living/carbon/human/felinid) return 'sound/mobs/humanoids/felinid/felinid_hiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 4a565b6d765..83bbc9fdc70 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -59,8 +59,6 @@ zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_POD_HAIR - preference = "feature_mushperson_cap" - //dna_block = /datum/dna_block/feature/mush_cap // BUBBER EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_PLANT diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 7f49b71e65e..20100587756 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -416,8 +416,10 @@ message = "screams!" message_mime = "acts out a scream!" emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE - mob_type_blacklist_typecache = list(/mob/living/brain, /mob/living/carbon/human) + mob_type_blacklist_typecache = list(/mob/living/brain) sound_wall_ignore = TRUE + specific_emote_audio_cooldown = 10 SECONDS + vary = TRUE /datum/emote/living/scream/run_emote(mob/user, params, type_override, intentional = FALSE) if(!intentional && HAS_TRAIT(user, TRAIT_ANALGESIA)) @@ -429,6 +431,12 @@ if(!intentional && isanimal_or_basicmob(user)) return "makes a loud and pained whimper." +/datum/emote/living/scream/get_sound(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/humie = user + return humie.dna.species.get_scream_sound(user) + /datum/emote/living/scowl key = "scowl" key_third_person = "scowls" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 58267fd7651..6b55dfcf531 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1109,7 +1109,7 @@ if(active_storage) var/storage_is_important_recurisve = (active_storage.parent in important_recursive_contents?[RECURSIVE_CONTENTS_ACTIVE_STORAGE]) - var/can_reach_active_storage = CanReach(active_storage.parent, view_only = TRUE) + var/can_reach_active_storage = active_storage.parent.IsReachableBy(src) if(!storage_is_important_recurisve && !can_reach_active_storage) active_storage.hide_contents(src) @@ -1451,7 +1451,7 @@ to_chat(src, span_warning("Your holochasis does not allow you to do this!")) return FALSE - if(!(action_bitflags & BYPASS_ADJACENCY) && ((action_bitflags & NOT_INSIDE_TARGET) || !recursive_loc_check(src, target)) && !CanReach(target)) + if(!(action_bitflags & BYPASS_ADJACENCY) && ((action_bitflags & NOT_INSIDE_TARGET) || !recursive_loc_check(src, target)) && !target.IsReachableBy(src)) if(HAS_SILICON_ACCESS(src) && !ispAI(src)) if(!(action_bitflags & ALLOW_SILICON_REACH)) // silicons can ignore range checks (except pAIs) if(!(action_bitflags & SILENT_ADJACENCY)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 8e8a2a8a0f3..e53eb656e38 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -195,10 +195,7 @@ return . = combat_mode combat_mode = new_mode - // BUBBER EDIT START - if(client) - SEND_SIGNAL(src, COMSIG_LIVING_COMBAT_MODE_TOGGLE, new_mode) - // BUBBER EDIT END + SEND_SIGNAL(src, COMSIG_COMBAT_MODE_TOGGLED) if(hud_used?.action_intent) hud_used.action_intent.update_appearance() face_mouse = (client?.prefs?.read_preference(/datum/preference/toggle/face_cursor_combat_mode) && combat_mode) ? TRUE : FALSE // BUBBER EDIT @@ -829,3 +826,15 @@ return SUCCESSFUL_BLOCK return FAILED_BLOCK + +/mob/living/proc/hypnosis_vulnerable() + if(HAS_MIND_TRAIT(src, TRAIT_UNCONVERTABLE)) + return FALSE + if(has_status_effect(/datum/status_effect/hallucination) || has_status_effect(/datum/status_effect/drugginess)) + return TRUE + if(IsSleeping() || IsUnconscious()) + return TRUE + if(HAS_TRAIT(src, TRAIT_DUMB)) + return TRUE + if(mob_mood && mob_mood.sanity < SANITY_UNSTABLE) + return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6595712ff8d..5d983ae70b8 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -248,3 +248,6 @@ /// First element is the current martial art - any other elements are "saved" for if they unlearn the first one /// Reference handling is done by the martial arts themselves var/list/datum/martial_art/martial_arts + + /// how many tiles can this mob reach with their hands? 1 tile is adjacent. + var/reach_length = 1 diff --git a/code/modules/mob/living/living_item_handling.dm b/code/modules/mob/living/living_item_handling.dm index 60d683887b1..4e3b67ca931 100644 --- a/code/modules/mob/living/living_item_handling.dm +++ b/code/modules/mob/living/living_item_handling.dm @@ -164,7 +164,7 @@ to_chat(src, span_warning("[offered.p_Theyre()] unable to take anything in [offered.p_their()] current state!")) return - if(!CanReach(offered)) + if(!offered.IsReachableBy(src)) to_chat(src, span_warning("You have to be beside [offered.p_them()]!")) return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index f2a3649b8a9..5bad5247f49 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -73,7 +73,12 @@ return ..() /mob/living/proc/update_move_intent_slowdown() - add_movespeed_modifier((move_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) + add_movespeed_modifier(get_move_intent_slowdown()) + +/mob/living/proc/get_move_intent_slowdown() + if(move_intent == MOVE_INTENT_WALK) + return /datum/movespeed_modifier/config_walk_run/walk + return /datum/movespeed_modifier/config_walk_run/run /mob/living/proc/update_turf_movespeed(turf/open/turf) if(isopenturf(turf) && !HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLOWDOWN)) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 64b02d5492f..e2059fa3f55 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -164,3 +164,6 @@ apply_status_effect(/datum/status_effect/borg_slow, damage_done / 60) #undef CYBORG_SLOWDOWN_THRESHOLD + +/mob/living/silicon/hypnosis_vulnerable() + return FALSE //It obeys its laws diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 65c03c446df..81de3c901b7 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -1,3 +1,6 @@ +#define ATTACK_MODE_ATTACK "attack_mode" +#define ATTACK_MODE_SHOVE "shove_mode" + /mob/living/simple_animal/hostile/illusion name = "illusion" desc = "It's a fake!" @@ -22,8 +25,22 @@ var/datum/weakref/parent_mob_ref /// Prob of getting a clone on attack var/multiply_chance = 0 + /// Decides how the clones attack people + var/attack_mode = ATTACK_MODE_ATTACK -/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0) +/mob/living/simple_animal/hostile/illusion/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(check_mode)) + +/// Called before trying to attack something +/mob/living/simple_animal/hostile/illusion/proc/check_mode(mob/living/source, atom/attacked_target) + SIGNAL_HANDLER + if(attack_mode != ATTACK_MODE_SHOVE) + return + if(disarm(attacked_target)) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0, attack_mode = ATTACK_MODE_ATTACK) appearance = original.appearance parent_mob_ref = WEAKREF(original) setDir(original.dir) @@ -36,6 +53,7 @@ transform = initial(transform) pixel_x = base_pixel_x pixel_y = base_pixel_y + src.attack_mode = attack_mode addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, death)), life) /mob/living/simple_animal/hostile/illusion/examine(mob/user) @@ -81,3 +99,6 @@ /mob/living/simple_animal/hostile/illusion/mirage/death(gibbed) do_sparks(rand(3, 6), FALSE, src) return ..() + +#undef ATTACK_MODE_ATTACK +#undef ATTACK_MODE_SHOVE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index e1ea630a465..ad03aeef9a3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -298,9 +298,9 @@ Difficulty: Hard if(.) recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority -/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/proj) +/mob/living/simple_animal/hostile/megafauna/bubblegum/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(BUBBLEGUM_IS_ENRAGED) - visible_message(span_danger("[src] deflects the [proj]! [p_They()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) + visible_message(span_danger("[src] deflects the [hitting_projectile]! [p_They()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) playsound(src, SFX_BULLET_MISS, 300, TRUE) return BULLET_ACT_BLOCK return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index e105ab56cd1..e796781cf4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -2,6 +2,9 @@ #define TUMOR_ACTIVE 1 #define TUMOR_PASSIVE 2 +// Makes the elite mob weaker on victory so they don't just go and trash the station with a dangerous, big health pool +#define ELITE_POST_BATTLE_HEALTH_MULTIPLIER 0.4 + //Elite mining mobs /mob/living/simple_animal/hostile/asteroid/elite name = "elite" @@ -30,6 +33,7 @@ . = ..() AddComponent(/datum/component/seethrough_mob) grant_actions_by_list(attack_action_types) + ADD_TRAIT(src, TRAIT_UNCONVERTABLE, INNATE_TRAIT) //You cannot convert them while they're battling. //Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls. /mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget(atom/attacked_target) @@ -226,7 +230,7 @@ While using this makes the system rely on OnFire, it still gives options for tim playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) mychild.revive(HEAL_ALL) if(boosted) - mychild.maxHealth = mychild.maxHealth * 2 + mychild.maxHealth *= 1 / ELITE_POST_BATTLE_HEALTH_MULTIPLIER //we multiply it back to its original value mychild.health = mychild.maxHealth notify_ghosts( "\A [mychild] has been challenged in \the [get_area(src)]!", @@ -235,6 +239,7 @@ While using this makes the system rely on OnFire, it still gives options for tim notify_flags = NOTIFY_CATEGORY_NOFLASH, ) mychild.log_message("has been challenged by [key_name(activator)]!", LOG_GAME, color="#960000") + ADD_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT) /obj/structure/elite_tumor/Initialize(mapload) . = ..() @@ -344,7 +349,7 @@ While using this makes the system rely on OnFire, it still gives options for tim mychild.revive(HEAL_ALL) if(boosted) times_won++ - mychild.maxHealth = mychild.maxHealth * 0.4 + mychild.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER mychild.health = mychild.maxHealth if(times_won == 1) mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) @@ -356,6 +361,8 @@ While using this makes the system rely on OnFire, it still gives options for tim Also, be weary of your fellow inhabitants, they likely won't be happy to see you!") to_chat(mychild, span_boldbig("Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!")) + REMOVE_TRAIT(mychild, TRAIT_UNCONVERTABLE, INNATE_TRAIT) + /obj/item/tumor_shard name = "tumor shard" desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver." @@ -373,20 +380,21 @@ While using this makes the system rely on OnFire, it still gives options for tim if(!istype(interacting_with, /mob/living/simple_animal/hostile/asteroid/elite)) return NONE - var/mob/living/simple_animal/hostile/asteroid/elite/E = interacting_with - if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) - user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) + var/mob/living/simple_animal/hostile/asteroid/elite/elite = interacting_with + if(elite.stat != DEAD || elite.sentience_type != SENTIENCE_BOSS || !elite.key) + user.visible_message(span_notice("It appears [elite] is unable to be revived right now. Perhaps try again later.")) return ITEM_INTERACT_BLOCKING - E.faction = list("[REF(user)]") - E.revive(HEAL_ALL) - user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) - E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) - to_chat(E, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.")) - to_chat(E, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")) - E.maxHealth = E.maxHealth * 0.4 - E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people." - E.sentience_type = SENTIENCE_ORGANIC + elite.faction = list("[REF(user)]") + elite.revive(HEAL_ALL) + user.visible_message(span_notice("[user] stabs [elite] with [src], reviving it.")) + elite.playsound_local(get_turf(elite), 'sound/effects/magic.ogg', 40, 0) + to_chat(elite, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.")) + to_chat(elite, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")) + elite.maxHealth *= ELITE_POST_BATTLE_HEALTH_MULTIPLIER + elite.health = elite.maxHealth + elite.desc = "[elite.desc] However, this one appears to be less wild in nature, and calmer around people." + elite.sentience_type = SENTIENCE_ORGANIC + REMOVE_TRAIT(elite, TRAIT_UNCONVERTABLE, INNATE_TRAIT) qdel(src) return ITEM_INTERACT_SUCCESS @@ -423,6 +431,8 @@ While using this makes the system rely on OnFire, it still gives options for tim if(mover == ourelite_ref.resolve() || mover == activator_ref.resolve()) return FALSE +#undef ELITE_POST_BATTLE_HEALTH_MULTIPLIER + #undef TUMOR_ACTIVE #undef TUMOR_INACTIVE #undef TUMOR_PASSIVE diff --git a/code/modules/mob_spawn/corpses/job_corpses.dm b/code/modules/mob_spawn/corpses/job_corpses.dm index 00a5de4f3d6..01ffdbe0d46 100644 --- a/code/modules/mob_spawn/corpses/job_corpses.dm +++ b/code/modules/mob_spawn/corpses/job_corpses.dm @@ -59,15 +59,15 @@ outfit = /datum/outfit/job/assistant icon_state = "corpsegreytider" -/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/beesease) -/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/brainrot) -/obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/fluspanish) diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index 9edfbeddf8b..4dc4e7d5ad0 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -8,7 +8,7 @@ burn_damage = 1000 mob_species = /datum/species/skeleton -/obj/effect/mob_spawn/corpse/human/charredskeleton/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/charredskeleton/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.color = "#454545" spawned_human.gender = NEUTER @@ -34,7 +34,7 @@ outfit = select_outfit() return ..() -/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() var/obj/item/organ/legion_tumour/cancer = new() cancer.Insert(spawned_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -75,7 +75,7 @@ /// Corpse spawner used by dwarf legions to make small corpses /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.dna.add_mutation(/datum/mutation/dwarfism, MUTATION_SOURCE_MUTATOR) @@ -123,7 +123,7 @@ /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/select_outfit() return null -/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.gender = NEUTER @@ -134,9 +134,10 @@ brute_damage = 0 burn_damage = 1000 -/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.color = "#454545" + spawned_human.AddComponent(/datum/component/storm_hating) /datum/outfit/consumed_miner diff --git a/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm b/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm index 0ed30e5a521..c546173f556 100644 --- a/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm +++ b/code/modules/mob_spawn/corpses/nanotrasen_corpses.dm @@ -54,7 +54,7 @@ outfit = /datum/outfit/centcom/centcom_intern/unarmed mob_name = "Nameless Intern" -/obj/effect/mob_spawn/corpse/human/intern/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/corpse/human/intern/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.gender = MALE //we're making it canon babies spawned_human.update_body() diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index 571bac86e7c..e25bb36ec32 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -11,7 +11,7 @@ return . = ..() -/obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai) +/obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai, mob/mob_possessor) . = ..() dead_ai.name = src.name dead_ai.real_name = src.name @@ -24,7 +24,7 @@ ///the color of the slime you're spawning. var/slime_species = /datum/slime_type/grey -/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime) +/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime, mob/mob_possessor) . = ..() spawned_slime.set_slime_type(slime_species) diff --git a/code/modules/mob_spawn/ghost_roles/away_roles.dm b/code/modules/mob_spawn/ghost_roles/away_roles.dm index 4891cf1e008..386e30ea88d 100644 --- a/code/modules/mob_spawn/ghost_roles/away_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/away_roles.dm @@ -14,7 +14,7 @@ flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." spawner_job_path = /datum/job/skeleton -/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn, mob/mob_possessor) . = ..() to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") @@ -30,7 +30,7 @@ you_are_text = "By unknown powers, your rotting remains have been resurrected!" flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." -/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn, mob/mob_possessor) . = ..() to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") diff --git a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm index 0165b27f21a..2d1f3c7a706 100644 --- a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm @@ -7,7 +7,7 @@ show_flavor = FALSE var/back_story = "error" -/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() var/datum/antagonist/fugitive_hunter/fughunter = new fughunter.backstory = back_story diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 2d073481923..99023cd45e7 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -242,7 +242,7 @@ to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis.")) return FALSE -/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) // SKYRAT EDIT ADDITION BEGIN spawned_human.fully_replace_character_name(null, spawned_human.generate_random_mob_name(TRUE)) // SKYRAT EDIT MOVE - Moving before parent call prevents char name randomization quirks_enabled = TRUE // ghost role quirks @@ -301,7 +301,7 @@ random_appearance = FALSE // SKYRAT EDIT ADDITION deletes_on_zero_uses_left = FALSE -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn, mob/mob_possessor) . = ..() new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_SPAWNER) // SKYRAT EDIT CHANGE - ORIGINAL: new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index 024d4069dd3..6818024c8c0 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -24,7 +24,7 @@ new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) return ..() -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human) +/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human, mob/mob_possessor) . = ..() spawned_human.fully_replace_character_name(null, "NTP #LL-0[rand(111,999)]") //Nanotrasen Prisoner #Lavaland-(numbers) @@ -153,7 +153,7 @@ new/obj/structure/fluff/empty_sleeper(get_turf(src)) return ..() -/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn, mob/mob_possessor) . = ..() new_spawn.fully_replace_character_name(null,"Wish Granter's Victim ([rand(1,999)])") var/wish = rand(1,4) @@ -227,7 +227,7 @@ icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" -/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() gender = FEMALE @@ -270,7 +270,7 @@ outfit = /datum/outfit/syndicatespace/syndicrew spawner_job_path = /datum/job/syndicate_cybersun -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) +/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn, mob/mob_possessor) . = ..() new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_SPAWNER) // SKYRAT EDIT CHANGE - ORIGINAL: new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND) var/datum/job/spawn_job = SSjob.get_job_type(spawner_job_path) diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index fab7c13d776..17e9bf8b3ec 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -53,7 +53,7 @@ spawned_mob_ref = WEAKREF(spawned_mob) return spawned_mob -/obj/effect/mob_spawn/proc/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/proc/special(mob/living/spawned_mob, mob/mob_possessor) SHOULD_CALL_PARENT(TRUE) if(faction) spawned_mob.faction = faction @@ -310,7 +310,7 @@ if(mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)) INVOKE_ASYNC(src, PROC_REF(create)) -/obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob) +/obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.death(TRUE) spawned_mob.adjustOxyLoss(oxy_damage) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 906dd08ca31..1d3e16c7ec9 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -107,6 +107,7 @@ module = new module(src) install(module) START_PROCESSING(SSobj, src) + AddElement(/datum/element/drag_pickup) /obj/item/mod/control/Destroy() STOP_PROCESSING(SSobj, src) @@ -213,14 +214,14 @@ return clean_up() -/obj/item/mod/control/allow_attack_hand_drop(mob/user) +/obj/item/mod/control/can_mob_unequip(mob/user) if(user != wearer) return ..() if(active) balloon_alert(wearer, "unit active!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return + return FALSE for(var/obj/item/part as anything in get_parts()) if(part.loc != src) @@ -230,33 +231,6 @@ return ..() -/obj/item/mod/control/mouse_drop_dragged(atom/over_object, mob/user) - if(user != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) - return - if(active) - balloon_alert(wearer, "unit active!") - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return - for(var/obj/item/part as anything in get_parts()) - if(part.loc != src) - balloon_alert(wearer, "parts extended!") - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return - - // SKYRAT EDIT ADDITION START - Can't remove your MODsuit from your back when it's still active (as it can cause runtimes and even the MODsuit control unit to delete itself) - if(active) - if(!wearer.incapacitated) - balloon_alert(wearer, "deactivate first!") - playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - - return - // SKYRAT EDIT ADDITION END - - if(!wearer.incapacitated) - var/atom/movable/screen/inventory/hand/ui_hand = over_object - if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) - add_fingerprint(user) - /obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench) if(seconds_electrified && get_charge() && shock(user)) return ITEM_INTERACT_BLOCKING diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index caf162c9c41..ab5cc6ef9aa 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -466,6 +466,7 @@ /obj/item/mod/core/plasma/lavaland/Destroy() QDEL_NULL(particle_effect) + QDEL_NULL(mob_spawner) return ..() /obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit) @@ -480,17 +481,22 @@ SIGNAL_HANDLER if(mod.active) particle_effect = new(mod.wearer, /particles/pollen, PARTICLE_ATTACH_MOB) - mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, spawn_types=list(spawned_mob_type), spawn_time=5 SECONDS, max_spawned=3, faction=mod.wearer.faction) + mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, \ + spawn_types = list(spawned_mob_type), \ + spawn_time = 5 SECONDS, \ + max_spawned = 3, \ + faction = mod.wearer.faction, \ + ) RegisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED, PROC_REF(new_mob)) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(spread_flowers)) + return - else - QDEL_NULL(particle_effect) - UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - for(var/datum/mob in mob_spawner.spawned_things) - qdel(mob) - qdel(mob_spawner) + QDEL_NULL(particle_effect) + UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + for(var/datum/mob in mob_spawner.spawned_things) + qdel(mob) + QDEL_NULL(mob_spawner) /obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned) SIGNAL_HANDLER @@ -499,6 +505,9 @@ /obj/item/mod/core/plasma/lavaland/proc/spread_flowers(atom/source, atom/oldloc, dir, forced) SIGNAL_HANDLER + if (!isturf(oldloc)) + return + var/static/list/possible_flower_types = list( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/flowers_yw/style_random, @@ -506,7 +515,7 @@ /obj/structure/flora/bush/flowers_pp/style_random, ) var/chosen_type = pick(possible_flower_types) - var/flower_boots = new chosen_type(get_turf(mod.wearer)) + var/flower_boots = new chosen_type(oldloc) animate(flower_boots, alpha = 0, 1 SECONDS) QDEL_IN(flower_boots, 1 SECONDS) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 5838e2391cd..f797fae7e31 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -26,17 +26,36 @@ head_cover.flash_protect = initial(head_cover.flash_protect) /obj/item/mod/module/welding/syndicate + name = "MODsuit flash-protected optical suite" complexity = 0 removable = FALSE incompatible_modules = list(/obj/item/mod/module/welding, /obj/item/mod/module/welding/syndicate, /obj/item/mod/module/stealth/wraith) - overlay_state_inactive = "module_armorbooster_on" + overlay_state_inactive = "module_armorbooster_off" use_mod_colors = TRUE mask_worn_overlay = TRUE /obj/item/mod/module/welding/syndicate/generate_worn_overlay(obj/item/source, mutable_appearance/standing) - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + if(!mod.wearer || !mod.wearer.combat_mode) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + else + overlay_state_inactive = "module_armorbooster_on-[mod.skin]" return ..() + +/obj/item/mod/module/welding/syndicate/on_part_activation() + . = ..() + RegisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED, PROC_REF(on_combat_mode_toggle)) + +/obj/item/mod/module/welding/syndicate/on_part_deactivation(deleting = FALSE) + . = ..() + UnregisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED) + +/// Changes which overlay state we're using depending on combat mode status. +/obj/item/mod/module/welding/syndicate/proc/on_combat_mode_toggle(mob/living/carbon/human/toggler) + SIGNAL_HANDLER + playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + update_clothing_slots() + ///T-Ray Scan - Scans the terrain for undertile objects. /obj/item/mod/module/t_ray name = "MOD t-ray scan module" @@ -266,7 +285,7 @@ return ITEM_INTERACT_BLOCKING /obj/item/tether_anchor/attack_hand_secondary(mob/user, list/modifiers) - if (!can_interact(user) || !user.CanReach(src) || !isturf(loc)) + if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(HAS_TRAIT_FROM(user, TRAIT_TETHER_ATTACHED, REF(src))) @@ -289,10 +308,10 @@ reset_pixel_pos = FALSE /obj/item/tether_anchor/mouse_drop_receive(atom/target, mob/user, params) - if (!can_interact(user) || !user.CanReach(src) || !isturf(loc)) + if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc)) return - if (!isliving(target) || !target.CanReach(src)) + if (!isliving(target) || !IsReachableBy(target)) return if(HAS_TRAIT_FROM(target, TRAIT_TETHER_ATTACHED, REF(src))) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 5a183827233..0ebd99635ae 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -290,7 +290,7 @@ /obj/item/mod/module/orebag/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc) SIGNAL_HANDLER - if(istype(arrived, /obj/item/stack/ore) && !dropping_ores) + if(istype(arrived, /obj/item/stack/ore) && !dropping_ores && old_loc != mod.wearer) INVOKE_ASYNC(src, PROC_REF(move_ore), arrived) playsound(mod.wearer, SFX_RUSTLE, 50, TRUE) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 0a18a559830..20c01a57978 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -401,15 +401,15 @@ timetokill += seconds_per_tick -/obj/structure/chrono_field/bullet_act(obj/projectile/projectile) - if(istype(projectile, /obj/projectile/energy/chrono_beam)) - var/obj/projectile/energy/chrono_beam/beam = projectile - var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() - if(linked_tem && istype(linked_tem)) - linked_tem.field_connect(src) - return BULLET_ACT_HIT +/obj/structure/chrono_field/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(!istype(hitting_projectile, /obj/projectile/energy/chrono_beam)) + return ..() - return ..() + var/obj/projectile/energy/chrono_beam/beam = hitting_projectile + var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() + if(linked_tem && istype(linked_tem)) + linked_tem.field_connect(src) + return BULLET_ACT_HIT /obj/structure/chrono_field/assume_air() return FALSE diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index c865cc3e670..443db90c51c 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -92,9 +92,9 @@ required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /obj/item/mod/module/night/on_activation(mob/activator) - mod.wearer.add_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) + ADD_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() /obj/item/mod/module/night/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE) - mod.wearer.remove_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) + REMOVE_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src)) mod.wearer.update_sight() diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index a33ae21f9fd..2ae9e794b57 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -29,6 +29,7 @@ if(start_open && !screen_on) toggle_open() RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, PROC_REF(on_speed_potioned)) + AddElement(/datum/element/drag_pickup) /obj/item/modular_computer/laptop/examine(mob/user) . = ..() @@ -76,16 +77,6 @@ try_toggle_open(usr) -/obj/item/modular_computer/laptop/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(over_object == user || over_object == src) - try_toggle_open(user) - return - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - if(!isturf(loc)) - return - user.put_in_hand(src, H.held_index) - /obj/item/modular_computer/laptop/proc/try_toggle_open(mob/living/user) if(issilicon(user)) return diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 00411f280d2..5f4b1f5dc6f 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -201,7 +201,7 @@ // "Stun" weapons can cause minor damage to components (short-circuits?) // "Burn" damage is equally strong against internal components and exterior casing // "Brute" damage mostly damages the casing. -/obj/machinery/modular_computer/bullet_act(obj/projectile/proj) - return cpu?.projectile_hit(proj) || ..() +/obj/machinery/modular_computer/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + return cpu?.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) || ..() #undef CPU_INTERACTABLE diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index ea01652cf84..70f322b3c78 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -1,9 +1,9 @@ /datum/computer_file/program/budgetorders filename = "orderapp" - filedesc = "NT IRN" + filedesc = "NT Shopping Network" downloader_category = PROGRAM_CATEGORY_SUPPLY program_open_overlay = "request" - extended_desc = "Nanotrasen Internal Requisition Network interface for supply purchasing using a department budget account." + extended_desc = "Nanotrasen Shopping Network interface for purchasing supplies from the cargo catalogue using a department budget account." program_flags = PROGRAM_ON_NTNET_STORE | PROGRAM_REQUIRES_NTNET can_run_on_flags = PROGRAM_LAPTOP | PROGRAM_PDA size = 10 @@ -62,23 +62,27 @@ var/list/data = list() data["location"] = SSshuttle.supply.getStatusText() data["department"] = "Cargo" + var/datum/bank_account/buyer = SSeconomy.get_dep_account(cargo_account) var/obj/item/card/id/id_card = computer.stored_id?.GetID() if(id_card?.registered_account) + buyer = SSeconomy.get_dep_account(id_card?.registered_account.account_job.paycheck_department) if((ACCESS_COMMAND in id_card.access)) requestonly = FALSE - buyer = SSeconomy.get_dep_account(id_card.registered_account.account_job.paycheck_department) can_approve_requests = TRUE + // If buyer is a departmental budget, replaces "Cargo" with that budget - we're not using the cargo budget here + data["department"] = "[buyer.account_holder] Requisitions" else requestonly = TRUE can_approve_requests = FALSE - if(ACCESS_COMMAND in id_card.access) - // If buyer is a departmental budget, replaces "Cargo" with that budget - we're not using the cargo budget here - data["department"] = addtext(buyer.account_holder, " Requisitions") else requestonly = TRUE if(buyer) data["points"] = buyer.account_balance + // To recap above because it's kind of a mess, here's all the options: + //Head of staff ID card: Can approve, buy, and make purchases using their own departmental budgets. + //ID card, not a head of staff: can request items from cargo using departmental budget. + //No ID card, can request items from cargo using the cargo budget. //Otherwise static data, that is being applied in ui_data as the crates visible and buyable are not static, and are determined by inserted ID. data["requestonly"] = requestonly @@ -160,7 +164,8 @@ "cost" = pack.get_cost(), "orderer" = order.orderer, "reason" = order.reason, - "id" = order.id + "id" = order.id, + "account" = order.paying_account?.account_holder || "Cargo Department" )) data["amount_by_name"] = amount_by_name @@ -219,25 +224,31 @@ var/name = "*None Provided*" var/rank = "*None Provided*" var/ckey = usr.ckey + var/mob/living/carbon/human/hwoman if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) + hwoman = usr + rank = hwoman.get_assignment(hand_first = TRUE) else if(issilicon(usr)) name = usr.real_name rank = "Silicon" - var/datum/bank_account/account + // Our account that we want to end up paying with. Defaults to the cargo budget! + var/datum/bank_account/account = SSeconomy.get_dep_account(ACCOUNT_CAR) + // Our ID card that we want to pull from for identification. Modifies either name, account, or neither depending on function. + var/obj/item/card/id/id_card_customer = computer.stored_id?.GetID() + if(!id_card_customer) + id_card_customer = hwoman?.get_idcard(TRUE) //Grab from hands/mob if there's no id_card slot to prioritize. + name = id_card_customer?.registered_account.account_holder + if(self_paid) - var/mob/living/carbon/human/H = usr - var/obj/item/card/id/id_card = H.get_idcard(TRUE) - if(!istype(id_card)) + if(!istype(id_card_customer)) computer.say("No ID card detected.") return - if(IS_DEPARTMENTAL_CARD(id_card)) - computer.say("[id_card] cannot be used to make purchases.") + if(IS_DEPARTMENTAL_CARD(id_card_customer)) + computer.say("[id_card_customer] cannot be used to make purchases.") return - account = id_card.registered_account + account = id_card_customer.registered_account + name = id_card_customer.registered_account.account_holder if(!istype(account)) computer.say("Invalid bank account.") return @@ -248,6 +259,16 @@ if(isnull(reason) || ..()) return + if(id_card_customer?.registered_account?.account_job) //Find a budget to pull from + var/datum/bank_account/personal_department = SSeconomy.get_dep_account(id_card_customer.registered_account.account_job.paycheck_department) + if(!(personal_department.account_holder == "Cargo Budget")) + var/choice = tgui_alert(usr, "Which department are you requesting this for?", "Choose request department", list("Cargo Budget", "[personal_department.account_holder]")) + if(!choice) + return + if(choice != "Cargo Budget") + account = personal_department + name = id_card_customer.registered_account?.account_holder + if(pack.goody && !self_paid) playsound(computer, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE) computer.say("ERROR: Small crates may only be purchased by private accounts.") @@ -271,6 +292,7 @@ SSshuttle.shopping_list += SO if(self_paid) computer.say("Order processed. The price will be charged to [account.account_holder]'s bank account on delivery.") + playsound(computer, 'sound/effects/coin2.ogg', 40, TRUE) . = TRUE if("remove") var/id = text2num(params["id"]) diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index 949b9321100..5f21d1b0623 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -766,6 +766,7 @@ SStgui.update_uis(computer) update_pictures_for_all() + /// topic call that answers to people pressing "(Reply)" in chat /datum/computer_file/program/messenger/Topic(href, href_list) ..() diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index abde74b60bb..8a3adfde01c 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -165,6 +165,9 @@ /datum/movespeed_modifier/goliath_mount multiplicative_slowdown = -26 +/datum/movespeed_modifier/goldgrub_mount + multiplicative_slowdown = -3 + /datum/movespeed_modifier/settler multiplicative_slowdown = 0.2 blacklisted_movetypes = FLOATING|FLYING diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 951944944c5..df114aca407 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -23,7 +23,7 @@ multiplicative_slowdown = 4 /datum/movespeed_modifier/status_effect/lobster_rush - multiplicative_slowdown = -0.5 + multiplicative_slowdown = -0.2 blacklisted_movetypes = (FLYING|FLOATING) /datum/movespeed_modifier/status_effect/brimdust_concussion diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 71471f4bf1f..6e24123bfa1 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -26,6 +26,7 @@ stored_blade = new /obj/item/hatchet/cutterblade(src) register_context() update_appearance() + AddElement(/datum/element/drag_pickup) /obj/item/papercutter/Destroy(force) if(!isnull(stored_paper)) @@ -103,16 +104,16 @@ /obj/item/papercutter/screwdriver_act(mob/living/user, obj/item/tool) if(!stored_blade && !blade_secured) balloon_alert(user, "no blade!") - return + return ITEM_INTERACT_BLOCKING tool.play_tool_sound(src) balloon_alert(user, "[blade_secured ? "un" : ""]secured") blade_secured = !blade_secured return ITEM_INTERACT_SUCCESS -/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers, list/attack_modifiers) - if(istype(inserted_item, /obj/item/paper)) - if(is_type_in_list(inserted_item, list( +/obj/item/papercutter/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/paper)) + if(is_type_in_list(tool, list( /obj/item/paper/fake_report, /obj/item/paper/holy_writ, /obj/item/paper/pamphlet, @@ -120,29 +121,31 @@ /obj/item/paper/report, ))) balloon_alert(user, "won't fit!") - return + return ITEM_INTERACT_BLOCKING if(stored_paper) balloon_alert(user, "already paper inside!") - return - if(!user.transferItemToLoc(inserted_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING playsound(loc, SFX_PAGE_TURN, 60, TRUE) balloon_alert(user, "paper inserted") - stored_paper = inserted_item + stored_paper = tool + update_appearance() + return ITEM_INTERACT_SUCCESS - if(istype(inserted_item, /obj/item/hatchet/cutterblade)) + if(istype(tool, /obj/item/hatchet/cutterblade)) if(stored_blade) balloon_alert(user, "already a blade inside!") - return - if(!user.transferItemToLoc(inserted_item, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING balloon_alert(user, "blade inserted") - inserted_item.forceMove(src) - stored_blade = inserted_item + tool.forceMove(src) + stored_blade = tool + update_appearance() + return ITEM_INTERACT_SUCCESS - update_appearance() - - return ..() + return NONE /obj/item/papercutter/click_alt(mob/user) // can only remove one at a time; paper goes first, as its most likely what players will want to be taking out @@ -180,15 +183,6 @@ new /obj/item/paper/paperslip(get_turf(src)) update_appearance() -/obj/item/papercutter/mouse_drop_dragged(atom/over_object, mob/user) - if(over_object == user) - user.put_in_hands(src) - - else if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/target_hand = over_object - user.putItemFromInventoryInHandIfPossible(src, target_hand.held_index) - add_fingerprint(user) - /obj/item/paper/paperslip name = "paper slip" desc = "A little slip of paper left over after a larger piece was cut. Whoa." diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index b9a97778f1a..5f246050f5c 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -445,9 +445,10 @@ /datum/embedding/edagger_active embed_chance = 100 -/obj/item/pen/edagger/proc/on_scan(datum/source, mob/user, list/extra_data) +/obj/item/pen/edagger/proc/on_scan(datum/source, mob/user, datum/detective_scanner_log/entry) SIGNAL_HANDLER - LAZYADD(extra_data[DETSCAN_CATEGORY_ILLEGAL], "Hard-light generator detected.") + + entry.add_data_entry(DETSCAN_CATEGORY_ILLEGAL, "Hard-light generator detected.") /obj/item/pen/survival name = "survival pen" diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index ed4121d6ad0..0d2877cca16 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -5,8 +5,8 @@ icon_state = "synthesizer" icon = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' - ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity - var/amount = 1 + ///Amount we produce for every process by default. + var/amount = 5 ///I track them here because I have no idea how I'd make tgui loop like that var/static/list/possible_amounts = list(0, 1, 2, 3, 4, 5) ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial. diff --git a/code/modules/point/point.dm b/code/modules/point/point.dm index adb539ad3b9..e3ef14d2db9 100644 --- a/code/modules/point/point.dm +++ b/code/modules/point/point.dm @@ -114,7 +114,7 @@ if(client) //Clientless mobs can just go ahead and point if(ismovable(pointing_at)) var/atom/movable/pointed_movable = pointing_at - if(pointed_movable.flags_1 & IS_ONTOP_1) + if(HAS_TRAIT(pointed_movable, TRAIT_SKIP_BASIC_REACH_CHECK) || pointing_at.loc.IsContainedAtomAccessible(pointing_at, src)) pointing_at = pointed_movable.loc if(!(pointing_at in view(client.view, src))) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 3b92fb6aba3..86c2e3e4989 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -1130,6 +1130,54 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) SIGNAL_HANDLER examine_list += span_info("There's a santa hat placed atop it. How it got there without being dusted is a mystery.") +// Warp Effect // + +/atom/movable/warp_effect + plane = DISPLACEMENT_PLANE + appearance_flags = PIXEL_SCALE|LONG_GLIDE // no tile bound so you can see it around corners and so + icon = 'icons/effects/light_overlays/light_352.dmi' + icon_state = "light" + pixel_x = -176 + pixel_y = -176 + +/atom/movable/warp_effect/Initialize(mapload) + . = ..() + var/turf/new_turf = get_turf(src) + if(new_turf) + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + +/atom/movable/warp_effect/Destroy(force) + // Just in case I've forgotten how the movement api works + var/offset = GET_TURF_PLANE_OFFSET(loc) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(offset), ref(src)) + return ..() + +/atom/movable/warp_effect/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + var/turf/new_turf = get_turf(src) + var/turf/old_turf = get_turf(old_loc) + if(!new_turf) + var/old_offset = GET_TURF_PLANE_OFFSET(old_turf) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src)) + return + else if(get_turf(old_loc)) + return + // If we're in a thing on a turf we COUNT as a distortion source + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + +/atom/movable/warp_effect/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + . = ..() + if(same_z_layer) + return + if(old_turf) + var/old_offset = GET_TURF_PLANE_OFFSET(old_turf) + REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src)) + if(new_turf) + var/new_offset = GET_TURF_PLANE_OFFSET(new_turf) + ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src)) + #undef BIKE #undef COIL #undef ROD diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6c22e66eeec..dae805e4ac1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -29,11 +29,12 @@ var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/items/weapons/gun/general/dry_fire.ogg' var/dry_fire_sound_volume = 30 - var/suppressed = null //whether or not a message is displayed when fired + /// Whether or not a message is displayed when fired + var/suppressed = SUPPRESSED_NONE var/can_suppress = FALSE var/suppressed_sound = 'sound/items/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 - /// whether a gun can be unsuppressed. for ballistics, also determines if it generates a suppressor overlay + /// Whether a gun can be unsuppressed. for ballistics, also determines if it generates a suppressor overlay var/can_unsuppress = TRUE var/recoil = 0 //boom boom shake the room var/clumsy_check = TRUE @@ -57,6 +58,10 @@ /// If FALSE it will just try to fire at ourselves straight up. var/doafter_self_shoot = TRUE + /// If TRUE, will fire ITEM_INTERACT_BLOCKING (melee, etc) if the gun has a round already in the chamber, and is waiting to be fired (but cant, usually due to waiting on fire_delay). + /// If FALSE, nothing changed. + var/chambered_attack_block = FALSE + /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. var/projectile_damage_multiplier = 1 @@ -99,10 +104,7 @@ /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) - QDEL_NULL(chambered) - if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK - QDEL_NULL(suppressed) + QDEL_NULL(chambered) return ..() /obj/item/gun/apply_fantasy_bonuses(bonus) @@ -134,20 +136,20 @@ if(gone == chambered) chambered = null update_appearance() - if(gone == suppressed) - clear_suppressor() -///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. +/// Clears var and updates icon. /obj/item/gun/proc/clear_suppressor() if(!can_unsuppress) return - suppressed = null + suppressed = SUPPRESSED_NONE update_appearance() /obj/item/gun/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(isliving(hit_atom)) var/mob/living/thrower = throwingdatum?.get_thrower() + if(!isliving(thrower)) + return toss_gun_hard(thrower, hit_atom) /obj/item/gun/proc/toss_gun_hard(mob/living/thrower, mob/living/target) //throw a gun at them. They don't expect it. @@ -307,6 +309,8 @@ /obj/item/gun/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(try_fire_gun(interacting_with, user, list2params(modifiers))) return ITEM_INTERACT_SUCCESS + if(chambered_attack_block == TRUE && can_shoot() && isliving(interacting_with)) + return ITEM_INTERACT_BLOCKING // block melee (etc), usually if waiting on fire delay return NONE /obj/item/gun/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) @@ -456,7 +460,7 @@ else //Smart spread sprd = round((((burst_spread_mult/burst_size) * iteration) - (0.5 + (burst_spread_mult * 0.25))) * (random_spread)) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src)) + if(!chambered.fire_casing(target, user, params, 0, suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) firing_burst = FALSE return FALSE @@ -517,7 +521,7 @@ return var/sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * total_random_spread) before_firing(target,user) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) + if(!chambered.fire_casing(target, user, params, 0, suppressed, zone_override, sprd, src)) shoot_with_empty_chamber(user) return else diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index fe1508d6377..d8064b7dc69 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -140,6 +140,8 @@ var/burst_fire_selection = FALSE /// If it has an icon for a selector switch indicating current firemode. var/selector_switch_icon = FALSE + /// Suppressor attached to the gun, if any + var/obj/item/suppressor/suppressor = null /obj/item/gun/ballistic/Initialize(mapload) . = ..() @@ -162,8 +164,14 @@ /obj/item/gun/ballistic/Destroy() QDEL_NULL(magazine) + QDEL_NULL(suppressor) return ..() +/obj/item/gun/ballistic/Exited(atom/movable/gone, direction) + . = ..() + if(gone == suppressor) + clear_suppressor() + /obj/item/gun/ballistic/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_ballistic)) @@ -533,7 +541,7 @@ return ITEM_INTERACT_FAILURE if(suppressed) - balloon_alert(user, "already has a supressor!") + balloon_alert(user, "already has a suppressor!") return ITEM_INTERACT_FAILURE if(!user.transferItemToLoc(tool, src)) @@ -594,27 +602,28 @@ return ..() ///Installs a new suppressor, assumes that the suppressor is already in the contents of src -/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) - suppressed = S - update_weight_class(w_class + S.w_class) //so pistols do not fit in pockets when suppressed +/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/new_suppressor) + suppressor = new_suppressor + suppressed = suppressor.suppression + update_weight_class(w_class + suppressor.w_class) //so pistols do not fit in pockets when suppressed update_appearance() /obj/item/gun/ballistic/clear_suppressor() if(!can_unsuppress) return - if(isitem(suppressed)) - var/obj/item/I = suppressed - update_weight_class(w_class - I.w_class) - return ..() + suppressed = SUPPRESSED_NONE + if(suppressor) + update_weight_class(w_class - suppressor.w_class) + suppressor = null + update_appearance() /obj/item/gun/ballistic/click_alt(mob/user) if(!suppressed || !can_unsuppress) return CLICK_ACTION_BLOCKING - var/obj/item/suppressor/S = suppressed if(!user.is_holding(src)) return CLICK_ACTION_BLOCKING - balloon_alert(user, "[S.name] removed") - user.put_in_hands(S) + balloon_alert(user, "[suppressor.name] removed") + user.put_in_hands(suppressor) clear_suppressor() return CLICK_ACTION_SUCCESS @@ -695,7 +704,7 @@ . += "It does not seem to have a round chambered." if (bolt_locked) . += "The [bolt_wording] is locked back and needs to be released before firing or de-fouling." - if (suppressed) + if (suppressor) . += "It has a suppressor [can_unsuppress ? "attached that can be removed with alt+click." : "that is integral or can't otherwise be removed."]" if(can_misfire) . += span_danger("You get the feeling this might explode if you fire it...") @@ -873,3 +882,5 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "suppressor" w_class = WEIGHT_CLASS_TINY + /// How quiet should the gun be when we're installed? + var/suppression = SUPPRESSED_QUIET diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index a404221fb1d..14b0accfd22 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -329,6 +329,7 @@ inhand_icon_state = "arg" accepted_magazine_type = /obj/item/ammo_box/magazine/recharge empty_indicator = TRUE + bolt_type = BOLT_TYPE_OPEN fire_delay = 2 can_suppress = FALSE burst_size = 0 @@ -340,9 +341,9 @@ /obj/item/gun/ballistic/automatic/battle_rifle name = "\improper NT BR-38 battle rifle" - desc = "Nanotrasen's prototype security weapon, found exclusively in the hands of their private security teams. Chambered in .38 pistol rounds. \ - Ignore that this makes it technically a carbine. And that it functions as a designated marksman rifle. Marketing weren't being very co-operative \ - when it came time to name the gun. That, and the endless arguments in board rooms about exactly what designation the gun is meant to be." + desc = "Nanotrasen's latest prototype .38 Special longarm, found exclusively in the hands of their private security teams. \ + Technically a pistol-caliber carbine, despite the name and its use as a designated marksman rifle. Acceleration technology \ + enables improved ballistic performance, but necessitates maintenance." icon = 'icons/obj/weapons/guns/wide_guns.dmi' icon_state = "battle_rifle" inhand_icon_state = "battle_rifle" @@ -390,6 +391,22 @@ /obj/item/gun/ballistic/automatic/battle_rifle/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 2) + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The BR-38 is Nanotrasen's latest foray into entirely in-house, standard-issue-ready, accelerator-assisted ballistic firearms.
    \ +
    \ + The acceleration rail built into the barrel assembly boosts fired projectiles to higher velocities than unassisted bullets, \ + allowing even less powerful cartridges, such as the venerable .38 Special, to have improved ballistic performance and stopping power. \ + Even though the chambering makes this more of a pistol-caliber carbine than a battle rifle, countless arguments in both the marketing office \ + and the corporate boardroom about the name meant that something had to give; in this case, the slightly misleading designation.
    \ +
    \ + It's hard to cover up everything about its troubled development, though.
    \ +
    \ + In a sour twist of irony for Nanotrasen's historical issues with ballistics-based security weapons, the BR-38 has one significant flaw. \ + It is possible for the weapons system to suffer from unintended discombulations due to closed heat distribution systems, should the weapon be tampered with. \ + Nanotrasen's weapons R&D teams are still working on this issue, while also trying to work out why the weapon's onboard computation systems \ + suffer from so many calculation errors, before moving onto a full commercial rollout." \ + ) register_context() /obj/item/gun/ballistic/automatic/battle_rifle/add_context(atom/source, list/context, obj/item/held_item, mob/user) @@ -399,26 +416,15 @@ context[SCREENTIP_CONTEXT_LMB] = "Reset System" return CONTEXTUAL_SCREENTIP_SET -/obj/item/gun/ballistic/automatic/battle_rifle/examine_more(mob/user) - . = ..() - . += span_notice("Looking down at \the [src], you recall something you read in a promotional pamphlet... ") - - . += span_info("The BR-38 possesses an acceleration rail that launches bullets at higher than typical velocity. \ - This allows even less powerful cartridges to put out significant amounts of stopping power.") - - . += span_notice("However, you also remember some of the rumors... ") - - . += span_notice("In a sour twist of irony for Nanotrasen's historical issues with ballistics-based security weapons, the BR-38 has one significant flaw. \ - It is possible for the weapon to suffer from unintended discombulations due to closed heat distribution systems should the weapon be tampered with. \ - R&D are working on this issue before the weapon sees commercial sales. That, and trying to work out why the weapon's onboard computation systems suffer \ - from so many calculation errors.") - /obj/item/gun/ballistic/automatic/battle_rifle/examine(mob/user) . = ..() if(shots_before_degradation) . += span_notice("[src] can fire [shots_before_degradation] more times before risking system degradation.") else . += span_notice("[src] is in the process of system degradation. It is currently at stage [degradation_stage] of [degradation_stage_max]. Use a multitool on [src] to recalibrate. Alternatively, insert it into a weapon recharger.") + . += span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src].") + + /obj/item/gun/ballistic/automatic/battle_rifle/update_icon_state() . = ..() @@ -527,6 +533,7 @@ /// proc to handle our detonation /obj/item/gun/ballistic/automatic/battle_rifle/proc/fucking_explodes_you() explosion(src, devastation_range = 1, heavy_impact_range = 3, light_impact_range = 6, explosion_cause = src) + //component for seclight attachment /obj/item/gun/ballistic/automatic/battle_rifle/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index 159baba883a..91df1c1a22c 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -31,28 +31,11 @@ /obj/item/gun/ballistic/bow/divine/Initialize(mapload) . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) - AddComponent(/datum/component/effect_remover, \ - success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ - success_forcesay = "BOW-GONE FOUL MAGIKS!!", \ - tip_text = "Clear rune", \ - on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ - effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune) \ - ) - AddElement(/datum/element/bane, mob_biotypes = MOB_SPIRIT, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + AddElement(/datum/element/nullrod_core) + RegisterSignal(src, COMSIG_ITEM_SUBTYPE_PICKER_SELECTED, PROC_REF(on_selected)) -/obj/item/gun/ballistic/bow/divine/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) +/obj/item/gun/ballistic/bow/divine/proc/on_selected(datum/source, obj/item/nullrod/old_weapon, mob/picker) SIGNAL_HANDLER - if(!istype(target, /obj/effect/rune)) - return - - var/obj/effect/rune/target_rune = target - if(target_rune.log_when_erased) - user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE - -/obj/item/gun/ballistic/bow/divine/with_quiver/Initialize(mapload) - . = ..() new /obj/item/storage/bag/quiver/holy(loc) /// Ashen bow, crafted from watcher sinew and animal bones. diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 7add28b17e0..d4573f0c36e 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -66,23 +66,28 @@ for an underbarrel-mounted disruptor, similar in operation to the standalone SC/FISHER. Chambered in 10mm." desc_controls = "Right-click to use the underbarrel disruptor. Two shots maximum between self-charges." icon_state = "pistol_evil_fisher" - suppressed = TRUE + suppressed = SUPPRESSED_QUIET can_suppress = FALSE can_unsuppress = FALSE var/obj/item/gun/energy/recharge/fisher/underbarrel -/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/examine_more(mob/user) - . = ..() - . += span_notice("The Ansem/SC is a Scarborough Arms-manufactured overhaul suite for the also Scarborough Arms-manufactured Ansem handgun, designed for special \ - operators who like to operate operationally, and/or people who really, really hate lightbulbs, and tend to fight people who really like lightbulbs. \ - The slide is lengthened and has an integrated suppressor, while a compact kinetic light disruptor was mounted underneath the barrel. \ - Scarborough Arms has never actually officially responded to allegations that they're involved with the modification and/or manufacture \ - of the SC/FISHER or similar disruptor weapons. Operators are reminded that kinetic light disruptors do not actually physically harm targets.
    \ - Caveat emptor.") - /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Initialize(mapload) . = ..() underbarrel = new /obj/item/gun/energy/recharge/fisher(src) + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The Ansem/SC is a Scarborough Arms overhaul suite for their own Ansem handgun, designed for special operators who operate operationally, \ + especially against people who like using lightbulbs.
    \ +
    \ + The slide is chopped down, with the front half of the handgun featuring a monolithic integral suppressor built around the barrel, \ + and a compact kinetic light disruptor mounted underneath the barrel assembly. The integral suppressor is engineered to not affect \ + ballistic performance nor affect the concealability of the handgun, leading to a surprisingly robust firearm.
    \ +
    \ + Scarborough Arms has never actually addressed allegations of their involvement with the modification and/or manufacture \ + of the SC/FISHER or similar disruptor weapons. Prospective operators are reminded that kinetic light disruptors do not actually physically harm targets.
    \ +
    \ + Caveat emptor." \ + ) /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/Destroy() QDEL_NULL(underbarrel) @@ -90,7 +95,8 @@ /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/try_fire_gun(atom/target, mob/living/user, params) if(LAZYACCESS(params2list(params), RIGHT_CLICK)) - return underbarrel.try_fire_gun(target, user, params) + underbarrel.try_fire_gun(target, user, params) + return return ..() /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index e769a69eb47..2a18fe54d70 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -308,6 +308,21 @@ SET_BASE_PIXEL(-8, 0) +/obj/item/gun/ballistic/rifle/boltaction/pipegun/Initialize(mapload) + . = ..() + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to recall a tale about [src]."), \ + lore = "You were told this story, in hushed tones, from a wizened man in a grey jumpsuit...

    \ + It is said that the first slaying committed on a Nanotrasen space station was by an assistant.

    \ + That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.

    \ + They carry the weight of this act visibly; the grey jumpsuit. Breathing deeply filtered air. And with bloodsoaked yellow hands clenched into fists.

    \ + Eyes, sharp and waiting. Hunters in the dark.

    \ + Eventually, these killing spirits sought to stake a claim on the metal tombs they were trapped within. Rejecting their status. Determined to be something more.

    \ + This weapon is one such tool. And it is a grim one indeed. Wrought from scrap, pulled from the station's walls and floors and the very nails holding it together.
    \ +
    \ + It is a symbol that the true masters of this place are not those who merely inhabit it. But the one willing to twist it towards a killing intent." \ + ) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/add_bayonet_point() AddComponent(/datum/component/bayonet_attachable, offset_x = 35, offset_y = 10) @@ -315,17 +330,6 @@ . = ..() do_sparks(1, TRUE, src) -/obj/item/gun/ballistic/rifle/boltaction/pipegun/examine_more(mob/user) - . = ..() - . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") - - . += span_info("It's said that the first slaying committed on a Nanotrasen space station was by an assistant.") - . += span_info("That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.") - . += span_info("They carry the weight of this act visibly; the grey jumpsuit. Breathing deeply filtered air. And with bloodsoaked yellow hands clenched into fists. Eyes, sharp and waiting. Hunters in the dark.") - . += span_info("Eventually, these killing spirits sought to stake a claim on the metal tombs they were trapped within. Rejecting their status. Determined to be something more.") - . += span_info("This weapon is one such tool. And it is a grim one indeed. Wrought from scrap, pulled from the station's walls and floors and the very nails holding it together.") - . += span_info("It is a symbol that the true masters of this place are not those who merely inhabit it. But the one willing to twist it towards a killing intent.") - /obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol name = "pipe pistol" desc = "It is foolish to think that anyone wearing the grey is incapable of hurting you, simply because they are not baring their teeth." diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index bd0a12df573..42a94cb9f73 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -50,6 +50,7 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." can_be_sawn_off = TRUE + chambered_attack_block = TRUE // necessary for riot shotgun due to fire_delay and wanting to shoot point blank without accidental melee //component for seclight attachment /obj/item/gun/ballistic/shotgun/riot/add_seclight_point() diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 670f0b0c370..c9b4455919a 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -24,6 +24,7 @@ gun = new(src) battery = new(src) START_PROCESSING(SSobj, src) + AddElement(/datum/element/drag_pickup) /obj/item/minigunpack/Destroy() if(!QDELETED(gun)) @@ -64,15 +65,6 @@ if(armed) user.dropItemToGround(gun, TRUE) -/obj/item/minigunpack/mouse_drop_dragged(atom/over_object, mob/user) - if(armed) - return - - if(iscarbon(user)) - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - user.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/minigunpack/update_icon_state() icon_state = armed ? "notholstered" : "holstered" return ..() diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index acc34edc4b2..7ed3e9f9816 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -106,7 +106,7 @@ no_charge_state = "crossbow_empty" w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) - suppressed = TRUE + suppressed = SUPPRESSED_QUIET ammo_type = list(/obj/item/ammo_casing/energy/bolt) recharge_time = 2 SECONDS holds_charge = TRUE @@ -131,30 +131,43 @@ no_charge_state = "crossbowlarge_empty" w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) - suppressed = null + suppressed = SUPPRESSED_NONE ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) /// A silly gun that does literally zero damage, but disrupts electrical sources of light, like flashlights. /obj/item/gun/energy/recharge/fisher name = "\improper SC/FISHER disruptor" - desc = "A self-recharging, permanently suppressed, and very haphazardly modified accelerator handgun that does literally nothing to anything except light fixtures and cameras. \ - Can fire twice before requiring a recharge, with bolts passing through machinery, but demands precision." + desc = "A self-recharging, integrally suppressed, modified kinetic accelerator that does no damage, \ + but disrupts electronics like lights, APCs, and security cameras. \ + Can fire twice before requiring a recharge. \ + Bolts can be fired around machinery, but the precise nature of shooting light fixtures demands a skillful hand." icon_state = "fisher" base_icon_state = "fisher" dry_fire_sound_volume = 10 w_class = WEIGHT_CLASS_SMALL holds_charge = TRUE - suppressed = TRUE + suppressed = SUPPRESSED_QUIET recharge_time = 1.2 SECONDS ammo_type = list(/obj/item/ammo_casing/energy/fisher) -/obj/item/gun/energy/recharge/fisher/examine_more(mob/user) +/obj/item/gun/energy/recharge/fisher/Initialize(mapload) . = ..() - . += span_notice("The SC/FISHER is an illegally-modified kinetic accelerator cut down and refit into a disassembled miniature energy gun chassis, \ - with its pressure chamber attenuated to launch kinetic bolts that temporarily disrupt flashlights, cameras, and certain other electronics. \ - This effect also works on cyborg headlamps, and works longer in melee.

    \ - While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources.
    \ - Caveat emptor.") + AddElement(/datum/element/examine_lore, \ + lore_hint = span_notice("You can [EXAMINE_HINT("look closer")] to learn a little more about [src]."), \ + lore = "The SC/FISHER is an illegally-modified kinetic accelerator that's been cut down and refit into a miniature energy gun chassis, \ + optimized for temporary, but effective, electronic warfare.
    \ +
    \ + The reengineered kinetic accelerator central to the SC/FISHER's functionality has been modified for its kinetic bolts to \ + temporarily disrupt flashlights, cameras, APCs, and pAI speech modules, in return for dealing no damage. \ + This effect works longer against targets struck with the SC/FISHER either in melee or by having it thrown at them, but \ + you probably shouldn't be throwing it at people.
    \ +
    \ + While some would argue that sacrificing damage for a light-disrupting, fixture-breaking gimmick \ + makes the SC/FISHER a dead-end in equipment development, others argue that it is both amusing and tactically sound \ + to be able to shoot at light sources and pesky pAIs to disrupt their function.
    \ +
    \ + Caveat emptor." \ + ) /obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index a20d3423cdc..3c09256f2b3 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -166,7 +166,7 @@ base_pixel_x = 0 pixel_x = 0 force = 2 //Also very weak because it's smaller - suppressed = TRUE //Softer fire sound + suppressed = SUPPRESSED_QUIET //Softer fire sound can_unsuppress = FALSE //Permanently silenced syringes = list(new /obj/item/reagent_containers/syringe()) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 72bf690812b..f183c7de098 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -648,6 +648,8 @@ var/mob/living/living_target = target living_target.block_projectile_effects() return FALSE + if(HAS_TRAIT(target, TRAIT_UNHITTABLE_BY_LASERS) && (armor_flag & LASER)) + return FALSE if(!ignore_source_check && firer && !direct_target) if(target == firer || (target == firer.loc && ismecha(firer.loc)) || (target in firer.buckled_mobs)) return FALSE diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 723230bc794..963e33b25ff 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -90,7 +90,7 @@ heater_coefficient *= micro_laser.tier /obj/machinery/chem_heater/item_interaction(mob/living/user, obj/item/held_item, list/modifiers) - if(user.combat_mode || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + if(user.combat_mode && !is_reagent_container(held_item) && !held_item.is_open_container() || (held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) return NONE if(!QDELETED(beaker)) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index b44ff4b098d..b7204f544fe 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -179,7 +179,7 @@ return containers /obj/machinery/chem_master/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + if(user.combat_mode && !is_reagent_container(tool) && !tool.is_open_container() || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) return NONE if(is_reagent_container(tool) && tool.is_open_container()) diff --git a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm index 9ea2603cdf6..e360c24f270 100644 --- a/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm +++ b/code/modules/reagents/chemistry/machinery/portable_chem_mixer.dm @@ -22,8 +22,8 @@ /obj/item/storage/portable_chem_mixer/Initialize(mapload) . = ..() - register_context() + AddElement(/datum/element/drag_pickup) /obj/item/storage/portable_chem_mixer/Destroy() dispensable_reagents.Cut() @@ -239,13 +239,6 @@ update_appearance() return TRUE -/obj/item/storage/portable_chem_mixer/mouse_drop_dragged(atom/over_object) - if(ismob(loc)) - var/mob/M = loc - if(istype(over_object, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over_object - M.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/storage/portable_chem_mixer/click_alt(mob/living/user) if(!atom_storage.locked) balloon_alert(user, "lock first to use alt eject!") diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 4cebd1613fe..a722e9b85dc 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -219,7 +219,7 @@ return items_transfered /obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1)) + if(user.combat_mode && !is_reagent_container(tool) && !tool.is_open_container() || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1)) return ITEM_INTERACT_SKIP_TO_ATTACK //add the beaker diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 000d0ca3cf9..7091f8b2c58 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -267,7 +267,7 @@ inverse_chem = /datum/reagent/inverse/healing/convermol chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/oxycalc = 2.5 * REM * (current_cycle-1) if(!overdosed) @@ -299,7 +299,7 @@ /// A cooldown for spacing bursts of stamina damage COOLDOWN_DECLARE(drowsycd) -/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update need_mob_update = affected_mob.adjustOxyLoss(-4.5 * REM * seconds_per_tick * normalise_creation_purity(), updating_health = FALSE, required_biotype = affected_biotype, required_respiration_type = affected_respiration_type) @@ -331,11 +331,11 @@ /// Temperatures below this number give radiation healing. var/rads_heal_threshold = 100 -/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() rads_heal_threshold = rand(rads_heal_threshold - 50, rads_heal_threshold + 50) // Basically this means 50K and below will always give the radiation heal, and upto 150K could. Calculated once. -/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/chemtemp = min(holder.chem_temp, 1000) chemtemp = chemtemp ? chemtemp : T0C //why do you have null sweaty @@ -373,7 +373,7 @@ ph = 9.2 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 for(var/r in affected_mob.reagents.reagent_list) @@ -594,7 +594,7 @@ send_alert(user) user.add_traits(subject_traits, type) -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() var/need_mob_update need_mob_update = affected_mob.adjustStaminaLoss(-12.5 * REM * seconds_per_tick, updating_stamina = FALSE) //SKYRAT EDIT ADDITION - COMBAT - makes your heart beat faster, fills you with energy. For miners diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 8e1dae733b0..30aaddf5ff8 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -2152,9 +2152,10 @@ taste_description = "simpler times" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, seconds_per_tick, times_fired) +/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/drinker, seconds_per_tick, times_fired) . = ..() - if(SPT_PROB(10, seconds_per_tick) && istype(metabolizer)) + if(SPT_PROB(10, seconds_per_tick) && ishuman(drinker)) + var/mob/living/carbon/human/metabolizer = drinker metabolizer.age += 1 if(metabolizer.age > 70) metabolizer.set_facial_haircolor("#cccccc", update = FALSE) diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index f8aa1c37d39..cab73988509 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -226,7 +226,7 @@ holder.remove_reagent(/datum/reagent/consumable/capsaicin, seconds_per_tick) return ..() || . -/datum/reagent/milk/used_on_fish(obj/item/fish/fish) +/datum/reagent/consumable/milk/used_on_fish(obj/item/fish/fish) if(HAS_TRAIT(fish, TRAIT_FISH_MADE_OF_BONE)) fish.repair_damage(fish.max_integrity * max(fish.get_hunger() * 0.5, 0.12)) fish.sate_hunger() @@ -1375,7 +1375,29 @@ quality = DRINK_NICE taste_description = "mild aromatics" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - + /datum/reagent/consumable/ethanol/bitters_soda/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() affected_mob.adjust_disgust(-5 * REM * seconds_per_tick) + +/datum/reagent/consumable/lean + name = "Lean" + description = "The drank that makes you go wheezy." + color = "#DE55ED" + quality = DRINK_GOOD + taste_description = "purple and a hint of opioid." + addiction_types = list(/datum/addiction/opioids = 6) + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.2 * REM + +/datum/reagent/consumable/lean/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + . = ..() + affected_mob.adjust_jitter(2.5 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_stutter(2.25 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drugginess(2 SECONDS * REM * seconds_per_tick) + if(SPT_PROB(15, seconds_per_tick)) + affected_mob.emote(pick("taunt","twitch","shiver","laugh","moan","blush","stare")) + if(current_cycle > 16 && SPT_PROB(3.5, seconds_per_tick)) + affected_mob.adjust_dizzy(15 SECONDS * REM * seconds_per_tick) + affected_mob.adjust_drowsiness(7.5 SECONDS * REM * seconds_per_tick) + affected_mob.emote("drool") diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 85dba88c139..c22b6bb7331 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -226,6 +226,12 @@ /datum/reagent/water/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() + + var/obj/item/organ/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver?.damage && !IS_ROBOTIC_ORGAN(liver) && !(liver.organ_flags & ORGAN_FAILING)) + var/healing_bonus = liver.healing_factor * liver.maxHealth + liver.apply_organ_damage(-healing_bonus * REM * seconds_per_tick) + var/water_adaptation = HAS_TRAIT(affected_mob, TRAIT_WATER_ADAPTATION) if(affected_mob.blood_volume) var/blood_restored = water_adaptation ? 0.3 : 0.1 @@ -665,11 +671,12 @@ "Your appendages begin morphing." = MUT_MSG_EXTENDED, "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) -/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - if(!(affected_mob.dna?.species) || !(affected_mob.mob_biotypes & affected_biotype)) + var/mob/living/carbon/affected_human = affected_mob + if(!(affected_human.dna?.species) || !(affected_human.mob_biotypes & affected_biotype)) return if(SPT_PROB(5, seconds_per_tick)) @@ -685,14 +692,14 @@ for(var/i in mutationtexts) if(mutationtexts[i] == filter) pick_ur_fav += i - to_chat(affected_mob, span_warning("[pick(pick_ur_fav)]")) + to_chat(affected_human, span_warning("[pick(pick_ur_fav)]")) if(current_cycle >= CYCLES_TO_TURN) var/datum/species/species_type = race - //affected_mob.set_species(species_type) //ORIGINAL - affected_mob.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION + //affected_human.set_species(species_type) //ORIGINAL + affected_human.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION holder.del_reagent(type) - to_chat(affected_mob, span_warning("You've become \a [LOWER_TEXT(initial(species_type.name))]!")) + to_chat(affected_human, span_warning("You've become \a [LOWER_TEXT(initial(species_type.name))]!")) return /datum/reagent/mutationtoxin/classic //The one from plasma on green slimes @@ -749,22 +756,26 @@ taste_description = "grandma's gelatin" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) - if(isjellyperson(affected_mob)) - to_chat(affected_mob, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) - var/species_type = pick(subtypesof(/datum/species/jelly)) - //affected_mob.set_species(species_type) //ORIGINAL - affected_mob.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION - holder.del_reagent(type) - return UPDATE_MOB_HEALTH - if(current_cycle >= CYCLES_TO_TURN) //overwrite since we want subtypes of jelly +/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(!ishuman(affected_mob)) + return ..() + var/mob/living/carbon/affected_human = affected_mob + if(isjellyperson(affected_human)) var/datum/species/species_type = pick(subtypesof(race)) - //affected_mob.set_species(species_type) //ORIGINAL - affected_mob.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION + //affected_human.set_species(species_type) //ORIGINAL + affected_human.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION holder.del_reagent(type) - to_chat(affected_mob, span_warning("You've become \a [initial(species_type.name)]!")) + to_chat(affected_human, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) return UPDATE_MOB_HEALTH - return ..() + if(current_cycle < CYCLES_TO_TURN) //overwrite since we want subtypes of jelly + return ..() + var/datum/species/species_type = pick(subtypesof(race)) + //affected_human.set_species(species_type) //ORIGINAL + affected_human.set_species(species_type, icon_update = TRUE, pref_load = FALSE) //SKYRAT EDIT CHANGE - CUSTOMIZATION + holder.del_reagent(type) + to_chat(affected_human, span_warning("You've become \a [initial(species_type.name)]!")) + return UPDATE_MOB_HEALTH + /datum/reagent/mutationtoxin/golem name = "Golem Mutation Toxin" @@ -848,13 +859,14 @@ taste_description = "slime" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/affected_mob, seconds_per_tick, times_fired) +/datum/reagent/mulligan/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) . = ..() - if (!istype(affected_mob)) + if(!ishuman(affected_mob)) return - to_chat(affected_mob, span_warning("You grit your teeth in pain as your body rapidly mutates!")) - affected_mob.visible_message("[affected_mob] suddenly transforms!") - randomize_human_normie(affected_mob) + var/mob/living/carbon/human/affected_human = affected_mob + to_chat(affected_human, span_boldwarning("You grit your teeth in pain as your body rapidly mutates!")) + affected_human.visible_message("[affected_human] suddenly transforms!") + randomize_human_normie(affected_human) /datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" @@ -2947,9 +2959,16 @@ need_mob_update += drinker.adjustFireLoss(-2 * REM * seconds_per_tick, updating_health = FALSE) if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) drinker.blood_volume += 3 * REM * seconds_per_tick - if(drinker.mob_biotypes & MOB_ROBOTIC) // Bubber edit starrt + // Slowly regulates your body temp + drinker.adjust_bodytemperature((drinker.get_body_temp_normal() - drinker.bodytemperature) / 5) + for(var/datum/reagent/reagent as anything in drinker.reagents.reagent_list) + if(reagent != src) + drinker.reagents.remove_reagent(reagent.type, 2 * reagent.purge_multiplier * REM * seconds_per_tick) + // BUBBER EDIT BEGIN + if(drinker.mob_biotypes & MOB_ROBOTIC) var/heal_amount = -2 * REM * seconds_per_tick //might as well keep this line as long as the previous - drinker.heal_bodypart_damage(heal_amount, heal_amount, required_bodytype = BODYTYPE_ROBOTIC) //bubber edit end + drinker.heal_bodypart_damage(heal_amount, heal_amount, required_bodytype = BODYTYPE_ROBOTIC) + // BUBBER EDIT END else need_mob_update = drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * seconds_per_tick, 150) need_mob_update += drinker.adjustToxLoss(2 * REM * seconds_per_tick, updating_health = FALSE) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index e0941c76a02..1ecdc0afc75 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -313,17 +313,19 @@ addtimer(TRAIT_CALLBACK_REMOVE(fish, TRAIT_FISH_ELECTROGENESIS, type), fish.feeding_frequency * 0.75, TIMER_UNIQUE|TIMER_OVERRIDE) return TRUE -/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/affected_mob) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - affected_mob.physiology.siemens_coeff *= 2 + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.physiology.siemens_coeff *= 2 -/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/human/affected_mob) +/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/affected_mob) . = ..() - if(!istype(affected_mob)) + if(!ishuman(affected_mob)) return - affected_mob.physiology.siemens_coeff *= 0.5 + var/mob/living/carbon/human/affected_human = affected_mob + affected_human.physiology.siemens_coeff *= 0.5 /datum/reagent/teslium/energized_jelly name = "Energized Jelly" diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 01250e80bf0..f1b3dfdbff2 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -230,6 +230,7 @@ else spawned_mob = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class spawned_mob.faction |= mob_faction + ADD_TRAIT(spawned_mob, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(prob(50)) for(var/j in 1 to rand(1, 3)) step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 4682faaca8b..f38ce9275dd 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -21,9 +21,9 @@ delete_extract(holder) /datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder) - var/obj/item/slime_extract/M = holder.my_atom - if(M.extract_uses <= 0 && !results.len) //if the slime doesn't output chemicals - qdel(M) + var/obj/item/slime_extract/extract = holder.my_atom + if(!isnull(extract) && extract.extract_uses <= 0 && !length(results)) //if the slime doesn't output chemicals + qdel(extract) //Grey /datum/chemical_reaction/slime/slimespawn diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index f79dc3f3f27..b1e15dc1efb 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -150,6 +150,7 @@ var/punctuation = ismob(target) ? "!" : "." + user.changeNext_move(CLICK_CD_MELEE) user.visible_message( span_danger("[user] splashes the contents of [src] onto [target][punctuation]"), span_danger("You splash the contents of [src] onto [target][punctuation]"), diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm index d832f15d304..c70b49891c4 100644 --- a/code/modules/reagents/reagent_containers/applicator.dm +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -31,6 +31,7 @@ if(!canconsume(target_mob, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target_mob == user) target_mob.visible_message(span_notice("[user] attempts to [apply_method] [src].")) if(self_delay) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 8c6894b69da..cccc58abc1e 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -44,6 +44,7 @@ if(!canconsume(target, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target == user) user.visible_message( span_notice("[user] swallows some of the contents of \the [src]."), diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index 25123589f78..6b825d2bf7c 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -69,6 +69,7 @@ if(!canconsume(target_mob, user)) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(target_mob != user) target_mob.visible_message( span_danger("[user] attempts to feed [target_mob] something from [src]."), @@ -331,6 +332,10 @@ ITEM_SLOT_DEX_STORAGE ) +/obj/item/reagent_containers/cup/bucket/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /datum/armor/cup_bucket melee = 10 fire = 75 diff --git a/code/modules/reagents/reagent_containers/cups/drinks.dm b/code/modules/reagents/reagent_containers/cups/drinks.dm index f1a8ade6ff9..4fc28f66d37 100644 --- a/code/modules/reagents/reagent_containers/cups/drinks.dm +++ b/code/modules/reagents/reagent_containers/cups/drinks.dm @@ -18,6 +18,8 @@ . = ..() if(!.) //if the bottle wasn't caught var/mob/thrower = throwingdatum?.get_thrower() + if(!istype(thrower)) + return smash(hit_atom, thrower, throwingdatum) /obj/item/reagent_containers/cup/glass/proc/smash(atom/target, mob/thrower, datum/thrownthing/throwingdatum, break_top = FALSE) @@ -72,6 +74,10 @@ custom_materials = list(/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT) volume = 150 +/obj/item/reagent_containers/cup/glass/trophy/gold_cup/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handles + /obj/item/reagent_containers/cup/glass/trophy/silver_cup name = "silver cup" desc = "Best loser!" @@ -84,6 +90,9 @@ custom_materials = list(/datum/material/silver=SMALL_MATERIAL_AMOUNT*8) volume = 100 +/obj/item/reagent_containers/cup/glass/trophy/silver_cup/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) //closed handle /obj/item/reagent_containers/cup/glass/trophy/bronze_cup name = "bronze cup" @@ -168,6 +177,10 @@ base_icon_state = "tea" inhand_icon_state = "coffee" +/obj/item/reagent_containers/cup/glass/mug/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + /obj/item/reagent_containers/cup/glass/mug/update_icon_state() icon_state = "[base_icon_state][reagents.total_volume ? null : "_empty"]" return ..() @@ -292,7 +305,7 @@ if(prob(flip_chance)) // landed upright src.visible_message(span_notice("[src] lands upright!")) var/mob/living/thrower = throwingdatum?.get_thrower() - if(thrower) + if(istype(thrower)) thrower.add_mood_event("bottle_flip", /datum/mood_event/bottle_flip) else // landed on its side animate(src, transform = matrix(prob(50)? 90 : -90, MATRIX_ROTATE), time = 3, loop = 0) @@ -396,6 +409,13 @@ if(icon_state == "colocup6") desc = "A cheap, mass produced style of cup, typically used at parties. Woah, this one is in red! What the hell?" +/obj/item/reagent_containers/cup/glass/colocup/lean + name = "lean" + desc = "A cup of that purple drank, the stuff that makes you go WHEEZY BABY." + icon_state = "lean" + list_reagents = list(/datum/reagent/consumable/lean = 20) + random_sprite = FALSE + //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass diff --git a/code/modules/reagents/reagent_containers/cups/mauna_mug.dm b/code/modules/reagents/reagent_containers/cups/mauna_mug.dm index 569cf815f09..dcee96829dd 100644 --- a/code/modules/reagents/reagent_containers/cups/mauna_mug.dm +++ b/code/modules/reagents/reagent_containers/cups/mauna_mug.dm @@ -13,6 +13,7 @@ /obj/item/reagent_containers/cup/maunamug/Initialize(mapload, vol) . = ..() + AddElement(/datum/element/cuffable_item) cell = new /obj/item/stock_parts/power_store/cell(src) /obj/item/reagent_containers/cup/maunamug/get_cell() diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index cfb72af6186..b780d47bf0c 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -28,9 +28,9 @@ var/fraction = min(amount_per_transfer_from_this / reagents.total_volume, 1) if(ismob(target)) + user.changeNext_move(CLICK_CD_MELEE) if(ishuman(target)) var/mob/living/carbon/human/victim = target - var/obj/item/safe_thing = victim.is_eyes_covered() if(safe_thing) @@ -45,13 +45,15 @@ to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() return ITEM_INTERACT_BLOCKING + else if(isalien(target)) //hiss-hiss has no eyes! to_chat(target, span_danger("[target] does not seem to have any eyes!")) return ITEM_INTERACT_BLOCKING - target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ - span_userdanger("[user] squirts something into your eyes!")) - + target.visible_message( + span_danger("[user] squirts something into [target]'s eyes!"), + span_userdanger("[user] squirts something into your eyes!"), + ) SEND_SIGNAL(target, COMSIG_MOB_REAGENTS_DROPPED_INTO_EYES, user, src, reagents, fraction) reagents.expose(target, TOUCH, fraction) var/mob/M = target diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 2a571264eb4..17958392e96 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -44,6 +44,7 @@ injected += injected_reagent.name var/contained = english_list(injected) log_combat(user, affected_mob, "attempted to inject", src, "([contained])") + user.changeNext_move(CLICK_CD_MELEE) if(!used_up && (ignore_flags || affected_mob.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) // Ignore flag should be checked first or there will be an error message. to_chat(affected_mob, span_warning("You feel a tiny prick!")) diff --git a/code/modules/reagents/reagent_containers/jerrycan.dm b/code/modules/reagents/reagent_containers/jerrycan.dm index 05f3149ae54..2d8ff258340 100644 --- a/code/modules/reagents/reagent_containers/jerrycan.dm +++ b/code/modules/reagents/reagent_containers/jerrycan.dm @@ -67,6 +67,11 @@ ///You can use this var to tone down the strength of the highlight for less shiny types of plastic. var/highlight_strenght = 1.0 +/obj/item/reagent_containers/cup/jerrycan/Initialize(mapload) + . = ..() + AddElement(/datum/element/cuffable_item) + update_appearance() + /obj/item/reagent_containers/cup/jerrycan/update_overlays() . = ..() @@ -91,10 +96,6 @@ if(cap_type) . += mutable_appearance(icon_file, "[base_icon_state]_cap_[cap_type]") -/obj/item/reagent_containers/cup/jerrycan/Initialize(mapload) - . = ..() - update_appearance() - /obj/item/reagent_containers/cup/jerrycan/opaque fill_icon_thresholds = null initial_reagent_flags = parent_type::initial_reagent_flags & ~TRANSPARENT diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index f459a08211b..a2ab93a34a4 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -44,6 +44,7 @@ to_chat(user, span_warning("[src] is empty!")) return ITEM_INTERACT_BLOCKING + user.changeNext_move(CLICK_CD_MELEE) if(interacting_with == user) interacting_with.visible_message(span_notice("[user] attempts to [apply_method] [src] on [user.p_them()]self.")) if(self_delay) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index d7f325acd0f..507d19af168 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -172,6 +172,7 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) var/rat_cap = CONFIG_GET(number/ratcap) if (LAZYLEN(SSmobs.cheeserats) < rat_cap && prob(33)) var/mob/living/basic/mouse/new_subject = new(king.drop_location()) + ADD_TRAIT(new_subject, TRAIT_SPAWNED_MOB, INNATE_TRAIT) playsound(new_subject, 'sound/mobs/non-humanoids/mouse/mousesqueek.ogg', 100) visible_message(span_warning("[new_subject] climbs out of [src]!")) @@ -560,7 +561,7 @@ GLOBAL_VAR_INIT(disposals_animals_spawned, 0) /obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(isitem(AM) && AM.CanEnterDisposals()) var/mob/thrower = throwingdatum?.get_thrower() - if((thrower && HAS_TRAIT(thrower, TRAIT_THROWINGARM)) || prob(75)) + if((istype(thrower) && HAS_TRAIT(thrower, TRAIT_THROWINGARM)) || prob(75)) AM.forceMove(src) visible_message(span_notice("[AM] lands in [src].")) update_appearance() diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 72ed3c6b67c..b8813f4396d 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -235,12 +235,11 @@ /datum/religion_sect/pyre/on_select() . = ..() AddComponent(/datum/component/sect_nullrod_bonus, list( - /obj/item/gun/ballistic/bow/divine/with_quiver = list( + /obj/item/gun/ballistic/bow/divine = list( /datum/religion_rites/blazing_star, ), )) - /datum/religion_sect/pyre/on_sacrifice(obj/item/flashlight/flare/candle/offering, mob/living/user) if(!istype(offering)) return diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e4a8b78a6e7..a11cf1ffa2a 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1043,6 +1043,23 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_ears_volume + name = "Volume-adjusting Cybernetic Ears" + desc = "A pair of volume-adjusting cybernetic ears" + id = "cybernetic_ears_volume" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 4 SECONDS + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT*5, + /datum/material/glass = SMALL_MATERIAL_AMOUNT*5, + /datum/material/silver = SMALL_MATERIAL_AMOUNT*5, + ) + build_path = /obj/item/organ/ears/cybernetic/volume + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_3 + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + /datum/design/cybernetic_ears_xray name = "Wall-penetrating Cybernetic Ears" desc = "A pair of wall-penetrating cybernetic ears." diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index 4cab2dd3f08..5ef5410deee 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -227,6 +227,7 @@ "ci-gloweyes-moth", "ci-welding-moth", "cybernetic_ears_whisper", + "cybernetic_ears_volume", "cybernetic_lungs_tier3", "cybernetic_stomach_tier3", "cybernetic_liver_tier3", diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index c087fb71c8b..d2e6c68b8be 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -113,22 +113,10 @@ Slimecrossing Armor throw_speed = 1 throw_range = 3 -/obj/item/clothing/head/peaceflower/proc/at_peace_check(mob/user) - if(iscarbon(user)) - var/mob/living/carbon/carbon_user = user - if(src == carbon_user.head) - to_chat(user, span_warning("You feel at peace. Why would you want anything else?")) - return TRUE - return FALSE - -/obj/item/clothing/head/peaceflower/attack_hand(mob/user, list/modifiers) - if(at_peace_check(user)) - return - return ..() - -/obj/item/clothing/head/peaceflower/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) - if(at_peace_check(user)) - return +/obj/item/clothing/head/peaceflower/can_mob_unequip(mob/user) + if(user.get_item_by_slot(slot_flags) == src) + to_chat(user, span_warning("You feel at peace. Why would you want anything else?")) + return FALSE return ..() /obj/item/clothing/suit/armor/heavy/adamantine diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index 6fb3f8c7c9d..e54e245c216 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -32,28 +32,34 @@ Self-sustaining extracts: return ..() /obj/item/autoslime/attack_self(mob/user) - var/reagentselect = tgui_input_list(user, "Reagent the extract will produce.", "Self-sustaining Reaction", sort_list(extract.activate_reagents, GLOBAL_PROC_REF(cmp_typepaths_asc))) - if(isnull(reagentselect)) + var/list/slime_reactions = GLOB.slime_extract_auto_activate_reactions[extract.type] + if(isnull(slime_reactions)) return - var/amount = 5 - var/secondary - if (user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + var/list/choices = list() + for(var/datum/chemical_reaction/slime/recipe as anything in slime_reactions) + var/list/req_chem_names = list() + for(var/datum/reagent/chem as anything in recipe.required_reagents) + req_chem_names += chem.name + var/choice = english_list(req_chem_names, and_text = ", ") + choices[choice] = recipe + + var/selectName = tgui_input_list(user, "Reagent(s) the extract will produce.", "Self-sustaining Reaction", choices) + if(isnull(selectName)) return - if(!reagentselect) + + var/datum/chemical_reaction/slime/recipeselect = choices[selectName] + if(isnull(recipeselect)) return - if(reagentselect == "lesser plasma") - amount = 4 - reagentselect = /datum/reagent/toxin/plasma - if(reagentselect == "holy water and uranium") - reagentselect = /datum/reagent/water/holywater - secondary = /datum/reagent/uranium + + if (!user.is_holding(src) || !can_interact(user)) + return + extract.forceMove(user.drop_location()) qdel(src) user.put_in_active_hand(extract) - extract.reagents.add_reagent(reagentselect,amount) - if(secondary) - extract.reagents.add_reagent(secondary,amount) + + extract.auto_activate_reaction(recipeselect) /obj/item/autoslime/examine(mob/user) . = ..() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 518adc09566..960fa43a61c 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -262,6 +262,7 @@ if (QDELETED(food)) return food.apply_status_effect(/datum/status_effect/slime_food, user) + ADD_TRAIT(food, TRAIT_SPAWNED_MOB, INNATE_TRAIT) stored_monkeys-- stored_monkeys = round(stored_monkeys, 0.1) //Prevents rounding errors diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 6dda978f72d..e01e08f3373 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -18,7 +18,6 @@ ///Which type of crossbred var/crossbreed_modification ///Reagents required for activation - var/list/activate_reagents = list() var/recurring = FALSE /obj/item/slime_extract/examine(mob/user) @@ -86,11 +85,69 @@ if(target_slime.applied_crossbreed_amount >= SLIME_EXTRACT_CROSSING_REQUIRED) target_slime.spawn_corecross() +/** +* Effect when activated by selfsustaining crossbreed or rainbow slime +* +* * arg1 - The reaction being triggered. If null, a random reaction is picked +*/ +/obj/item/slime_extract/proc/auto_activate_reaction(datum/chemical_reaction/slime/slime_reaction = null) + if(QDELETED(src)) + return + + if(isnull(slime_reaction)) + var/list/slime_reactions = GLOB.slime_extract_auto_activate_reactions[type] + if(isnull(slime_reactions)) + return + slime_reaction = pick(slime_reactions) + + var/list/required_reagents = slime_reaction.required_reagents + for(var/datum/reagent/chem as anything in required_reagents) + reagents.add_reagent(chem, required_reagents[chem]) + +/// An assoc list of slime extracts to their allowed recipes +GLOBAL_LIST_INIT(slime_extract_auto_activate_reactions, init_slime_auto_activate_reaction_list()) + +/proc/init_slime_auto_activate_reaction_list() + var/list/recipe_list = list() + + // Only reactions with these reagent requirements are allowed to auto_activate + var/list/auto_activate_reagent_whistlist = list( + /datum/reagent/toxin/plasma, + /datum/reagent/water, + /datum/reagent/blood, + /datum/reagent/water/holywater, + /datum/reagent/uranium, + /datum/reagent/uranium/radium, + /datum/reagent/toxin/slimejelly + ) + + var/list/slime_extract_paths = subtypesof(/obj/item/slime_extract) + for(var/datum/chemical_reaction/slime/slime_reaction as anything in subtypesof(/datum/chemical_reaction/slime)) + var/recipe_extract_type = slime_reaction.required_container + if(!(recipe_extract_type in slime_extract_paths)) + continue + + var/skip = FALSE + for(var/datum/reagent/chem as anything in slime_reaction.required_reagents) + if(!(chem in auto_activate_reagent_whistlist)) + skip = TRUE + break + if(skip) + continue + + var/list/recipes = recipe_list[recipe_extract_type] + if(!recipes) + recipes = list() + recipe_list[recipe_extract_type] = recipes + recipes.Add(new slime_reaction()) + + return recipe_list + + /obj/item/slime_extract/grey name = "grey slime extract" icon_state = "grey-core" crossbreed_modification = "reproductive" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -115,7 +172,6 @@ name = "gold slime extract" icon_state = "gold-core" crossbreed_modification = "symbiont" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -146,7 +202,6 @@ name = "silver slime extract" icon_state = "silver-core" crossbreed_modification = "consuming" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -174,7 +229,6 @@ name = "metal slime extract" icon_state = "metal-core" crossbreed_modification = "industrial" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -198,7 +252,6 @@ name = "purple slime extract" icon_state = "purple-core" crossbreed_modification = "regenerative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -217,7 +270,6 @@ name = "dark purple slime extract" icon_state = "dark-purple-core" crossbreed_modification = "self-sustaining" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -240,7 +292,6 @@ name = "orange slime extract" icon_state = "orange-core" crossbreed_modification = "burning" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -260,7 +311,6 @@ name = "yellow slime extract" icon_state = "yellow-core" crossbreed_modification = "charged" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -283,7 +333,6 @@ name = "red slime extract" icon_state = "red-core" crossbreed_modification = "sanguine" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -303,7 +352,6 @@ name = "blue slime extract" icon_state = "blue-core" crossbreed_modification = "stabilized" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -322,7 +370,6 @@ name = "dark blue slime extract" icon_state = "dark-blue-core" crossbreed_modification = "chilling" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -345,7 +392,6 @@ name = "pink slime extract" icon_state = "pink-core" crossbreed_modification = "gentle" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -373,7 +419,6 @@ name = "green slime extract" icon_state = "green-core" crossbreed_modification = "mutative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) /obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -397,7 +442,6 @@ name = "light pink slime extract" icon_state = "light-pink-core" crossbreed_modification = "loyal" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -421,7 +465,6 @@ name = "black slime extract" icon_state = "black-core" crossbreed_modification = "transformative" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -442,7 +485,6 @@ name = "oil slime extract" icon_state = "oil-core" crossbreed_modification = "detonating" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -466,7 +508,6 @@ name = "adamantine slime extract" icon_state = "adamantine-core" crossbreed_modification = "crystalline" - activate_reagents = list(/datum/reagent/toxin/plasma) /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -496,7 +537,6 @@ name = "bluespace slime extract" icon_state = "bluespace-core" crossbreed_modification = "warping" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE var/teleport_x = 0 var/teleport_y = 0 @@ -532,7 +572,6 @@ name = "pyrite slime extract" icon_state = "pyrite-core" crossbreed_modification = "prismatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -559,7 +598,6 @@ name = "cerulean slime extract" icon_state = "cerulean-core" crossbreed_modification = "recurring" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -579,7 +617,6 @@ name = "sepia slime extract" icon_state = "sepia-core" crossbreed_modification = "lengthened" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -601,7 +638,6 @@ name = "rainbow slime extract" icon_state = "rainbow-core" crossbreed_modification = "hyperchromatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. /obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) diff --git a/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm b/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm index 2f3320792bf..a3af891a65e 100644 --- a/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm +++ b/code/modules/shuttle/mobile_port/variants/custom/blueprints.dm @@ -203,7 +203,7 @@ return new_name = apply_text_macros(new_name) var/obj/item/hitting_implement = (locate(/obj/item/reagent_containers/cup/glass/bottle) in user.held_items) || user.get_item_for_held_index(hand) - if(!user.CanReach(attacked, hitting_implement)) + if(!attacked.IsReachableBy(user, hitting_implement.reach)) user.balloon_alert(user, "out of range!") return var/obj/item/reagent_containers/cup/glass/bottle/bottle = hitting_implement diff --git a/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm b/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm index ed88724c6fe..ff070188da6 100644 --- a/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm +++ b/code/modules/shuttle/mobile_port/variants/emergency/emergency_console.dm @@ -212,7 +212,7 @@ return CLICK_ACTION_SUCCESS /obj/machinery/computer/emergency_shuttle/proc/attempt_hijack_stage(mob/living/user) - if(!user.CanReach(src)) + if(!IsReachableBy(user)) return if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) to_chat(user, span_warning("You need your hands free before you can manipulate [src].")) diff --git a/code/modules/spells/spell_types/conjure/_conjure.dm b/code/modules/spells/spell_types/conjure/_conjure.dm index 5501f1055ca..cfc10f3e27d 100644 --- a/code/modules/spells/spell_types/conjure/_conjure.dm +++ b/code/modules/spells/spell_types/conjure/_conjure.dm @@ -58,6 +58,7 @@ var/atom/summoned_object = new summoned_object_type(spawn_place) summoned_object.flags_1 |= ADMIN_SPAWNED_1 + ADD_TRAIT(summoned_object, TRAIT_SPAWNED_MOB, INNATE_TRAIT) if(summon_lifespan > 0) QDEL_IN(summoned_object, summon_lifespan) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 5b58f625352..caa18d952b1 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -249,6 +249,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(required_organ_flag && !(organ_flags & required_organ_flag)) return FALSE damage = clamp(damage + damage_amount, 0, maximum) + SEND_SIGNAL(src, COMSIG_ORGAN_ADJUST_DAMAGE, damage_amount, maximum, required_organ_flag) . = (prev_damage - damage) // return net damage var/message = check_damage_thresholds(owner) prev_damage = damage diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index cebcc1f0853..26113c8bb87 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -7,8 +7,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times ///The overlay datum that actually draws stuff on the limb var/datum/bodypart_overlay/mutant/bodypart_overlay - /// The savefile_key of the preference this relates to. Used for the preferences UI. - var/preference ///With what DNA block do we mutate in mutate_feature() ? For genetics var/datum/dna_block/dna_block @@ -109,7 +107,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_HORNS - preference = "feature_lizard_horns" //dna_block = /datum/dna_block/feature/horn // SKYRAT EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_ENAMEL @@ -137,7 +134,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_FRILLS - preference = "feature_lizard_frills" //dna_block = /datum/dna_block/feature/frill // SKYRAT EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -164,7 +160,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_SNOUT - preference = "feature_lizard_snout" external_bodyshapes = BODYSHAPE_SNOUTED //dna_block = /datum/dna_block/feature/snout // SKYRAT EDIT REMOVAL - Customization - We have our own system to handle DNA. @@ -193,7 +188,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_ANTENNAE - preference = "feature_moth_antennae" //dna_block = /datum/dna_block/feature/moth_antenna // SKYRAT EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -282,7 +276,6 @@ Unlike normal organs, we're actually inside a persons limbs at all times zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_POD_HAIR - preference = "feature_pod_hair" use_mob_sprite_as_obj_sprite = TRUE //dna_block = /datum/dna_block/feature/pod_hair // BUBBER EDIT REMOVAL - We have our own system for handling DNA diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 1ca48b3303e..13579f48077 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -7,8 +7,6 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_EXTERNAL_SPINES - preference = "feature_lizard_spines" - //dna_block = /datum/dna_block/feature/spine // BUBBER EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_FLESH diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index bcfc4951b2b..5a0219d1dab 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -162,7 +162,6 @@ /obj/item/organ/tail/cat name = "tail" - preference = "feature_human_tail" bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat restyle_flags = EXTERNAL_RESTYLE_FLESH @@ -177,7 +176,7 @@ ///Cat tail bodypart overlay /datum/bodypart_overlay/mutant/tail/cat - feature_key = FEATURE_TAIL_GENERIC // BUBBER EDIT CHANGE - Customization - ORIGINAL: feature_key = FEATURE_TAIL + feature_key = FEATURE_TAIL_GENERIC // BUBBER EDIT CHANGE - Customization - ORIGINAL: feature_key = FEATURE_TAIL_CAT // color_source = ORGAN_COLOR_HAIR // SKYRAT EDIT REMOVAL /datum/bodypart_overlay/mutant/tail/cat/get_global_feature_list() @@ -185,7 +184,6 @@ /obj/item/organ/tail/monkey name = "monkey tail" - preference = "feature_monkey_tail" icon_state = "severedmonkeytail" dna_block = null bodypart_overlay = /datum/bodypart_overlay/mutant/tail/monkey @@ -257,7 +255,6 @@ /obj/item/organ/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." - preference = "feature_lizard_tail" bodypart_overlay = /datum/bodypart_overlay/mutant/tail/lizard diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index 12383051c7e..c9245abde03 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -5,8 +5,6 @@ name = "moth wings" desc = "Spread your wings and FLOOOOAAAAAT!" - preference = "feature_moth_wings" - //dna_block = /datum/dna_block/feature/moth_wing // BUBBER EDIT REMOVAL bodypart_overlay = /datum/bodypart_overlay/mutant/wings/moth diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 6181ce1105b..5f338749f40 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -294,7 +294,7 @@ /obj/item/organ/cyberimp/arm/toolkit/paperwork/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_tool = created_item.resolve() - if(istype(/obj/item/stamp/chameleon, potential_tool)) + if(istype(potential_tool, /obj/item/stamp/chameleon)) return FALSE balloon_alert(user, "experimental stamp unlocked") @@ -304,7 +304,7 @@ /obj/item/organ/cyberimp/arm/toolkit/toolset/emag_act(mob/user, obj/item/card/emag/emag_card) for(var/datum/weakref/created_item in items_list) var/obj/potential_knife = created_item.resolve() - if(istype(/obj/item/knife/combat/cyborg, potential_knife)) + if(istype(potential_knife, /obj/item/knife/combat/cyborg)) return FALSE balloon_alert(user, "integrated knife unlocked") diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm index 767e759e794..9c4b23d71f3 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_chest.dm @@ -335,6 +335,7 @@ added_throw_speed = /obj/item/organ/cyberimp/chest/spine/atlas::added_throw_speed strength_bonus = /obj/item/organ/cyberimp/chest/spine/atlas::strength_bonus core_applied = TRUE + icon_state = "herculean_implant_core" update_appearance() qdel(tool) return ITEM_INTERACT_SUCCESS diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 0c684e0d246..e8a40619073 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -157,7 +157,6 @@ visual = TRUE damage_multiplier = 2 - preference = "feature_human_ears" restyle_flags = EXTERNAL_RESTYLE_FLESH //dna_block = /datum/dna_block/feature/ears // BUBBER EDIT REMOVAL - Customization - We have our own system to handle DNA. @@ -225,15 +224,15 @@ name = "basic cybernetic ears" icon_state = "ears-c" desc = "A basic cybernetic organ designed to mimic the operation of ears." - damage_multiplier = 0.9 + damage_multiplier = 1.2 organ_flags = ORGAN_ROBOTIC failing_desc = "seems to be broken." /obj/item/organ/ears/cybernetic/upgraded name = "cybernetic ears" icon_state = "ears-c-u" - desc = "An advanced cybernetic ear, surpassing the performance of organic ears." - damage_multiplier = 0.5 + desc = "A cybernetic ear, surpassing the performance of organic ears." + damage_multiplier = 0.75 /obj/item/organ/ears/cybernetic/whisper name = "whisper-sensitive cybernetic ears" @@ -252,6 +251,13 @@ . = ..() REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) +/obj/item/organ/ears/cybernetic/volume + name = "volume-adjusting cybernetic ears" + icon_state = "ears-c-u" + desc = "Advanced cybernetic ears capable of dampening loud noises to protect their user." + bang_protect = 1 + damage_multiplier = 0.5 + // "X-ray ears" that let you hear through walls /obj/item/organ/ears/cybernetic/xray name = "wall-penetrating cybernetic ears" diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 29f3b8d5926..f84aefd96e9 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -754,13 +754,13 @@ // Low pressure. if(breath_pp) var/ratio = safe_breath_min / breath_pp - suffocator.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS)) + suffocator.apply_damage(min(5 * ratio, HUMAN_MAX_OXYLOSS), OXY) return mole_count * ratio / 6 // Zero pressure. if(suffocator.health >= suffocator.crit_threshold) - suffocator.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + suffocator.apply_damage(HUMAN_MAX_OXYLOSS, OXY) else - suffocator.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + suffocator.apply_damage(HUMAN_CRIT_MAX_OXYLOSS, OXY) /obj/item/organ/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/breather) // called by human/life, handles temperatures diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 5d93ee76541..574edae9f73 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -73,6 +73,17 @@ for (var/datum/tgui/window as anything in open_uis) window.send_full_update() +/** + * public + * + * Will force an update on non-static data for all viewers. + * Use when you are manually controlling UI data updates, + * such as when you are not using the auto-update system. + */ +/datum/proc/update_data_for_all_viewers() + for(var/datum/tgui/ui as anything in open_uis) + ui.send_update() + /** * public * diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index e8cdbfe5899..f8835beec9a 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -90,6 +90,7 @@ #include "abductor_baton_spell.dm" #include "ablative_hud.dm" #include "achievements.dm" +#include "alerts.dm" #include "anchored_mobs.dm" #include "anonymous_themes.dm" #include "antag_conversion.dm" @@ -109,6 +110,7 @@ #include "blindness.dm" #include "bloody_footprints.dm" #include "breath.dm" +#include "buckle.dm" #include "burning.dm" #include "cable_powernets.dm" #include "can_see.dm" @@ -172,7 +174,6 @@ #include "gloves_and_shoes_armor.dm" #include "greyscale_config.dm" #include "hallucination_icons.dm" -#include "heretic_knowledge.dm" #include "heretic_rituals.dm" #include "high_five.dm" #include "holder_loving.dm" @@ -251,6 +252,7 @@ #include "quirks.dm" #include "range_return.dm" #include "rcd.dm" +#include "reachable_soup.dm" #include "reagent_container_defaults.dm" #include "reagent_id_typos.dm" #include "reagent_mob_expose.dm" @@ -302,6 +304,7 @@ #include "strange_reagent.dm" #include "strippable.dm" #include "stuns.dm" +#include "style_hotswapping.dm" #include "subsystem_init.dm" #include "suit_storage_icons.dm" #include "surgeries.dm" @@ -314,9 +317,11 @@ #include "trait_addition_and_removal.dm" #include "traitor.dm" #include "traitor_mail_content_check.dm" +#include "trash_food.dm" #include "trauma_granting.dm" #include "turf_icons.dm" #include "tutorial_sanity.dm" +#include "unequip_defib.dm" #include "unit_test.dm" #include "verify_config_tags.dm" #include "verify_emoji_names.dm" diff --git a/code/modules/unit_tests/alerts.dm b/code/modules/unit_tests/alerts.dm new file mode 100644 index 00000000000..b54af943bcc --- /dev/null +++ b/code/modules/unit_tests/alerts.dm @@ -0,0 +1,32 @@ +/// Tests screen alerts are clickable +/datum/unit_test/alerts + var/was_clicked = FALSE + +/datum/unit_test/alerts/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + dummy.mock_client = new /datum/client_interface() + + var/old_usr = usr // Click still relies on usr so let's not mess this up + usr = dummy + + var/atom/movable/screen/alert/test_alert/clickme = dummy.throw_alert(TRAIT_SOURCE_UNIT_TESTS, /atom/movable/screen/alert/test_alert) + clickme.linked = src + clickme.Click() + if(!was_clicked) + TEST_FAIL("Screen alert was not clickable.") + + usr = old_usr + +/atom/movable/screen/alert/test_alert + var/datum/unit_test/alerts/linked + +/atom/movable/screen/alert/test_alert/Click(location, control, params) + . = ..() + if(!.) + return + + linked.was_clicked = TRUE + +/atom/movable/screen/alert/test_alert/Destroy() + linked = null + return ..() diff --git a/code/modules/unit_tests/area_contents.dm b/code/modules/unit_tests/area_contents.dm index 71fda983c61..c53a9143e6a 100644 --- a/code/modules/unit_tests/area_contents.dm +++ b/code/modules/unit_tests/area_contents.dm @@ -1,9 +1,9 @@ /// Verifies that an area's perception of their "turfs" is correct, and no other area overlaps with them /// Quite slow, but needed -/datum/unit_test/area_contents +/datum/unit_test/maptest_area_contents priority = TEST_LONGER -/datum/unit_test/area_contents/Run() +/datum/unit_test/maptest_area_contents/Run() // First, we check that there are no entries in more then one area // That or duplicate entries for (var/area/area_to_test in GLOB.areas) diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm index 3150aac342f..3cfe7c0f918 100644 --- a/code/modules/unit_tests/baseturfs.dm +++ b/code/modules/unit_tests/baseturfs.dm @@ -5,9 +5,9 @@ turf.assemble_baseturfs(initial(turf.baseturfs)) /// Validates that unmodified baseturfs tear down properly -/datum/unit_test/baseturfs_unmodified_scrape +/datum/unit_test/maptest_baseturfs_unmodified_scrape -/datum/unit_test/baseturfs_unmodified_scrape/Run() +/datum/unit_test/maptest_baseturfs_unmodified_scrape/Run() // What this is specifically doesn't matter, just as long as the test is built for it TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") @@ -21,14 +21,14 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Space should scrape away to space") -/datum/unit_test/baseturfs_unmodified_scrape/Destroy() +/datum/unit_test/maptest_baseturfs_unmodified_scrape/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() /// Validates that specially placed baseturfs tear down properly -/datum/unit_test/baseturfs_placed_on_top +/datum/unit_test/maptest_baseturfs_placed_on_top -/datum/unit_test/baseturfs_placed_on_top/Run() +/datum/unit_test/maptest_baseturfs_placed_on_top/Run() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior @@ -40,14 +40,14 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "Rock wall should've been scraped off, back into the expected type") -/datum/unit_test/baseturfs_placed_on_top/Destroy() +/datum/unit_test/maptest_baseturfs_placed_on_top/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() /// Validates that specially placed baseturfs BELOW tear down properly -/datum/unit_test/baseturfs_placed_on_bottom +/datum/unit_test/maptest_baseturfs_placed_on_bottom -/datum/unit_test/baseturfs_placed_on_bottom/Run() +/datum/unit_test/maptest_baseturfs_placed_on_bottom/Run() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior @@ -68,7 +68,7 @@ run_loc_floor_bottom_left.ScrapeAway() TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Rock wall should've scraped down back to plating (because it's a wall)") -/datum/unit_test/baseturfs_placed_on_bottom/Destroy() +/datum/unit_test/maptest_baseturfs_placed_on_bottom/Destroy() RESET_TO_EXPECTED(run_loc_floor_bottom_left) return ..() diff --git a/code/modules/unit_tests/blindness.dm b/code/modules/unit_tests/blindness.dm index 8836f80611f..9d47e45ca5a 100644 --- a/code/modules/unit_tests/blindness.dm +++ b/code/modules/unit_tests/blindness.dm @@ -1,4 +1,4 @@ -#define HAS_SCREEN_OVERLAY(mob, type) (locate(type) in flatten_list(mob.screens)) +#define HAS_SCREEN_OVERLAY(mob, type) (locate(type) in assoc_to_values(mob.screens)) #define HAS_CLIENT_COLOR(mob, type) (locate(type) in mob.client_colours) /** diff --git a/code/modules/unit_tests/buckle.dm b/code/modules/unit_tests/buckle.dm new file mode 100644 index 00000000000..e25ed9f5306 --- /dev/null +++ b/code/modules/unit_tests/buckle.dm @@ -0,0 +1,36 @@ +/// Test you can buckle yourself to a chair +/datum/unit_test/buckling_self + +/datum/unit_test/buckling_self/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + var/obj/structure/chair/chair = EASY_ALLOCATE() + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + dummy.MouseDrop(chair) + if(dummy.buckled != chair) + TEST_FAIL("The dummy failed to buckle themselves to a chair via mouse drop.") + + usr = old_usr + +/// Test you can buckle someone else to a chair +/datum/unit_test/buckling_others + +/datum/unit_test/buckling_others/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + var/mob/living/carbon/human/consistent/victim = EASY_ALLOCATE() + var/obj/structure/chair/chair = EASY_ALLOCATE() + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + victim.MouseDrop(chair) + if(victim.buckled != chair) + TEST_FAIL("The dummy failed to buckle the victim to a chair via mouse drop.") + + usr = old_usr diff --git a/code/modules/unit_tests/dna_infusion.dm b/code/modules/unit_tests/dna_infusion.dm index 72f0ff78371..50c339b0e21 100644 --- a/code/modules/unit_tests/dna_infusion.dm +++ b/code/modules/unit_tests/dna_infusion.dm @@ -2,7 +2,7 @@ /datum/unit_test/valid_dna_infusion /datum/unit_test/valid_dna_infusion/Run() - for(var/datum/infuser_entry/infuser_entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/infuser_entry as anything in assoc_to_values(GLOB.infuser_entries)) for(var/input_type in infuser_entry.input_obj_or_mob) if(ispath(input_type, /mob/living)) continue @@ -35,7 +35,7 @@ /datum/infuser_entry/fly, )) // Fetch the globally instantiated DNA Infuser entries. - for(var/datum/infuser_entry/infuser_entry as anything in flatten_list(GLOB.infuser_entries)) + for(var/datum/infuser_entry/infuser_entry as anything in assoc_to_values(GLOB.infuser_entries)) var/output_organs = infuser_entry.output_organs var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) // BUBBER EDIT ADDITION BEGIN - Customization diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 28caadc58ef..cc3eec42669 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -30,6 +30,9 @@ /// Checks that nightvision eyes have a full set of color lists /datum/unit_test/focus_only/nightvision_color_cutoffs +/// Ensures that items that got the nullrod_core element with the chaptain_spawnable arg can be selected by the chaplain +/datum/unit_test/focus_only/nullrod_variants + /// Checks that no light shares a tile/pixel offsets with another /datum/unit_test/focus_only/stacked_lights diff --git a/code/modules/unit_tests/get_turf_pixel.dm b/code/modules/unit_tests/get_turf_pixel.dm index 8cd292d3b6c..15628f009fa 100644 --- a/code/modules/unit_tests/get_turf_pixel.dm +++ b/code/modules/unit_tests/get_turf_pixel.dm @@ -1,8 +1,8 @@ ///ensures that get_turf_pixel() returns turfs within the bounds of the map, ///even when called on a movable with its sprite out of bounds -/datum/unit_test/get_turf_pixel +/datum/unit_test/maptest_get_turf_pixel -/datum/unit_test/get_turf_pixel/Run() +/datum/unit_test/maptest_get_turf_pixel/Run() //we need long larry to peek over the top edge of the earth var/turf/north = locate(1, world.maxy, run_loc_floor_bottom_left.z) diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm deleted file mode 100644 index 4154e50285e..00000000000 --- a/code/modules/unit_tests/heretic_knowledge.dm +++ /dev/null @@ -1,46 +0,0 @@ - -/* - * This test checks all heretic knowledge nodes and validates they are setup correctly. - * We check that all knowledge is reachable by players (through the research tree) - * and that all knowledge have a valid next_knowledge list. - */ -/datum/unit_test/heretic_knowledge - -/datum/unit_test/heretic_knowledge/Run() - if(!GLOB.heretic_research_tree) - GLOB.heretic_research_tree = generate_heretic_research_tree() - // First, we get a list of all knowledge types - // EXCLUDING all abstract types - var/list/all_possible_knowledge = typesof(/datum/heretic_knowledge) - for(var/datum/heretic_knowledge/knowledge_type as anything in all_possible_knowledge) - if(initial(knowledge_type.abstract_parent_type) == knowledge_type) - all_possible_knowledge -= knowledge_type - - // Now, let's build a list of all researchable knowledge - // from the ground up. We start with all starting knowledge, - // then add the next possible knowledges back into the list - // repeatedly, until we run out of knowledges to add. - var/list/list_to_check = GLOB.heretic_start_knowledge.Copy() - var/i = 0 - while(i < length(list_to_check)) - var/datum/heretic_knowledge/knowledge = list_to_check[++i] - if(!ispath(knowledge)) - TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [knowledge]) in the list knowledges!") - // Next knowledge is a list of typepaths. - for(var/datum/heretic_knowledge/next_knowledge as anything in GLOB.heretic_research_tree[knowledge][HKT_NEXT]) - if(!ispath(next_knowledge)) - TEST_FAIL("Heretic Knowledge: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") - continue - if(next_knowledge in list_to_check) - continue - list_to_check += next_knowledge - - - // We now have a list that SHOULD contain all knowledges with a path set (list_to_check). - // Let's compare it to our original list (all_possible_knowledge). If they're not identical, - // then somewhere we missed a knowledge somewhere, and should throw a fail. - if(length(all_possible_knowledge) != length(all_possible_knowledge & list_to_check)) - // Unreachables is a list of typepaths - all paths that cannot be obtained. - var/list/unreachables = all_possible_knowledge - list_to_check - for(var/datum/heretic_knowledge/lost_knowledge as anything in unreachables) - TEST_FAIL("Heretic Knowledge: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") diff --git a/code/modules/unit_tests/high_five.dm b/code/modules/unit_tests/high_five.dm index 16b7e3f9545..e5b8e1cef67 100644 --- a/code/modules/unit_tests/high_five.dm +++ b/code/modules/unit_tests/high_five.dm @@ -12,8 +12,8 @@ TEST_ASSERT_NOTNULL(offer_guy.has_status_effect(/datum/status_effect/offering/no_item_received/high_five), \ "Offerer doesn't have the high five offer status effect after offering (giving) to takers nearby") - var/atom/movable/screen/alert/give/highfive/alert_to_click = locate() in flatten_list(take_guy.alerts) - var/atom/movable/screen/alert/give/highfive/bystander_alert_we_dont_click = locate() in flatten_list(random_bystander.alerts) + var/atom/movable/screen/alert/give/highfive/alert_to_click = locate() in assoc_to_values(take_guy.alerts) + var/atom/movable/screen/alert/give/highfive/bystander_alert_we_dont_click = locate() in assoc_to_values(random_bystander.alerts) TEST_ASSERT_NOTNULL(alert_to_click, "Taker had no alert to click to accept the high five offer") TEST_ASSERT_NOTNULL(bystander_alert_we_dont_click, "Bystander had no alert from the high fiver offer") diff --git a/code/modules/unit_tests/load_map_security.dm b/code/modules/unit_tests/load_map_security.dm index a06f184adea..ec73fba343f 100644 --- a/code/modules/unit_tests/load_map_security.dm +++ b/code/modules/unit_tests/load_map_security.dm @@ -2,9 +2,9 @@ #define VALID_TEST_MAP "runtimestation" /// Tests to ensure we can load a map from a whitelisted directory (_maps), but not a non-whitelisted directory (i.e "fartyShitPants") -/datum/unit_test/load_map_security +/datum/unit_test/maptest_load_map_security -/datum/unit_test/load_map_security/Run() +/datum/unit_test/maptest_load_map_security/Run() // Copy our valid map into a bad directory // We can technically load from /unitTestTempDir by passing it in our map name @@ -34,7 +34,7 @@ TEST_ASSERT(bad_config.defaulted, "Loaded from non-whitelisted directory: data/load_map_security_temp/[VALID_TEST_MAP]") -/datum/unit_test/load_map_security/Destroy() +/datum/unit_test/maptest_load_map_security/Destroy() // Clean up our temp directory fdel("data/load_map_security_temp/") return ..() diff --git a/code/modules/unit_tests/map_landmarks.dm b/code/modules/unit_tests/map_landmarks.dm index 9d48785e350..f81b67aa667 100644 --- a/code/modules/unit_tests/map_landmarks.dm +++ b/code/modules/unit_tests/map_landmarks.dm @@ -1,7 +1,7 @@ /// Tests that [/datum/job/proc/get_default_roundstart_spawn_point] returns a landmark from all joinable jobs. -/datum/unit_test/job_roundstart_spawnpoints +/datum/unit_test/maptest_job_roundstart_spawnpoints -/datum/unit_test/job_roundstart_spawnpoints/Run() +/datum/unit_test/maptest_job_roundstart_spawnpoints/Run() for(var/datum/job/job as anything in SSjob.joinable_occupations) if(job.spawn_positions <= 0) // Zero spawn positions means we don't need to care if they don't have a roundstart landmark diff --git a/code/modules/unit_tests/mapload_space_verification.dm b/code/modules/unit_tests/mapload_space_verification.dm index 5b27a77cb43..c7c9845956a 100644 --- a/code/modules/unit_tests/mapload_space_verification.dm +++ b/code/modules/unit_tests/mapload_space_verification.dm @@ -1,10 +1,10 @@ /// Verifies that there are no space turfs inside a station area, or on any planetary z-level. Sometimes, these are introduced during the load of the map and are not present in the DMM itself. /// Let's just make sure that we have a stop-gap measure in place to catch these if they pop up so we don't put it onto production servers should something errant come up. -/datum/unit_test/mapload_space_verification +/datum/unit_test/maptest_mapload_space_verification // This test is quite taxing time-wise, so let's run it later than other faster tests. priority = TEST_LONGER -/datum/unit_test/mapload_space_verification/Run() +/datum/unit_test/maptest_mapload_space_verification/Run() // Is our current map a planetary station (NO space turfs allowed)? If so, check for ANY space turfs. if(SSmapping.is_planetary()) validate_planetary_map() @@ -41,7 +41,7 @@ /// Verifies that there are ZERO space turfs on a valid planetary station. We NEVER want space turfs here, so we do not check for /area/space here since something completely undesirable is happening. /// There are also a few considerations specific to planetary stations included within, so let's spin it out into a separate proc for clarity. -/datum/unit_test/mapload_space_verification/proc/validate_planetary_map() +/datum/unit_test/maptest_mapload_space_verification/proc/validate_planetary_map() // We want to get both the station level and the mining level (if the two are seperate for any reason). var/list/testable_levels = list() testable_levels += SSmapping.levels_by_trait(ZTRAIT_STATION) // Station z-levels get to be in by default because they can derail an entire round and cause LINDA to weep if a space turf is present. diff --git a/code/modules/unit_tests/mapping.dm b/code/modules/unit_tests/mapping.dm index ff6a2577917..6b1509ba64e 100644 --- a/code/modules/unit_tests/mapping.dm +++ b/code/modules/unit_tests/mapping.dm @@ -1,9 +1,9 @@ /// Conveys all log_mapping messages as unit test failures, as they all indicate mapping problems. -/datum/unit_test/log_mapping +/datum/unit_test/maptest_log_mapping // Happen before all other tests, to make sure we only capture normal mapping logs. priority = TEST_PRE -/datum/unit_test/log_mapping/Run() +/datum/unit_test/maptest_log_mapping/Run() var/static/regex/test_areacoord_regex = regex(@"\(-?\d+,-?\d+,(-?\d+)\)") for(var/log_entry in GLOB.unit_test_mapping_logs) diff --git a/code/modules/unit_tests/mapping_nearstation_test.dm b/code/modules/unit_tests/mapping_nearstation_test.dm index d428b826634..39898432fa0 100644 --- a/code/modules/unit_tests/mapping_nearstation_test.dm +++ b/code/modules/unit_tests/mapping_nearstation_test.dm @@ -1,8 +1,8 @@ ///Detects movables that may have been accidentally placed in space, as well as movables which do not have the proper nearspace area (meaning they aren't lit properly.) -/datum/unit_test/mapping_nearstation_test +/datum/unit_test/maptest_mapping_nearstation_test priority = TEST_PRE -/datum/unit_test/mapping_nearstation_test/Run() +/datum/unit_test/maptest_mapping_nearstation_test/Run() if(SSmapping.is_planetary()) return //No need to test for orphaned spaced atoms on this map. diff --git a/code/modules/unit_tests/modular_map_loader.dm b/code/modules/unit_tests/modular_map_loader.dm index fe6f00b6821..66caf39fccb 100644 --- a/code/modules/unit_tests/modular_map_loader.dm +++ b/code/modules/unit_tests/modular_map_loader.dm @@ -1,6 +1,6 @@ -/datum/unit_test/modular_map_loader +/datum/unit_test/maptest_modular_map_loader -/datum/unit_test/modular_map_loader/Run() +/datum/unit_test/maptest_modular_map_loader/Run() for (var/obj/modular_map_root/map_root_type as anything in subtypesof(/obj/modular_map_root)) var/config_file = initial(map_root_type.config_file) if (!fexists(config_file)) diff --git a/code/modules/unit_tests/monkey_business.dm b/code/modules/unit_tests/monkey_business.dm index 80044a0486d..cedfcd75c49 100644 --- a/code/modules/unit_tests/monkey_business.dm +++ b/code/modules/unit_tests/monkey_business.dm @@ -11,6 +11,15 @@ priority = TEST_LONGER var/monkey_timer = 30 SECONDS var/monkey_angry_nth = 5 // every nth monkey will be angry + var/monkey_weapon_index = 1 // which weapon to give the next angry monkey + var/list/monkey_weapon_list = list( + /obj/item/knife/shiv, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/energy/laser, + /obj/item/melee/baseball_bat, + /obj/item/melee/baton, + /obj/item/storage/toolbox, + ) /datum/unit_test/monkey_business/Run() for(var/monkey_id in 1 to length(GLOB.the_station_areas)) @@ -19,8 +28,12 @@ monkey.set_species(/datum/species/monkey) monkey.set_name("Monkey [monkey_id]") if(monkey_id % monkey_angry_nth == 0) // BLOOD FOR THE BLOOD GODS - monkey.put_in_active_hand(new /obj/item/knife/shiv) + var/obj/next_weapon = monkey_weapon_list[monkey_weapon_index] + monkey_weapon_index = (monkey_weapon_index % length(monkey_weapon_list)) + 1 + monkey.put_in_active_hand(new next_weapon()) new /datum/ai_controller/monkey/angry(monkey) + if(ispath(next_weapon, /obj/item/gun)) + monkey.ai_controller.set_blackboard_key(BB_MONKEY_GUN_NEURONS_ACTIVATED, TRUE) else new /datum/ai_controller/monkey(monkey) monkey.ai_controller.set_blackboard_key(BB_MONKEY_TARGET_MONKEYS, TRUE) diff --git a/code/modules/unit_tests/organs.dm b/code/modules/unit_tests/organs.dm index f7c0b38f453..816447bdb52 100644 --- a/code/modules/unit_tests/organs.dm +++ b/code/modules/unit_tests/organs.dm @@ -124,3 +124,16 @@ var/obj/item/organ/brain = locate() in dummy.organs brain.forceMove(dummy.loc) allocated += brain + +/datum/unit_test/felinid_ears + +/datum/unit_test/felinid_ears/Run() + var/mob/living/carbon/human/normal_dummy = allocate(/mob/living/carbon/human/consistent) + normal_dummy.dna.features[FEATURE_EARS] = SPRITE_ACCESSORY_NONE + normal_dummy.set_species(/datum/species/human/felinid, pref_load = TRUE) + TEST_ASSERT(!istype(normal_dummy.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat), "Felinid with NONE ears set had cat ears on species gain.") + TEST_ASSERT_NOTNULL(normal_dummy.get_organ_slot(ORGAN_SLOT_EARS), "Felinid with NONE ears set had NO ears on species gain.") + + var/mob/living/carbon/human/anime_dummy = allocate(/mob/living/carbon/human/consistent) + anime_dummy.set_species(/datum/species/human/felinid, pref_load = TRUE) + TEST_ASSERT(istype(anime_dummy.get_organ_slot(ORGAN_SLOT_EARS), /obj/item/organ/ears/cat), "Felinid with default ears set did not have cat ears on species gain.") diff --git a/code/modules/unit_tests/reachable_soup.dm b/code/modules/unit_tests/reachable_soup.dm new file mode 100644 index 00000000000..809699d7671 --- /dev/null +++ b/code/modules/unit_tests/reachable_soup.dm @@ -0,0 +1,13 @@ +/datum/unit_test/reachable_soup + +/datum/unit_test/reachable_soup/Run() + var/obj/machinery/oven/range/range = EASY_ALLOCATE() + var/obj/item/reagent_containers/cup/soup_pot/soup = EASY_ALLOCATE() + var/mob/living/carbon/human/dummy = EASY_ALLOCATE() + + dummy.put_in_active_hand(soup) + click_wrapper(dummy, range) + TEST_ASSERT_EQUAL(soup.loc, range, "Soup pot should have been placed on the stove.") + + click_wrapper(dummy, soup) + TEST_ASSERT_EQUAL(soup.loc, dummy, "Soup pot should have been picked up by the dummy.") diff --git a/code/modules/unit_tests/required_map_items.dm b/code/modules/unit_tests/required_map_items.dm index 145f5fd34ce..a1b1f516d7f 100644 --- a/code/modules/unit_tests/required_map_items.dm +++ b/code/modules/unit_tests/required_map_items.dm @@ -5,14 +5,14 @@ * - Add the typepath(s) to setup_expected_types * - In the type's initialize, REGISTER_REQUIRED_MAP_ITEM() a minimum and maximum */ -/datum/unit_test/required_map_items +/datum/unit_test/maptest_required_map_items /// A list of all typepaths that we expect to be in the required items list var/list/expected_types = list() /// Used to fill the expected types list with all the types we look for on the map. /// This list will just be full of typepaths that we expect. /// More detailed information about each item (mainly, how much of each should exist) is set on a per item basis -/datum/unit_test/required_map_items/proc/setup_expected_types() +/datum/unit_test/maptest_required_map_items/proc/setup_expected_types() expected_types += subtypesof(/obj/item/stamp/head) expected_types += subtypesof(/obj/machinery/modular_computer/preset/cargochat) @@ -23,7 +23,7 @@ expected_types += /obj/machinery/drone_dispenser expected_types += /obj/item/piggy_bank/vault -/datum/unit_test/required_map_items/Run() +/datum/unit_test/maptest_required_map_items/Run() setup_expected_types() var/list/required_map_items = GLOB.required_map_items.Copy() diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png index ba18a7ec165..355b74df6ac 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth.png differ diff --git a/code/modules/unit_tests/style_hotswapping.dm b/code/modules/unit_tests/style_hotswapping.dm new file mode 100644 index 00000000000..33063eb888f --- /dev/null +++ b/code/modules/unit_tests/style_hotswapping.dm @@ -0,0 +1,43 @@ +/// Ensures that hotswapping only occurs when hitting inventory items and allows item interactions to go through +/datum/unit_test/style_hotswapping + +/datum/unit_test/style_hotswapping/Run() + var/mob/living/carbon/human/john_ultrakill = allocate(/mob/living/carbon/human/consistent) + var/obj/item/storage/backpack/bag = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.equip_to_slot(bag, ITEM_SLOT_BACK) + TEST_ASSERT_EQUAL(john_ultrakill.get_item_by_slot(ITEM_SLOT_BACK), bag, "Human wasn't able to equip a backpack!") + var/datum/component/style/style = john_ultrakill.AddComponent(/datum/component/style) + try_stabilize(john_ultrakill, john_ultrakill.loc, "while it was on the user's turf") + try_stabilize(john_ultrakill, bag, "while it was in the user's bag") + var/obj/item/coin/gold/coin_one = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + var/obj/item/coin/silver/coin_two = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + coin_two.forceMove(bag) + john_ultrakill.put_in_active_hand(coin_one, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human wasn't able to pick up a gold coin!") + john_ultrakill.ClickOn(coin_two) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human hotswapped from their storage despite not having enough points!") + john_ultrakill.next_click = 0 + john_ultrakill.next_move = 0 + john_ultrakill.temporarilyRemoveItemFromInventory(coin_one, TRUE) + QDEL_NULL(coin_one) + style.style_points = INFINITY + style.update_screen(style.point_to_rank()) + try_stabilize(john_ultrakill, john_ultrakill.loc, "while it was on the user's turf with hotswapping active") + try_stabilize(john_ultrakill, bag, "while it was in the user's bag with hotswapping active") + coin_one = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.put_in_active_hand(coin_one, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_one, "Human wasn't able to pick up a gold coin!") + john_ultrakill.ClickOn(coin_two) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), coin_two, "Human wasn't able to hotswap with their storage!") + +/datum/unit_test/style_hotswapping/proc/try_stabilize(mob/living/carbon/human/john_ultrakill, core_loc, desc = null) + var/obj/item/organ/monster_core/regenerative_core/legion/core = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + core.forceMove(core_loc) + TEST_ASSERT(core.decay_timer, "Legion core spawned without a decay timer!") + var/obj/item/mining_stabilizer/serum = allocate(__IMPLIED_TYPE__, john_ultrakill.loc) + john_ultrakill.put_in_active_hand(serum, TRUE) + TEST_ASSERT_EQUAL(john_ultrakill.get_active_held_item(), serum, "Human wasn't able to pick up a stabilizer serum!") + john_ultrakill.ClickOn(core) + TEST_ASSERT(!core.decay_timer, "Clicking on a legion core with a serum did not stabilize it [desc]!") + john_ultrakill.next_click = 0 + john_ultrakill.next_move = 0 diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index 8d2901bf77f..f85ea6cc870 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -131,3 +131,25 @@ basic_brute_heal.success(user, clothed_patient, BODY_ZONE_CHEST) TEST_ASSERT(naked_patient.getBruteLoss() < clothed_patient.getBruteLoss(), "Naked patient did not heal more from wounds tending than a clothed patient") + +/// Tests items-as-prosthetic-limbs can apply +/datum/unit_test/prosthetic_item + +/datum/unit_test/prosthetic_item/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human/consistent) + var/obj/item/claymore/sword = allocate(/obj/item/claymore) + + patient.make_item_prosthetic(sword) + + TEST_ASSERT(HAS_TRAIT_FROM(sword, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Prosthetic item attachment failed! Item does not have the nodrop trait") + +/// Specifically checks the chainsaw nullrod +/datum/unit_test/prosthetic_item/nullrod + +/datum/unit_test/prosthetic_item/nullrod/Run() + var/mob/living/carbon/human/picker = allocate(/mob/living/carbon/human/consistent) + var/obj/item/nullrod/chainsaw/nullrod = allocate(/obj/item/nullrod/chainsaw) + + nullrod.on_selected(null, null, picker) + + TEST_ASSERT(HAS_TRAIT_FROM(nullrod, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT), "Chainsaw nullrod item attachment failed! Item does not have the nodrop trait") diff --git a/code/modules/unit_tests/trash_food.dm b/code/modules/unit_tests/trash_food.dm new file mode 100644 index 00000000000..570531c187d --- /dev/null +++ b/code/modules/unit_tests/trash_food.dm @@ -0,0 +1,34 @@ +/// Checks to make sure all food trash is included in /obj/effect/spawner/random/trash/food_packaging +/datum/unit_test/trash_food + +/datum/unit_test/trash_food/Run() + var/list/food_trash = /obj/effect/spawner/random/trash/food_packaging::loot + // list of pieces of trash we never want to include because they are special or rare (usually mutated botany plants) + var/list/food_trash_blacklist = list( + // already added to botanical_waste spawner or too exotic + /obj/item/grown/bananapeel, + /obj/item/grown/bananapeel/bombanana, + /obj/item/grown/bananapeel/mimanapeel, + /obj/item/grown/bananapeel/bluespace, + /obj/item/food/grown/bungopit, + /obj/item/food/egg, + /obj/item/gun/ballistic/revolver/peashooter, + /obj/item/grown/corncob, + /obj/item/grown/corncob/pepper, + // misc waste products that don't belong in trash spawner + /obj/item/reagent_containers/cup/bowl, + /obj/item/plate, + /obj/item/stack/rods, // kebab + /obj/item/paper/paperslip/fortune, // fortune cookie + /obj/item/dice/fudge, // /obj/item/food/fudgedice + ) + + for(var/path in subtypesof(/obj/item/food)) + var/obj/item/food/food = path + var/trash = food::trash_type + if(!trash) + continue + if(trash in food_trash_blacklist) + continue + + TEST_ASSERT(food_trash[trash], "[food] must include its trash_type for loot table /obj/effect/spawner/random/trash/food_packaging or be added to this unit tests food_trash_blacklist") diff --git a/code/modules/unit_tests/turf_icons.dm b/code/modules/unit_tests/turf_icons.dm index 0391eca82a6..a43bfb3ac93 100644 --- a/code/modules/unit_tests/turf_icons.dm +++ b/code/modules/unit_tests/turf_icons.dm @@ -1,8 +1,8 @@ /// Makes sure turf icons actually exist. :) -/datum/unit_test/turf_icons +/datum/unit_test/maptest_turf_icons var/modular_mineral_turf_file = 'modular_skyrat/modules/xenoarch/icons/mining.dmi' //= 'icons/turf/mining.dmi' //MODULARITY SUPPORT - insert your snowflake MAP_SWITCH icon file here if you use that define. // SKYRAT EDIT - Added our modular file here (thanks) -/datum/unit_test/turf_icons/Run() +/datum/unit_test/maptest_turf_icons/Run() for(var/turf/turf_path as anything in (subtypesof(/turf) - typesof(/turf/closed/mineral))) var/icon_state = initial(turf_path.icon_state) diff --git a/code/modules/unit_tests/unequip_defib.dm b/code/modules/unit_tests/unequip_defib.dm new file mode 100644 index 00000000000..e2db399f2de --- /dev/null +++ b/code/modules/unit_tests/unequip_defib.dm @@ -0,0 +1,19 @@ +/// Test you can mouse-drop a defib off your back to unequip it +/datum/unit_test/unequip_defib + +/datum/unit_test/unequip_defib/Run() + var/mob/living/carbon/human/consistent/dummy = EASY_ALLOCATE() + dummy.mock_client = new() + dummy.set_hud_used(new dummy.hud_type(dummy)) + var/obj/item/defibrillator/defib = EASY_ALLOCATE() + dummy.equip_to_slot(defib, ITEM_SLOT_BACK) + + var/old_usr = usr + + usr = dummy // mouse drop still uses usr + + defib.MouseDrop(dummy.hud_used.hand_slots["1"]) + if(!dummy.is_holding(defib)) + TEST_FAIL("The dummy failed to remove the defib from their back via mouse drop.") + + usr = old_usr diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index b8762795c0f..e7d336478be 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -67,9 +67,14 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) uncreatables = build_list_of_uncreatables() allocated = new + run_loc_floor_bottom_left = get_turf(locate(/obj/effect/landmark/unit_test_bottom_left) in GLOB.landmarks_list) run_loc_floor_top_right = get_turf(locate(/obj/effect/landmark/unit_test_top_right) in GLOB.landmarks_list) + if(priority > TEST_CREATE_AND_DESTROY) //the create and destroy test WILL wreck havok in the unit test room. You CANNOT stop the inevitable. + return + + //Make sure that the top and bottom locations in the diagonal are floors. Anything else may get in the way of several tests. TEST_ASSERT(isfloorturf(run_loc_floor_bottom_left), "run_loc_floor_bottom_left was not a floor ([run_loc_floor_bottom_left])") TEST_ASSERT(isfloorturf(run_loc_floor_top_right), "run_loc_floor_top_right was not a floor ([run_loc_floor_top_right])") @@ -97,6 +102,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) /// Allocates an instance of the provided type, and places it somewhere in an available loc /// Instances allocated through this proc will be destroyed when the test is over /datum/unit_test/proc/allocate(type, ...) + if(priority > TEST_CREATE_AND_DESTROY) //I'm not using TEST_ASSERT here since these are just numbers that tell nothing useful about the problem. + TEST_FAIL("allocate() was called for a unit test after 'create_and_destroy' has finished. The unit test room is no longer a reliable testing ground for atoms.") + return null //you deserve runtime errors for it var/list/arguments = args.Copy(2) if(ispath(type, /atom)) if (!arguments.len) @@ -204,7 +212,8 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) else test.Run() - test.restore_atmos() + if(test.priority < TEST_CREATE_AND_DESTROY) //We shouldn't care about restoring atmos after create_and_destroy. + test.restore_atmos() duration = REALTIMEOFDAY - duration GLOB.current_test = null diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 06cd969d935..ed8cc80d50f 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -9,7 +9,7 @@ per_category[possible_sale.category] = list() per_category[possible_sale.category] += possible_sale - for (var/i in 1 to num) + for (var/i in 1 to min(length(per_category), num)) var/datum/uplink_category/item_category = pick(per_category) var/datum/uplink_item/taken_item = pick(per_category[item_category]) per_category -= item_category diff --git a/code/modules/uplink/uplink_items/contractor.dm b/code/modules/uplink/uplink_items/contractor.dm index f3099d544f9..1b816202827 100644 --- a/code/modules/uplink/uplink_items/contractor.dm +++ b/code/modules/uplink/uplink_items/contractor.dm @@ -8,8 +8,7 @@ and cash payouts. Upon purchase, you'll be granted your own contract uplink embedded within the supplied \ tablet computer. Additionally, you'll be granted standard contractor gear to help with your mission - \ comes supplied with the tablet, specialised space suit, chameleon jumpsuit and mask, agent card, \ - specialised contractor baton, and three randomly selected low cost items. \ - Can include otherwise unobtainable items." + and a specialised contractor baton." item = /obj/item/storage/box/syndicate/contract_kit category = /datum/uplink_category/contractor cost = 20 diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 3840bfe0cd2..1567eed0f97 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -112,11 +112,11 @@ smoke.set_up(0, holder = src, location = src) smoke.start() -/obj/vehicle/ridden/atv/bullet_act(obj/projectile/proj) +/obj/vehicle/ridden/atv/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(prob(50) || !LAZYLEN(buckled_mobs)) return ..() for(var/mob/buckled_mob as anything in buckled_mobs) - return buckled_mob.projectile_hit(proj) + return buckled_mob.projectile_hit(hitting_projectile) return ..() /obj/vehicle/ridden/atv/atom_destruction() diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index c90ff79e60b..09f56c5146c 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -82,13 +82,11 @@ shield.setDir(dir) //Redirects projectiles to the shield if defense_check decides they should be blocked and returns true. -/obj/vehicle/sealed/mecha/durand/bullet_act(obj/projectile/source, def_zone, mode) - if(defense_check(source.loc) && shield) - return shield.projectile_hit(source, def_zone, mode) +/obj/vehicle/sealed/mecha/durand/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) + if(defense_check(hitting_projectile.loc) && shield) + return shield.projectile_hit(hitting_projectile, def_zone, piercing_hit, blocked) return ..() - - /**Checks if defense mode is enabled, and if the attacker is standing in an area covered by the shield. Expects a turf. Returns true if the attack should be blocked, false if not.*/ /obj/vehicle/sealed/mecha/durand/proc/defense_check(turf/aloc) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 3dcd5835b2e..f41b3006e03 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -114,21 +114,21 @@ log_message("Hit by [AM].", LOG_MECHA, color="red") return ..() -/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - +/obj/vehicle/sealed/mecha/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) // Determine our potential to shoot through the mech and into the cockpit, hitting the pilot var/kill_the_meat = clamp(hitting_projectile.armour_penetration - get_armor_rating(hitting_projectile.armor_flag), 0, 100) + // Allows bullets to hit the pilot of open-canopy mechs, or if the bullet penetrates to the pilot, or the bullet can pass through structures + if (!LAZYLEN(occupants) || (mecha_flags & SILICON_PILOT)) + return ..() + if (def_zone != BODY_ZONE_HEAD && def_zone != BODY_ZONE_CHEST) + return ..() + if ((mecha_flags & IS_ENCLOSED) && !(kill_the_meat && prob(kill_the_meat) && !(mecha_flags & CANNOT_OVERPENETRATE)) && !(hitting_projectile.pass_flags & (PASSSTRUCTURE|PASSVEHICLE))) + return ..() + var/mob/living/hitmob = pick(occupants) + return hitmob.projectile_hit(hitting_projectile, def_zone, piercing_hit) //If we've passed any of the above conditions, the pilot can be hit - //allows bullets to hit the pilot of open-canopy mechs, or if the bullet penetrates to the pilot, or the bullet can pass through structures - if((!(mecha_flags & IS_ENCLOSED) || kill_the_meat && prob(kill_the_meat) && !(mecha_flags & CANNOT_OVERPENETRATE) || hitting_projectile.pass_flags & (PASSSTRUCTURE|PASSVEHICLE)) \ - && LAZYLEN(occupants) \ - && !(mecha_flags & SILICON_PILOT) \ - && (def_zone == BODY_ZONE_HEAD || def_zone == BODY_ZONE_CHEST)) - var/mob/living/hitmob = pick(occupants) - return hitmob.projectile_hit(hitting_projectile, def_zone, piercing_hit) //If we've passed any of the above conditions, the pilot can be hit - +/obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked = null) . = ..() - log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too try_damage_component(run_atom_armor( @@ -139,7 +139,6 @@ armour_penetration = hitting_projectile.armour_penetration, ), def_zone) - /obj/vehicle/sealed/mecha/ex_act(severity, target) log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") return ..() diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 7520f0e2e17..cf784e77ca4 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -97,9 +97,9 @@ return ..() //bullets will have a 60% chance to hit any riders -/obj/vehicle/ridden/secway/bullet_act(obj/projectile/proj) +/obj/vehicle/ridden/secway/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked) if(!buckled_mobs || prob(40)) return ..() for(var/mob/rider as anything in buckled_mobs) - return rider.projectile_hit(proj) + return rider.projectile_hit(hitting_projectile) return ..() diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 1b5722dbc12..a9e74c6d406 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -17,6 +17,7 @@ /obj/item/toy/cards/deck/kotahi = 3, /obj/item/toy/cards/deck/tarot = 3, /obj/item/toy/cards/deck/wizoff = 3, + /obj/item/toy/cards/deck/cardshoe = 3, ), ), list( diff --git a/code/modules/vending/vendor/inventory.dm b/code/modules/vending/vendor/inventory.dm index 8955e1002ab..ded975a2430 100644 --- a/code/modules/vending/vendor/inventory.dm +++ b/code/modules/vending/vendor/inventory.dm @@ -204,7 +204,7 @@ if(greyscale_colors) vended_item.set_greyscale(colors=greyscale_colors) - if(user.CanReach(src) && user.put_in_hands(vended_item)) + if(IsReachableBy(user) && user.put_in_hands(vended_item)) to_chat(user, span_notice("You take [item_record.name] out of the slot.")) vended_item.do_pickup_animation(user, src) else diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index ca461e34349..30828f5bd11 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -703,7 +703,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/clothing/under/rank/security/detective/kim = 1, /obj/item/clothing/suit/jacket/det_suit/kim = 1, /obj/item/clothing/gloves/kim = 1, - /obj/item/clothing/shoes/kim = 1, + /obj/item/clothing/shoes/jackboots/kim = 1, /obj/item/reagent_containers/cup/glass/flask/det = 2, /obj/item/storage/fancy/cigarettes = 5, /obj/item/storage/fancy/cigarettes/cigpack_candy = 5, diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index c38467ffc09..d6ce7a953e2 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -70,6 +70,10 @@ mob_choice.name = target.name selectable_targets[REF(target)] = mob_choice for(var/obj/item/item as anything in visible_items) + //no revealing items that are not obscured but meant to be hidden + if(HAS_TRAIT(item, TRAIT_NO_STRIP) || HAS_TRAIT(item, TRAIT_EXAMINE_SKIP)) + continue + var/datum/radial_menu_choice/item_choice = new var/mutable_appearance/item_appearance = new(item) diff --git a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm index c64437d21c0..81e95099101 100644 --- a/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm +++ b/code/modules/wiremod/dcs_components/component_boris_circuit_container.dm @@ -34,7 +34,7 @@ var/obj/item/circuit_component/mmi/source_comp = locate(source) if(!istype(source_comp)) return COMPONENT_INCOMPATIBLE - LAZYADD(mmi_components, source) + LAZYADD(mmi_components, source_comp) /datum/component/boris_circuit_container/on_source_remove(source) var/obj/item/circuit_component/mmi/source_comp = locate(source) diff --git a/config/config.txt b/config/config.txt index 422597a4b4e..634bd5762b9 100644 --- a/config/config.txt +++ b/config/config.txt @@ -664,3 +664,6 @@ TGUI_MAX_CHUNK_COUNT 32 ## While this is uncommented, server initialization will include some asset generation usually useful for development. ## It increases initialization time significantly so you'll want to disable this in live environments. GENERATE_ASSETS_IN_INIT + +## Minimum time before a heretic can ascend, in minutes +# MINIMUM_ASCENSION_TIME 3 diff --git a/html/changelogs/AutoChangeLog-pr-92119.yml b/html/changelogs/AutoChangeLog-pr-92119.yml new file mode 100644 index 00000000000..dc07be2f300 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-92119.yml @@ -0,0 +1,17 @@ +author: "EnterTheJake" +delete-after: True +changes: + - rscadd: "All Heretic paths now start with a gradually evolving passive ability." + - balance: "the entire heretic tree has been rebalanced." + - balance: "the grasp and mark upgrade are now granted upon selecting the path" + - rscadd: "All Heretic paths now have a unique robe." + - balance: "Heretic ability to blade break is now disabled after X amount of knowledge has been acquired (and so is the limit on blades) or the 2nd passive level is unlocked." + - balance: "it's no longer possible to cross-path into different heretic paths." + - balance: "Every main knowledge spell will now grant to the heretic the option to select a side knowledge from a draft of 3, this is a free point." + - balance: "Heretic ascension will now call the shuttle with no possibility of recall." + - rscadd: "A new tab has been added in the heretic UI, the knowledge shop." + - rscadd: "Heretics will now gain temporary X-ray vision when near an untapped essence." + - balance: "Codex cicatrix no longer requires a special pen." + - balance: "Ritual of knowledge requires less items to complete now." + - balance: "the minimum number of required sacrifices to unlock ascension has been upped to 4, and the minimum bumped down to 5." + - image: "loads of new sprites have been added." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-92513.yml b/html/changelogs/AutoChangeLog-pr-92513.yml deleted file mode 100644 index 043ba1db81f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-92513.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "Krysonism" -delete-after: True -changes: - - rscadd: "Added 4 new types of soil" - - rscadd: "Added soils sacks to the nutrimax" - - rscadd: "Added soil sack crates to cargo." - - balance: "Soil now has higher armor values." - - balance: "Rice now gets more weeds if grown in soil." - - balance: "Carrots, potatoes, beets and their mutations now get reduced yield and potency if grown hydroponically." - - bugfix: "Weed overgrowth no longer instantly sets yield to 3." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93076.yml b/html/changelogs/AutoChangeLog-pr-93076.yml new file mode 100644 index 00000000000..1cecfdd12e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93076.yml @@ -0,0 +1,8 @@ +author: "Ghommie" +delete-after: True +changes: + - refactor: "Refactored flash and flashers. Report any issue about it" + - balance: "Flashes now affect basic mobs as well. Yes, this extends to the hypno-flash. Yes, this includes converting them as a headrev / blood bro" + - balance: "Flashers now actually use the flashes that they're installed with, and the portable version is also triggered by nearby basic mobs and cyborgs passing through." + - balance: "Elite mobs cannot be converted while they're busy battling their challenger." + - balance: "Mobs that have been given sentience potions to are unconvertable. They answer to their master (the one that gave them the potion in the first place) anyway." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93208.yml b/html/changelogs/AutoChangeLog-pr-93208.yml deleted file mode 100644 index 2ce425464c3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93208.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "loganuk" -delete-after: True -changes: - - bugfix: "Fixes endless Neurine trauma farming & adds unit test to keep it safe" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93250.yml b/html/changelogs/AutoChangeLog-pr-93250.yml deleted file mode 100644 index 71c4d158782..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - bugfix: "Latejoiners are buckled in to their chairs & Hangover station trait now kicks their effects in again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93252.yml b/html/changelogs/AutoChangeLog-pr-93252.yml new file mode 100644 index 00000000000..af10a746b14 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93252.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - qol: "item offers now persist when pulling" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93257.yml b/html/changelogs/AutoChangeLog-pr-93257.yml deleted file mode 100644 index 565646b855f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Multi-z map cryo no longer makes locked fighting game characters" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93259.yml b/html/changelogs/AutoChangeLog-pr-93259.yml deleted file mode 100644 index 336a02d850a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93259.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Latejoin officers no longer teleport" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93260.yml b/html/changelogs/AutoChangeLog-pr-93260.yml deleted file mode 100644 index 99864f92905..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93260.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - bugfix: "Sheets removed from the protolathe/techfab will properly remove the correct quantity and merge into the right material." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93261.yml b/html/changelogs/AutoChangeLog-pr-93261.yml deleted file mode 100644 index dea42c011fa..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93261.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "paganiy" -delete-after: True -changes: - - bugfix: "fixed cycler shotgun double ammo consumption" - - bugfix: "fixed racking action on the cycler shotgun" - - bugfix: "bounty hunter cycler shotgun now properly fires incendiary rounds from secondary tube" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93262.yml b/html/changelogs/AutoChangeLog-pr-93262.yml deleted file mode 100644 index cbdc5d3596a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93262.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Emotes with visuals can no longer cause errors if spammed to an extreme degree" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93263.yml b/html/changelogs/AutoChangeLog-pr-93263.yml deleted file mode 100644 index e62bc550157..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93263.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Lazy/Diligent is not incompatible with Introvert/lazy" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93264.yml b/html/changelogs/AutoChangeLog-pr-93264.yml deleted file mode 100644 index 356b9a24095..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93264.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Equipping clothes adds you to suit sensors correctly if your clothes are unlaundered" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93265.yml b/html/changelogs/AutoChangeLog-pr-93265.yml deleted file mode 100644 index 85c8070f18c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-93265.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Fixed personality wiping" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93379.yml b/html/changelogs/AutoChangeLog-pr-93379.yml new file mode 100644 index 00000000000..b0acf436482 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93379.yml @@ -0,0 +1,4 @@ +author: "Yobrocharlie" +delete-after: True +changes: + - balance: "restored the weak claymore to its former glory" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93439.yml b/html/changelogs/AutoChangeLog-pr-93439.yml new file mode 100644 index 00000000000..bea14c14c03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93439.yml @@ -0,0 +1,4 @@ +author: "FalloutFalcon" +delete-after: True +changes: + - admin: "abstract types dont show up in admin selection menu for station traits" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-93451.yml b/html/changelogs/AutoChangeLog-pr-93451.yml new file mode 100644 index 00000000000..b20a91e5b54 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-93451.yml @@ -0,0 +1,7 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixed ore bags being able to reject any ores despite having ample space" + - bugfix: "Pulling a stack behind you and getting it topped up by lying items will no longer spam pulls and lock out your inputs" + - bugfix: "Picking up ores into an ore box via an ore bag will no longer play a jank animation" + - qol: "Ore bags and MODule ore bags no longer pick up ores you've dropped from your hand until you walk over them again" \ No newline at end of file diff --git a/html/changelogs/archive/2025-10.yml b/html/changelogs/archive/2025-10.yml index 9bfbdc8f5db..d75fb046077 100644 --- a/html/changelogs/archive/2025-10.yml +++ b/html/changelogs/archive/2025-10.yml @@ -161,3 +161,330 @@ Y0SH1M4S73R: - bugfix: Snapping USB cables by dragging the attached objects too far away from each other will no longer crash the server. +2025-10-05: + ArcaneMusic: + - bugfix: Sheets removed from the protolathe/techfab will properly remove the correct + quantity and merge into the right material. + JohnFulpWillard: + - bugfix: Latejoiners are buckled in to their chairs & Hangover station trait now + kicks their effects in again. + Krysonism: + - rscadd: Added 4 new types of soil + - rscadd: Added soils sacks to the nutrimax + - rscadd: Added soil sack crates to cargo. + - balance: Soil now has higher armor values. + - balance: Rice now gets more weeds if grown in soil. + - balance: Carrots, potatoes, beets and their mutations now get reduced yield and + potency if grown hydroponically. + - bugfix: Weed overgrowth no longer instantly sets yield to 3. + Melbert: + - bugfix: Emotes with visuals can no longer cause errors if spammed to an extreme + degree + - bugfix: Fixed personality wiping + - bugfix: Equipping clothes adds you to suit sensors correctly if your clothes are + unlaundered + - bugfix: Latejoin officers no longer teleport + - bugfix: Multi-z map cryo no longer makes locked fighting game characters + - bugfix: Lazy/Diligent is not incompatible with Introvert/lazy + SmArtKar: + - bugfix: Plasma flower MOD core grass trails no longer appear in front of the user + rather than behind them + - bugfix: Fixed hierophant staff refusing to be put into backpacks + - bugfix: Colorblindness and eye blur from welding should no longer be permanent + loganuk: + - bugfix: Fixes endless Neurine trauma farming & adds unit test to keep it safe + paganiy: + - bugfix: fixed cycler shotgun double ammo consumption + - bugfix: fixed racking action on the cycler shotgun + - bugfix: bounty hunter cycler shotgun now properly fires incendiary rounds from + secondary tube + timothymtorres: + - bugfix: Fix shuttle movement spamming nearstation areas on space turfs +2025-10-06: + Hatterhat: + - qol: The extended lore bits for the Iaito surplus energy sword and the BR-38 battle + rifle have been moved to being examined closely, and their descriptions have + been rewritten to be a bit more apt. + - code_imp: The lore descriptions for the SC/FISHER and Ansem/SC are now tied to + the examine_lore component. + - rscadd: Card shoes are now stocked in Good Clean Fun vendors, featuring a whopping + 416 card (or 8 52-card decks) capacity. These, however, will not spill their + contents when thrown at people. + - bugfix: Attempting to insert cards from a deck into a full hand no longer makes + a card cease to exist in the eyes of the deck. + - bugfix: Card decks now set their maximum capacities based on how many cards are + in them when initialized. + JohnFulpWillard: + - bugfix: Arrivals won't lose power on roundstart anymore. + - qol: Ghost roles with gas miners will now suddenly have a lot more available power. + MGOOOOOO: + - bugfix: Metal-tipped telescopic batons now count for Spy's telescopic baton bounty. + Melbert: + - bugfix: Reagent container interactions with mobs have click cooldown again + - bugfix: Fixed chainsaw nullrod + - bugfix: Felinids will randomize their ear type properly + SmArtKar: + - bugfix: Fixed orbiters like ghosts and wisps detaching when using a shuttle + - bugfix: Fixed a year old issue which prevented projectile hit messages from appearing + if they've been shot from a gun. + - bugfix: Fixed ore bags only picking one item per holder's move + loganuk: + - code_imp: Mappers can now run just mapping unit tests - Should be 56% faster - + Should have no player impact + timothymtorres: + - admin: Add admin debug goggles that lets you see area overlays which is useful + for construction projects. + - image: Add icons for admin debug goggles (which is just a reskinned color version + of mesons) + - code_imp: Improve meson code to be more robust + - qol: More types of garbage (empty lighters, empty cigarette packs, empty food, + etc.) have been added to the trash spawner. + - qol: Paper plane added to the paper spawner, which is now used in the trash spawner. + - rscadd: Holograms objects will fade away when affected by EMPs. +2025-10-07: + Ghommie: + - bugfix: anti, low and high, gravity fields no longer have the same particles effect. + Melbert: + - bugfix: People should disappear from sensors less often + - admin: Dynamic Tester differentiates lights and heavies + SmArtKar: + - image: Cain & Abel wisps now orbit around the user instead of being static + - code_imp: Cleaned up Cain & Abel code + - bugfix: Fixed some of Pubby's escape shuttle seats being incorrectly rotated and + having floating lights over them + loganuk: + - map: Fixes runtimestation_minimal broken unit test - Should not affect players + but fixes CI failures for all open PRs, going in changelog to inform contributors + to update from main branch. + paganiy: + - refactor: Abandoned crates refactored + theselfish: + - qol: Aerostatic Boots now have storage, as they're boots actually. +2025-10-08: + 00-Steven: + - bugfix: The tgui window for reading books is no longer compressed, and has the + same dimensions as the window for reading paper. + ArchBTW: + - bugfix: Fixes combat mode interaction with all chem machines and beakers (consistency) + Ghommie: + - rscadd: You can now bind certain items like briefcases, toolboxes, medkits, shields, + jerrycans etc. to your hand with a pair of handcuffs, preventing them from being + dropped. You can remove said binds at any time unless incapacitated, and so + can others through the strip inventory menu. + - qol: The appearance of a screen alert now updates if the object it represents + (like, an item offered by another player) changes appearance. + Melbert: + - image: Updates Captain Backpack sprites + - image: Updates HoP sprites slightly to match Cap sprites + - image: HoP cloak has been simplified slightly + - bugfix: Screen alerts are clickable again + - bugfix: Fixed strip menu + SmArtKar: + - bugfix: Fixed certain broken icons in the outfit editor, stripping menu and multiple + others + - bugfix: Mining style hotswapping now respects item interactions + Y0SH1M4S73R: + - bugfix: AIs can actually connect to circuits with MMI components and BORIS modules + inserted. + grungussuss: + - refactor: refactored how reaching items works, report any oddities with being + unable to reach something you should be able to! + lelandkemble: + - rscadd: Added an emag interaction to door control remotes. Emagged remotes can + shock and depower doors. + loganuk: + - map: CATWALK - Xenobio slime chamber door access fixed, previously any slimes + could just open it, also added air flaps. + timothymtorres: + - bugfix: The admin debug gps is now turned off by default and toggling it will + reset the affected turfs. + - admin: Equipping the admin outfit will no longer automatically trigger the debug + gps effect. +2025-10-09: + ArchBTW: + - rscadd: Readds Lean + Melbert: + - bugfix: Fix buckling and probably a lot more mousedrop interactions +2025-10-10: + ArcaneMusic: + - qol: When placing cargo requests, you can now request that a crate be obtained + using your department's funds as opposed to the cargo budget. + ArchBTW: + - bugfix: fixes clicking on an open airlock tile when pulling something + - qol: Makes plumbing synthesizers default to 5u + DaCoolBoss: + - bugfix: Ballistic laser guns will no longer brick themselves when out of ammo. + - bugfix: Ballistic laser guns now fire ammo directly from their loaded clip, without + chambering. + Hatterhat: + - qol: The skeletal corpses left from spawner legions (e.g. from ore vent defenses + and legion necropolis tendrils) now disappear during ash storms. This does not + apply if the body gets brainswapped into. + SmArtKar: + - qol: You can now pick up trophies with PKC without needing to wield it + loganuk: + - map: CATWALK - Atmos gas tanks are now in space rather than inside the station, + widens Z1 & Z2 Atmos to suit + - map: CATWALK - Old gas tank chambers re-purposed as storage and chill area, upstairs + laid out a bit, downstairs floor much neater, another ladded added to atmos + - map: CATWALK - Added air mix pump to upper level atmos for passion projects + - map: CATWALK - In SM chamber moved position of a table and rack about + - map: CATWALK - OHSA screamed that one ladder used the wrong markings at lower + SM freezers, corrected + - map: CATWALK - Added 2x extra pipes to mix chamber and cobweb tweak + - map: CATWALK - Replaced a lot of plasma glass with reinforced glass at atmos + - map: CATWALK - Missing power cable upper engineering added - Good spot by Aliceee2ch + - map: CATWALK - Adds missing Pipe Scrubber machine to Turbine storage - Another + Aliceee2ch spot + - map: CATWALK - New atmos lift for heavy equipment or canisters between levels + - map: CATWALK - Gravity generator can be accessed just outside engineering front + door now + - map: CATWALK - Tool storage shrunk, if you want to play poker go to the bar or + the library or dorms, tech storage re-organised + - map: CATWALK - Solar Arrays adjusted to actually be usable in the event of power + loss + necromanceranne: + - refactor: The vorpal scythe now handles empowerment more cleanly. + - refactor: The pipegun now hints at its deep lore. +2025-10-11: + Fghj240: + - rscadd: New T3 cybernetic ears, the volume-adjusted ears. + - balance: The T1 and T2 ears are now slightly worse than and slightly better than + normal ears, respectively. + Ghommie: + - refactor: Refactored shared nullrod effects into an element. + - bugfix: The carp-sie plushie is now an actual plushie. + - balance: The toy cargo pack can no longer spawn ANY type of plushie. Instead it'll + pull from the dedicated plushie spawner, which now contains the donk, rouny + and whiny plushies as well. + - code_imp: Merged the human and living versions of the scream emote. Remember to + reset your scream hotkey if it is ever unset. + Iajret: + - bugfix: fixed not working MOD suit NVGs + Iamgoofball: + - bugfix: Fixes the clown/mime honorifics + Melbert: + - bugfix: You can interact with soup pots on stoves again + - balance: Death of artifical mobs (such as monkey cube monkeys) result in a 75% + weaker, 80% shorter moodlet that does not compound with more deaths. + SmArtKar: + - balance: Brimdust sacks no longer hit user's mount or allied mobs within lavaland + pressure. + - balance: Rush glands have had their speed boost reduced, but got a massive increase + in duration. Non-implanted glands also only protect from damage slowdowns as + opposed to all slowdowns in general. + - balance: Goliaths, raptors and goldgrubs are now affected by movespeed modifiers, + such as rush glands, when mounted. + - image: Brimdust sacks' effect have received a visual upgrade. + Sothanforax: + - rscadd: Added chitter and squeak emotes for moths + - sound: Added chitters and squeaks + lelandkemble: + - qol: Flowers can now be attached to space helmets. + - qol: Taking hats off of helmets will now put them in your hand. + - bugfix: MOD flashlights won't move hats on them when toggling. + necromanceranne: + - bugfix: The warp sfx now works properly. + - rscadd: Adds the Jaws of Recovery. One can be found in a locked glass cabinet + in medical. These jaws of life are restricted on what they can force open, and + alert security and medical whenever they are utilized to pry open departmental + doors. They can't be used to open high security doors whatsoever. And they come + with a bonesetter attachment instead of wirecutters. You know, for power-relocating + your arm. +2025-10-12: + Melbert: + - bugfix: Dragging defibs and modsuits off your back works again + paganiy: + - rscadd: changeling's last resort ability now can rupture surrounding them walls + and other objects + - rscadd: last resort now has a short animation + - balance: increased last resort's blind range from 2 to 4 tiles + - bugfix: fixed several runtimes related to changeling's last resort ability + - sound: added a gore sound effect to last resort explosion + timothymtorres: + - rscadd: Central Command has finally realized that old fashioned water is actually + good for you. It now provides a minor buff to the natural healing of liver damage. + - bugfix: Fix lighters triggering runtimes when out of fuel +2025-10-13: + ArchBTW: + - bugfix: Fixes riot shotgun unintentional melee when point blank shooting + Ezel: + - map: Sec eva now becomes all access on red alert on nebula/catwalk/icebox/wawa + - map: Deltastation Sec eva becomes all access when its red alert. + Gaxeer: + - bugfix: energy dagger pen report will be now shown in detective scanner and also + all items that transform will have additional note about it + Ghommie: + - bugfix: Fixed dimensional anomalies duplicating airlocks + Hatterhat: + - rscadd: The visors on MODsuits that used to have armor boosters now visibly toggle + based on whether the wearer is in combat mode or not. + Krysonism: + - bugfix: food / animal hybrids like the butterbear and cak now once again correctly + grab ghosts and store brains. + Melbert: + - image: CMO now has unique backpack/satchel/etc. sprites which matches their teal + palette. + - image: CMO spawns with white sneakers instead of blue sneakers. + - qol: Garment bags can hold empty backpacks/satchels/etc. + - rscdel: Defib mount removed from CMO's locker. + - bugfix: Items stocked in a storage item by default can be mouse-drag-swapped like + any other item. + SmArtKar: + - bugfix: Sleeping Carp and Cain & Abel no longer tell you about armor penetration + when you reflect projectiles with them + - bugfix: Fixed raptors going at mach speeds + SyncIt21: + - bugfix: circuit multitool won't reveal special items on mobs + - bugfix: order console correctly differentiates between private & department orders + - bugfix: order console checkout cart displays correct Private/Department order + text amounts + lelandkemble: + - spellcheck: Removed lie about free stuff from contractor kit uplink description + necromanceranne: + - qol: The chaplain energy swords now work like energy swords. Turn them on and + off! Light your way with the blade. Light a cigarette with your blade like a + badass. Feel bad that it isn't a REAL energy sword. + - bugfix: The carp'sie plushie now fits in chaplain suit storage. + - bugfix: The Jaws of Recovery bonesetting mode now has an actual sprite. + - bugfix: Some Jaws of Recovery cabinets that were strangely empty are now filled. + vinylspiders: + - bugfix: integrated toolset and integrated paperwork implants can be emagged for + an integrated combat knife and chameleon stamp, respectively (fixed a bug preventing + that from working) +2025-10-14: + FalloutFalcon: + - bugfix: ghost basic mobs use natural hair colors + Fghj240: + - bugfix: Atlas gravitronic spinal implants now use their intended sprite + Xander3359: + - refactor: Converts some attacks to interactions + necromanceranne: + - balance: Hunter boxing now grants a reasonable amount of experience in Athletics + for punching the absolute shit out of the local wildlife. + - balance: Includes crustaceans and reptiles to the list of mob types that Hunter + Boxing is allowed to mangle with their bare hands. You still can't use Hunter + Boxing on lizardpeople. Or crabpeople when they are added in 2030. +2025-10-15: + ArchBTW, NecromancerAnne (original code, sprites), SmArtKar (sprites), DrDiasyl (sprites): + - rscadd: adds Stunsword + Fghj240: + - qol: Health analyzers now tell the difference between curable and incurable permanent + traumas + SmArtKar: + - bugfix: Items no longer randomly fall out of bags when changing their size + TealSeer: + - code_imp: renamed flatten_list proc to assoc_to_values + Yobrocharlie: + - balance: buffed the cleric mace by a little bit. + mcbalaam: + - qol: Better output for sound requesting + - bugfix: '"Request Internet sound" input window''s title and description are not + inverted anymore' + thegrb93: + - bugfix: Self sustaining slime and clusterbuster now correctly fill required reagents + tontyGH: + - bugfix: moves the computer frame's anchor requirement from circuit step to finalization + step, fixing an issue where you could construct unanchored and FUNCTIONAL computers + - qol: as a side effect, you only need to wrench the PC down when construction is + being finished diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi index a63c813149b..09da69cd4a6 100644 Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 9915bcf238d..a4a9bbb8443 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/beam96x96.dmi b/icons/effects/beam96x96.dmi new file mode 100644 index 00000000000..fc3849ff99a Binary files /dev/null and b/icons/effects/beam96x96.dmi differ diff --git a/icons/hud/moon_health_64x64.dmi b/icons/hud/moon_health_64x64.dmi new file mode 100644 index 00000000000..d8faec1b7df Binary files /dev/null and b/icons/hud/moon_health_64x64.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 58aa910cb22..328056ef243 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/map_icons/items/_item.dmi b/icons/map_icons/items/_item.dmi index 7af4030ca2e..8813de54d21 100644 Binary files a/icons/map_icons/items/_item.dmi and b/icons/map_icons/items/_item.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 9710dfd3f50..d808f6dd0a9 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index b2d88058f93..4ffe357b783 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/clothing/back/backpack.dmi b/icons/mob/clothing/back/backpack.dmi index afab07d9f13..b0ba9a13fe0 100644 Binary files a/icons/mob/clothing/back/backpack.dmi and b/icons/mob/clothing/back/backpack.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 1add3b19076..d828d72ed41 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index 92b155f62d5..ddefc462165 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 7d603fed0fa..712dbad93e6 100644 Binary files a/icons/mob/clothing/head/hats.dmi and b/icons/mob/clothing/head/hats.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 9c7389788ce..b2cb68fd2fa 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/head/winterhood.dmi b/icons/mob/clothing/head/winterhood.dmi index 41a4356b188..3b28fe1c0a5 100644 Binary files a/icons/mob/clothing/head/winterhood.dmi and b/icons/mob/clothing/head/winterhood.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 91424a70486..0c57f695f07 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi index 01706411594..be6ab18d646 100644 Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ diff --git a/icons/mob/clothing/suits/wintercoat.dmi b/icons/mob/clothing/suits/wintercoat.dmi index 921e3991846..ee3e3046d28 100644 Binary files a/icons/mob/clothing/suits/wintercoat.dmi and b/icons/mob/clothing/suits/wintercoat.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 63788c8d1ed..44193562364 100644 Binary files a/icons/mob/clothing/under/civilian.dmi and b/icons/mob/clothing/under/civilian.dmi differ diff --git a/icons/mob/effects/heretic_aura.dmi b/icons/mob/effects/heretic_aura.dmi new file mode 100644 index 00000000000..7b5b93ca236 Binary files /dev/null and b/icons/mob/effects/heretic_aura.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 1b5123baf35..eeefe512b68 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index ce8ada4c694..fea4097bc66 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/clothing/glasses_lefthand.dmi b/icons/mob/inhands/clothing/glasses_lefthand.dmi index 6d44e7215e4..edb65af1512 100644 Binary files a/icons/mob/inhands/clothing/glasses_lefthand.dmi and b/icons/mob/inhands/clothing/glasses_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/glasses_righthand.dmi b/icons/mob/inhands/clothing/glasses_righthand.dmi index 89248cf2b5d..a8d11608406 100644 Binary files a/icons/mob/inhands/clothing/glasses_righthand.dmi and b/icons/mob/inhands/clothing/glasses_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 7fb4ab7bd95..dcf559dcfb7 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 91aae9fe34f..4b29e306633 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index cf5ee1475a9..d6c9d9723ad 100644 Binary files a/icons/obj/clothing/cloaks.dmi and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 97f692551f9..ab68f037e15 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/head/hats.dmi b/icons/obj/clothing/head/hats.dmi index 70872619f9b..b30c0c81ace 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index a9aaad49000..95b0f6deade 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/head/winterhood.dmi b/icons/obj/clothing/head/winterhood.dmi index 2fe960c5b8b..1ad9f6eca01 100644 Binary files a/icons/obj/clothing/head/winterhood.dmi and b/icons/obj/clothing/head/winterhood.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 6f55ddc1a93..806edaafdb6 100644 Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ diff --git a/icons/obj/clothing/suits/wintercoat.dmi b/icons/obj/clothing/suits/wintercoat.dmi index a70b4eb6cbe..3f8e1bc3835 100644 Binary files a/icons/obj/clothing/suits/wintercoat.dmi and b/icons/obj/clothing/suits/wintercoat.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 8f7c28ca047..968faeda11f 100644 Binary files a/icons/obj/clothing/under/civilian.dmi and b/icons/obj/clothing/under/civilian.dmi differ diff --git a/icons/obj/drinks/colo.dmi b/icons/obj/drinks/colo.dmi index e25c7272bfe..33a583672c3 100644 Binary files a/icons/obj/drinks/colo.dmi and b/icons/obj/drinks/colo.dmi differ diff --git a/icons/obj/storage/backpack.dmi b/icons/obj/storage/backpack.dmi index e4364146a1c..d464ee689fa 100644 Binary files a/icons/obj/storage/backpack.dmi and b/icons/obj/storage/backpack.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 1db24b418e5..0f1f57eb860 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/toys/playing_cards.dmi b/icons/obj/toys/playing_cards.dmi index af40fed3102..afb8a2579c9 100644 Binary files a/icons/obj/toys/playing_cards.dmi and b/icons/obj/toys/playing_cards.dmi differ diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi index df810abb3b4..47d057e64cc 100644 Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ diff --git a/icons/obj/weapons/baton.dmi b/icons/obj/weapons/baton.dmi index 101baab3c79..c9dc238a651 100644 Binary files a/icons/obj/weapons/baton.dmi and b/icons/obj/weapons/baton.dmi differ diff --git a/icons/obj/weapons/restraints.dmi b/icons/obj/weapons/restraints.dmi index f2d2f305d68..ddd3bf96436 100644 Binary files a/icons/obj/weapons/restraints.dmi and b/icons/obj/weapons/restraints.dmi differ diff --git a/sound/attributions.txt b/sound/attributions.txt index a45b2c7b5c4..0c5877cccbe 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -237,4 +237,6 @@ sound/mobs/non-humanoids/stoats/stoat_sound.ogg -- https://suche.tierstimmenarch sounds/mobs/humanoids/shadow/shadow_wail.ogg -- https://freesound.org/people/Robinhood76/sounds/585631/ -- License: Attribution 4.0 -sound/mobs/non-humanoids/roro/roro_warble.ogg -- Made by cutting, adjusting pitch, and adding echo of https://freesound.org/people/danlucaz/sounds/517734/ -- License: Creating Commons 0 \ No newline at end of file +sound/mobs/non-humanoids/roro/roro_warble.ogg -- Made by cutting, adjusting pitch, and adding echo of https://freesound.org/people/danlucaz/sounds/517734/ -- License: Creating Commons 0 + +sound/effects/goresplat.ogg -- https://freesound.org/people/ThefitzyG/sounds/414296/ -- License: Creative Commons 0 diff --git a/sound/effects/goresplat.ogg b/sound/effects/goresplat.ogg new file mode 100644 index 00000000000..4ada7d4f982 Binary files /dev/null and b/sound/effects/goresplat.ogg differ diff --git a/sound/mobs/humanoids/moth/credit.txt b/sound/mobs/humanoids/moth/credit.txt index 7f64b72841e..d010c0e0364 100644 --- a/sound/mobs/humanoids/moth/credit.txt +++ b/sound/mobs/humanoids/moth/credit.txt @@ -1,5 +1,9 @@ -"moth_flutter" modified from +"moth_flutter" modified from https://freesound.org/people/Godowan/sounds/240476/ (CC 0 license) -who knows where the original moth scream noise was I sure as hell don't \ No newline at end of file +who knows where the original moth scream noise was I sure as hell don't + +moth_chitter and moth_squeak were taken and edited by Sothanforax from +https://github.com/BeeStation/BeeStation-Hornet/tree/master/sound/emotes/moth +(CC-BY-SA-3.0) diff --git a/sound/mobs/humanoids/moth/moth_chitter.ogg b/sound/mobs/humanoids/moth/moth_chitter.ogg new file mode 100644 index 00000000000..45bac84425b Binary files /dev/null and b/sound/mobs/humanoids/moth/moth_chitter.ogg differ diff --git a/sound/mobs/humanoids/moth/moth_squeak.ogg b/sound/mobs/humanoids/moth/moth_squeak.ogg new file mode 100644 index 00000000000..f71d7f87c5a Binary files /dev/null and b/sound/mobs/humanoids/moth/moth_squeak.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg b/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg new file mode 100644 index 00000000000..957fb4cd175 Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_loop_one.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg b/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg new file mode 100644 index 00000000000..5d6d0004491 Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_loop_two.ogg differ diff --git a/sound/mobs/non-humanoids/stargazer/beam_open.ogg b/sound/mobs/non-humanoids/stargazer/beam_open.ogg new file mode 100644 index 00000000000..1f99c32c61c Binary files /dev/null and b/sound/mobs/non-humanoids/stargazer/beam_open.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index 0eba101a1c0..334510b5f16 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -166,6 +166,7 @@ As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allo As the Bartender, the drinks you start with only give you the basics. If you want more advanced mixtures, look into working with chemistry, hydroponics, or even mining for things to grind up and throw in! As the Bartender, you can use a circular saw on your shotgun to make it easier to store. As the Bartender, remember to set up the bar sign by walking up to it and clicking it! +As the Bartender, serving a glass of water between drinks is your best friend. It slows alcohol absorption and provides hydration to support liver recovery. As the Blob, don't neglect the creation of factories. These create spores that carry your reagent and can chase crew members far further than you. Spores can also be rallied to swarm the crew and cause panic, and can even take over corpses to create much more dangerous blob zombies! As the Blob, keep your core some distance from space, as it is both expensive to expand onto space, easy to be attacked from, and does not count towards your win condition. Emitter platforms built in space are especially dangerous. As the Blob, removing strong blobs, resource nodes, factories, and nodes will give you 4, 15, 25, and 25 resources back, respectively. diff --git a/tgstation.dme b/tgstation.dme index 80e37216071..ac179d4cbc7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -370,6 +370,7 @@ #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" #include "code\__DEFINES\dcs\signals\signals_species.dm" #include "code\__DEFINES\dcs\signals\signals_spell.dm" +#include "code\__DEFINES\dcs\signals\signals_status_effect.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_swab.dm" @@ -1661,6 +1662,7 @@ #include "code\datums\elements\corrupted_organ.dm" #include "code\datums\elements\crackable.dm" #include "code\datums\elements\crusher_loot.dm" +#include "code\datums\elements\cuffable_item.dm" #include "code\datums\elements\cuffsnapping.dm" #include "code\datums\elements\cult_eyes.dm" #include "code\datums\elements\cult_halo.dm" @@ -1687,6 +1689,7 @@ #include "code\datums\elements\elevation.dm" #include "code\datums\elements\empprotection.dm" #include "code\datums\elements\envenomable_casing.dm" +#include "code\datums\elements\examine_lore.dm" #include "code\datums\elements\eyestab.dm" #include "code\datums\elements\falling_hazard.dm" #include "code\datums\elements\firestacker.dm" @@ -1737,6 +1740,7 @@ #include "code\datums\elements\no_crit_hitting.dm" #include "code\datums\elements\noisy_movement.dm" #include "code\datums\elements\noticable_organ.dm" +#include "code\datums\elements\nullrod_core.dm" #include "code\datums\elements\obj_regen.dm" #include "code\datums\elements\on_hit_effect.dm" #include "code\datums\elements\only_pull_living.dm" @@ -2109,6 +2113,7 @@ #include "code\datums\status_effects\_status_effect_helpers.dm" #include "code\datums\status_effects\agent_pinpointer.dm" #include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\cuffed_item.dm" #include "code\datums\status_effects\death_sound.dm" #include "code\datums\status_effects\drug_effects.dm" #include "code\datums\status_effects\gas.dm" @@ -2120,6 +2125,7 @@ #include "code\datums\status_effects\wound_effects.dm" #include "code\datums\status_effects\buffs\stop_drop_roll.dm" #include "code\datums\status_effects\buffs\stun_absorption.dm" +#include "code\datums\status_effects\buffs\xray.dm" #include "code\datums\status_effects\buffs\bioware\_bioware.dm" #include "code\datums\status_effects\buffs\bioware\circulation.dm" #include "code\datums\status_effects\buffs\bioware\cortex.dm" @@ -2562,6 +2568,7 @@ #include "code\game\objects\effects\effect_system\fluid_spread\effects_smoke.dm" #include "code\game\objects\effects\landmarks\atmospherics_sanity_landmarks.dm" #include "code\game\objects\effects\particles\acid.dm" +#include "code\game\objects\effects\particles\brimdust.dm" #include "code\game\objects\effects\particles\echo.dm" #include "code\game\objects\effects\particles\fire.dm" #include "code\game\objects\effects\particles\food.dm" @@ -2698,6 +2705,7 @@ #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\shrapnel.dm" #include "code\game\objects\items\signs.dm" +#include "code\game\objects\items\skateboards.dm" #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\soulscythe.dm" #include "code\game\objects\items\spear.dm" @@ -3107,6 +3115,8 @@ #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\syndicrate.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\crates_lockers\crates\abandoned_crates\abandoned_crates.dm" +#include "code\game\objects\structures\crates_lockers\crates\abandoned_crates\abandoned_crates_loot.dm" #include "code\game\objects\structures\gym\punching_bag.dm" #include "code\game\objects\structures\gym\weight_machine.dm" #include "code\game\objects\structures\gym\weight_machine_action.dm" @@ -3504,25 +3514,22 @@ #include "code\modules\antagonists\heretic\knowledge\blade_lore.dm" #include "code\modules\antagonists\heretic\knowledge\cosmic_lore.dm" #include "code\modules\antagonists\heretic\knowledge\flesh_lore.dm" -#include "code\modules\antagonists\heretic\knowledge\general_side.dm" +#include "code\modules\antagonists\heretic\knowledge\heretic_armor_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\lock_lore.dm" #include "code\modules\antagonists\heretic\knowledge\moon_lore.dm" #include "code\modules\antagonists\heretic\knowledge\rust_lore.dm" -#include "code\modules\antagonists\heretic\knowledge\side_ash_moon.dm" -#include "code\modules\antagonists\heretic\knowledge\side_blade_rust.dm" -#include "code\modules\antagonists\heretic\knowledge\side_cosmos_ash.dm" -#include "code\modules\antagonists\heretic\knowledge\side_flesh_void.dm" -#include "code\modules\antagonists\heretic\knowledge\side_lock_flesh.dm" -#include "code\modules\antagonists\heretic\knowledge\side_lock_moon.dm" -#include "code\modules\antagonists\heretic\knowledge\side_rust_cosmos.dm" -#include "code\modules\antagonists\heretic\knowledge\side_void_blade.dm" #include "code\modules\antagonists\heretic\knowledge\starting_lore.dm" #include "code\modules\antagonists\heretic\knowledge\void_lore.dm" +#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\reroll_targets.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_buff.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_curse.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_four.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_one.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_three.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knowledge\tier_two.dm" #include "code\modules\antagonists\heretic\magic\aggressive_spread.dm" #include "code\modules\antagonists\heretic\magic\apetravulnera.dm" #include "code\modules\antagonists\heretic\magic\ascended_shapeshift.dm" @@ -3534,6 +3541,7 @@ #include "code\modules\antagonists\heretic\magic\caretaker.dm" #include "code\modules\antagonists\heretic\magic\cosmic_expansion.dm" #include "code\modules\antagonists\heretic\magic\cosmic_runes.dm" +#include "code\modules\antagonists\heretic\magic\crimson_cleave.dm" #include "code\modules\antagonists\heretic\magic\eldritch_blind.dm" #include "code\modules\antagonists\heretic\magic\eldritch_emplosion.dm" #include "code\modules\antagonists\heretic\magic\eldritch_shapeshift.dm" @@ -3551,7 +3559,6 @@ #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" #include "code\modules\antagonists\heretic\magic\moon_parade.dm" #include "code\modules\antagonists\heretic\magic\moon_ringleader.dm" -#include "code\modules\antagonists\heretic\magic\moon_smile.dm" #include "code\modules\antagonists\heretic\magic\nightwatcher_rebirth.dm" #include "code\modules\antagonists\heretic\magic\realignment.dm" #include "code\modules\antagonists\heretic\magic\rust_charge.dm" @@ -3571,6 +3578,7 @@ #include "code\modules\antagonists\heretic\status_effects\buffs.dm" #include "code\modules\antagonists\heretic\status_effects\debuffs.dm" #include "code\modules\antagonists\heretic\status_effects\ghoul.dm" +#include "code\modules\antagonists\heretic\status_effects\heretic_passive.dm" #include "code\modules\antagonists\heretic\status_effects\mark_effects.dm" #include "code\modules\antagonists\heretic\status_effects\void_chill.dm" #include "code\modules\antagonists\heretic\structures\carving_knife.dm" @@ -4335,8 +4343,11 @@ #include "code\modules\deathmatch\deathmatch_modifier.dm" #include "code\modules\debugging\debugger.dm" #include "code\modules\debugging\tracy.dm" +#include "code\modules\detectivework\detective_scan_category.dm" #include "code\modules\detectivework\evidence.dm" #include "code\modules\detectivework\scanner.dm" +#include "code\modules\detectivework\detective_scanner_data\detective_scanner_data_entry.dm" +#include "code\modules\detectivework\detective_scanner_data\detective_scanner_log_entry.dm" #include "code\modules\discord\accountlink.dm" #include "code\modules\discord\discord_embed.dm" #include "code\modules\discord\discord_link_record.dm" @@ -5035,7 +5046,6 @@ #include "code\modules\meteors\meteor_spawning.dm" #include "code\modules\meteors\meteor_types.dm" #include "code\modules\meteors\meteor_waves.dm" -#include "code\modules\mining\abandoned_crates.dm" #include "code\modules\mining\aux_base.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx index bc32b8ea305..e5726a0c031 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx @@ -1,9 +1,10 @@ +import '../styles/interfaces/AntagInfoHeretic.scss'; + import { useState } from 'react'; import { Box, Button, DmIcon, - Flex, Section, Stack, Tabs, @@ -12,6 +13,7 @@ import type { BooleanLike } from 'tgui-core/react'; import { useBackend } from '../backend'; import { Window } from '../layouts'; +import { logger } from '../logging'; import { Rules } from './AntagInfoRules'; // SKYRAT EDIT ADDITION import { type Objective, @@ -59,29 +61,57 @@ type Knowledge = { gainFlavor: string; cost: number; bgr: string; - disabled: BooleanLike; - finished: BooleanLike; + category?: ShopCategory; + depth: number; + done: BooleanLike; ascension: BooleanLike; + disabled: BooleanLike; + tooltip?: string; }; -type KnowledgeInfo = { - knowledge_tiers: KnowledgeTier[]; -}; +enum ShopCategory { + Tree = 'tree', + Shop = 'shop', + Draft = 'draft', + Start = 'start', +} type KnowledgeTier = { nodes: Knowledge[]; }; +type HereticPassive = { + name: string; + description: string[]; +}; + +type HereticPath = { + route: string; + complexity: string; + complexity_color: string; + description: string[]; + pros: string[]; + cons: string[]; + tips: string[]; + starting_knowledge: Knowledge; + preview_abilities: Knowledge[]; + passive: HereticPassive; +}; + type Info = { charges: number; total_sacrifices: number; ascended: BooleanLike; objectives: Objective[]; can_change_objective: BooleanLike; + paths: HereticPath[]; + knowledge_shop: Knowledge[]; + knowledge_tiers: KnowledgeTier[]; + passive_level: number; }; const IntroductionSection = (props) => { - const { data, act } = useBackend(); + const { data } = useBackend(); const { objectives, ascended, can_change_objective } = data; return ( @@ -211,7 +241,7 @@ const GuideSection = () => { ); }; -const InformationSection = (props) => { +const InformationSection = () => { const { data } = useBackend(); const { charges, total_sacrifices, ascended } = data; return ( @@ -247,91 +277,37 @@ const InformationSection = (props) => { ); }; -const KnowledgeTree = (props) => { - const { data, act } = useBackend(); +const KnowledgeTree = () => { + const { data } = useBackend(); const { knowledge_tiers } = data; + const nodesToShow = knowledge_tiers.filter((tier) => tier.nodes.length > 0); + return (
    DAWN - {knowledge_tiers.length === 0 + {nodesToShow.length === 0 ? 'None!' - : knowledge_tiers.map((tier, i) => ( + : nodesToShow.map((tier, i) => ( - {tier.nodes.map((node) => ( - - - {!!node.ascension && ( - - DUSK - - )} - + ))} - +
    ))} @@ -340,64 +316,376 @@ const KnowledgeTree = (props) => { ); }; -const ResearchInfo = (props) => { - const { data } = useBackend(); +type KnowledgeNodeProps = { + node: Knowledge; + purchaseCategory?: ShopCategory; + can_buy?: BooleanLike; +}; + +const KnowledgeNode = (props: KnowledgeNodeProps) => { + const { node, can_buy = true, purchaseCategory } = props; + const { data, act } = useBackend(); const { charges } = data; + const isBuyable = can_buy && !node.done && !node.disabled; + + const iconState = () => { + if (!can_buy) { + return node.bgr; + } + if (node.done) { + return 'node_finished'; + } + if (charges < node.cost || node.disabled) { + return 'node_locked'; + } + return node.bgr; + }; + return ( - - + + + {!!node.ascension && ( + + DUSK + + )} + + ); +}; + +const KnowledgeShop = () => { + const { data } = useBackend(); + const { knowledge_shop } = data; + + if (!knowledge_shop || knowledge_shop.length === 0) { + return null; + } + + return ( +
    + + + +
    + ); + + function Knowledges() { + // filter the list into being indexed by tier + const tiers: Knowledge[][] = knowledge_shop.reduce((acc, knowledge) => { + const tierIndex = knowledge.depth - 1; // depth starts at 1, so + if (!acc[tierIndex]) { + acc[tierIndex] = []; + } + acc[tierIndex].push(knowledge); + return acc; + }, [] as Knowledge[][]); + + return tiers?.map((tier, index) => ( + + Tier {index + 1} + + {tier.map((knowledge) => ( + + + + ))} + +
    +
    + )); + } +}; + +const ResearchInfo = () => { + const { data } = useBackend(); + const { charges, knowledge_shop } = data; + + return ( + <> + You have {charges || 0}  knowledge point{charges !== 1 ? 's' : ''} {' '} to spend. + + + + + {knowledge_shop?.length && ( + + + + )} + + + ); +}; + +const PathInfo = ({ currentPath }: { currentPath?: HereticPath }) => { + const { data } = useBackend(); + const { paths } = data; + + const pathBoughtIndex = paths.findIndex( + (path) => currentPath && path.route === currentPath.route, + ); + + const [currentTab, setCurrentTab] = useState( + pathBoughtIndex !== -1 ? pathBoughtIndex : 0, + ); + + return ( + + {!currentPath && ( + + + {paths.map((path, index) => ( + setCurrentTab(index)} + > + {path.route} + + ))} + + + )} - + ); }; -export const AntagInfoHeretic = (props) => { +const PathContent = ({ + path, + isPathSelected, +}: { + path: HereticPath; + isPathSelected: boolean; +}) => { const { data } = useBackend(); - const { ascended } = data; + const { passive_level } = data; + const { name, description } = path.passive; + return ( +
    {path.route}} + textAlign="center" + fill + scrollable + > + + {!isPathSelected && ( + +

    Choose Path:

    {' '} + +
    +

    + Complexity:{' '} + + {path.complexity} + +

    +
    +
    + )} - const [currentTab, setTab] = useState(0); + + Description:{' '} + {path.description.map((line, index) => ( +
    {line}
    + ))} +
    + {(!isPathSelected && ( + + Passive: {name} +

    {description[0]}

    +
    + )) || ( + + + Passive: {name}, level: {passive_level} + + + {description.map((line, index) => ( + = index + 1 ? 'Passive--Active' : ''}`} + > + Level {index + 1} +
    + {line} +
    + ))} +
    +
    + )} + + {!isPathSelected && ( + <> + Guaranteed Abilities: + + {path.preview_abilities.map((ability) => ( + + + + ))} + + + )} + + {!isPathSelected && ( + <> + + Pros: +
    + {path.pros.map((pro, index) => ( +

    {pro}

    + ))} +
    +
    + + Cons: +
    + {path.cons.map((con, index) => ( +

    {con}

    + ))} +
    +
    + + )} + + {isPathSelected && ( + + Tips: +
      + {path.tips.map((tip, index) => ( +
    • {tip}
    • + ))} +
    +
    + )} +
    +
    + ); +}; + +export const AntagInfoHeretic = () => { + const { data } = useBackend(); + const { ascended, knowledge_tiers, paths } = data; + + const [currentTab, setTab] = useState(1); + // only tiers has done variables set + const currentPath = paths.find((path) => + knowledge_tiers.some((tier) => + tier.nodes.some( + (node) => node.done && node.path === path.starting_knowledge.path, + ), + ), + ); + + const tabs = [ + { label: 'Information', icon: 'info', content: }, + { + label: 'Path Info', + icon: 'info', + content: , + }, + { label: 'Research', icon: 'book', content: }, + ]; + + const currentTheme = () => { + if (currentPath?.route) { + return `Heretic theme-Heretic--${currentPath.route.replace(' ', '')}`; + } + return 'Heretic'; + }; return ( - - + + - setTab(0)} - > - Information - - setTab(1)} - > - Research - + {tabs.map((tab, index) => ( + setTab(index)} + > + {tab.label} + + ))} - - {(currentTab === 0 && ) || } - + {tabs[currentTab].content} diff --git a/tgui/packages/tgui/interfaces/BeakerPanel.tsx b/tgui/packages/tgui/interfaces/BeakerPanel.tsx new file mode 100644 index 00000000000..de3cd5ade0a --- /dev/null +++ b/tgui/packages/tgui/interfaces/BeakerPanel.tsx @@ -0,0 +1,321 @@ +import { useState } from 'react'; +import { + Button, + Dropdown, + NumberInput, + Section, + Stack, +} from 'tgui-core/components'; +import { capitalizeFirst } from 'tgui-core/string'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type typePath = string; + +type Reagent = { + id: typePath; + text: string; +}; + +type ContainerType = { + id: typePath; + text: string; + volume: number; +}; + +type Data = { + reagents: Reagent[]; + containers: ContainerType[]; +}; + +type Container = { + type: typePath; + reagents: Record; +}; + +function makeContainerState(default_type: ContainerType) { + return useState({ + type: default_type.id, + reagents: {}, + }); +} + +function removeContainerReagent( + container: Container, + setContainer: (container: Container) => void, + reagent: typePath, +) { + const newReagents = { ...container.reagents }; + delete newReagents[reagent]; + setContainer({ ...container, reagents: newReagents }); +} + +function setContainerReagentVolume( + container: Container, + setContainer: (container: Container) => void, + reagent: typePath, + volume: number = 10, +) { + const newReagents = { ...container.reagents }; + newReagents[reagent] = volume; + setContainer({ ...container, reagents: newReagents }); +} + +function containerToSpawnInfo(container: Container) { + return { + container: container.type, + reagents: container.reagents, + }; +} + +function readableContainerType(container_type: ContainerType) { + return capitalizeFirst(`${container_type.text} (${container_type.volume}u)`); +} + +function readableReagentType(reagent: Reagent) { + return capitalizeFirst(reagent.text); +} + +function grenadeCheck(containers: Container[]) { + return containers.every((container) => container.type.includes('beaker')); +} + +type ContainerProps = { + container: Container; + number: number; + updateContainer: (container: Container) => void; + reagents: Reagent[]; + containers: ContainerType[]; +}; + +const ContainerSection = (props: ContainerProps) => { + const { container, number, updateContainer, reagents, containers } = props; + const { act } = useBackend(); + + const [setAddingReagent, setSetAddingReagent] = useState( + reagents[0].id, + ); + const [setAddingReagentVolume, setSetAddingReagentVolume] = + useState(50); + + return ( +
    + act('spawn', { spawn_info: containerToSpawnInfo(container) }) + } + > + Spawn + + } + > + + + ({ + displayText: readableContainerType(container), + value: container.id, + }))} + placeholder="Select Container Type" + selected={container.type} + displayText={readableContainerType( + containers.find((c) => c.id === container.type)!, + )} + onSelected={(value) => { + updateContainer({ ...container, type: value }); + }} + /> + + {Object.keys(container.reagents).map((reagent) => ( + + + + + + + { + setContainerReagentVolume( + container, + updateContainer, + reagent, + value, + ); + }} + /> + + +
    + ); +}; + +export const BeakerPanel = () => { + const { act, data } = useBackend(); + const { reagents, containers } = data; + + const [container_one, setContainerOne] = makeContainerState(containers[0]); + const [container_two, setContainerTwo] = makeContainerState(containers[0]); + const [grenadeTimer, setGrenadeTimer] = useState(5.0); + + const reagentsSorted = reagents.sort((a, b) => (a.text < b.text ? -1 : 1)); + const containersSorted = containers.sort((a, b) => + readableContainerType(a) < readableContainerType(b) ? -1 : 1, + ); + + return ( + + + + +
    + + + + + + Timer:  + { + setGrenadeTimer(value); + }} + /> + + + + Spawned containers will grow to fit all listed reagents! + + + +
    +
    + + + + + + + + + + +
    +
    +
    + ); +}; diff --git a/tgui/packages/tgui/interfaces/Cargo/CargoCart.tsx b/tgui/packages/tgui/interfaces/Cargo/CargoCart.tsx index 5238fdcff61..13777f2e8e6 100644 --- a/tgui/packages/tgui/interfaces/Cargo/CargoCart.tsx +++ b/tgui/packages/tgui/interfaces/Cargo/CargoCart.tsx @@ -57,7 +57,7 @@ export function CargoCart(props) { function CheckoutItems(props) { const { act, data } = useBackend(); - const { amount_by_name = {}, can_send, cart = [], max_order } = data; + const { can_send, cart = [], max_order } = data; const [isValid, setIsValid] = useState(true); @@ -107,7 +107,7 @@ function CheckoutItems(props) { /> - - } - > - {log_data - .map((log, index) => ( - - )) - .reverse()} -
    - )} - - - ); -}; - -const ForensicLog = ({ log, index }: { log: LogData; index: number }) => { - const { act } = useBackend(); - return ( -
    act('delete', { index })} - /> - } - > - {!log.Prints && !log.Fibers && !log.Blood && !log.Reagents ? ( - No forensic traces found. - ) : ( - - {log.Fibers && Object.keys(log.Fibers).length > 0 && ( - - {Object.keys(log.Fibers).map((fibers) => ( - - - {fibers} - - ))} - - )} - {log.Prints && Object.values(log.Prints).length > 0 && ( - - {Object.values(log.Prints).map((print) => ( - - - {print} - - ))} - - )} - {log.Blood && Object.keys(log.Blood).length > 0 && ( - - {Object.keys(log.Blood).map((dna) => ( - - - {`${dna}, ${log.Blood[dna]}`} - - ))} - - )} - {log.Reagents && Object.keys(log.Reagents)?.length > 0 && ( - - - {Object.keys(log.Reagents).map((reagent) => ( - - {`${log.Reagents[reagent]} u.`} - - ))} - - - )} - {log['ID Access'] && Object.keys(log['ID Access'])?.length > 0 && ( - - - {Object.keys(log['ID Access']).map((region) => ( - - {log['ID Access'][region]} - - ))} - - - )} - - )} -
    - ) as any; -}; diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx new file mode 100644 index 00000000000..395eb3f48fd --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/ForensicLogs.tsx @@ -0,0 +1,181 @@ +import { Box, Button, Icon, LabeledList, Section } from 'tgui-core/components'; +import { capitalizeFirst } from 'tgui-core/string'; +import { useBackend } from '../../backend'; +import type { DataEntry, ForensicScannerData } from './types'; + +type ForensicLogsProps = { + dataEntries: DataEntry[]; + scanTarget: string; + scanTime: string; + index: number; +}; + +export function ForensicLogs(props: ForensicLogsProps) { + const { act, data } = useBackend(); + const { categories } = data; + const { dataEntries, scanTarget, scanTime, index } = props; + return ( +
    act('delete', { index })} + /> + } + > + {dataEntries.length === 0 ? ( + No forensic traces found. + ) : ( + + {dataEntries.map((dataEntry) => { + const category = categories[dataEntry.category]; + return ( + + + + ); + })} + + )} +
    + ); +} + +type ForensicLogProps = { + logCategoryId: string; + log: Record; + iconName: string; + iconColor: string; +}; + +function ForensicLog(props: ForensicLogProps) { + const { logCategoryId, log, iconName, iconColor } = props; + if (logCategoryId === 'Fingerprints') + return ( + + ); + + if (logCategoryId === 'Reagents') + return ( + + ); + + if (logCategoryId === 'Blood') + return ( + + ); + + if (logCategoryId === 'ID_Access') + return ( + + ); + + return ( + + ); +} + +type LogFormatterProprs = { + log: Record; + iconName: string; + iconColor: string; +}; + +function DefaultLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {value} + + ))} + + ); +} + +function BloodLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {`${key}, ${value}`} + + ))} + + ); +} + +function PrintsLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + <> + {Object.entries(log).map(([key, value]) => ( + + + {value} + + ))} + + ); +} + +function ReagentsLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + + {Object.keys(log).map((reagent) => ( + + + {reagent} + + } + > + {`${log[reagent]} u.`} + + ))} + + ); +} + +function IdAccessLogFormatter(props: LogFormatterProprs) { + const { log, iconName, iconColor } = props; + return ( + + {Object.keys(log).map((region) => ( + + + {region} + + } + > + {log[region]} + + ))} + + ); +} diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx new file mode 100644 index 00000000000..cf00035e2bc --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/index.tsx @@ -0,0 +1,51 @@ +import { Button, NoticeBox, Section } from 'tgui-core/components'; +import { useBackend } from '../../backend'; +import { Window } from '../../layouts'; +import { ForensicLogs } from './ForensicLogs'; +import type { ForensicScannerData } from './types'; + +export function ForensicScanner() { + const { act, data } = useBackend(); + const { logs = [] } = data; + return ( + + + {logs.length === 0 ? ( + Log empty. + ) : ( +
    + act('clear')} + > + Clear logs + + + + } + > + {logs + .map((log, index) => ( + + )) + .reverse()} +
    + )} +
    +
    + ); +} diff --git a/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx b/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx new file mode 100644 index 00000000000..33ecfc07d48 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForensicScanner/types.tsx @@ -0,0 +1,21 @@ +export type ForensicScannerData = { + logs: LogEntry[]; + categories: Record; +}; + +export type LogEntry = { + scanTarget: string; + scanTime: string; + dataEntries: DataEntry[]; +}; + +export type DataEntry = { + category: string; + data: Record; +}; + +export type ForensicScannerCategory = { + name: string; + uiIcon: string; + uiIconColor: string; +}; diff --git a/tgui/packages/tgui/interfaces/MarkdownViewer.tsx b/tgui/packages/tgui/interfaces/MarkdownViewer.tsx index 8ad813c764a..6de28f89dfa 100644 --- a/tgui/packages/tgui/interfaces/MarkdownViewer.tsx +++ b/tgui/packages/tgui/interfaces/MarkdownViewer.tsx @@ -13,7 +13,7 @@ type MarkdownViewerData = { export const MarkdownViewer = (_: any) => { const { data } = useBackend(); return ( - + diff --git a/tgui/packages/tgui/interfaces/OutfitEditor.jsx b/tgui/packages/tgui/interfaces/OutfitEditor.jsx index 5bacf9e4adc..003c623b69c 100644 --- a/tgui/packages/tgui/interfaces/OutfitEditor.jsx +++ b/tgui/packages/tgui/interfaces/OutfitEditor.jsx @@ -131,7 +131,7 @@ const OutfitSlot = (props) => { // todo: intuitive way to clear items onClick={(e) => act(e.ctrlKey ? 'ctrlClick' : 'click', { slot })} > - + {name} diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hereticsmuggler.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hereticsmuggler.ts deleted file mode 100644 index bde3be67170..00000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hereticsmuggler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type Antagonist, Category } from '../base'; -import { HERETIC_MECHANICAL_DESCRIPTION } from './heretic'; - -const HereticSmuggler: Antagonist = { - key: 'hereticsmuggler', - name: 'Heretic Smuggler', - description: [ - 'A form of heretic that can activate when joining an ongoing shift.', - HERETIC_MECHANICAL_DESCRIPTION, - ], - category: Category.Latejoin, -}; - -export default HereticSmuggler; diff --git a/tgui/packages/tgui/interfaces/StripMenu.tsx b/tgui/packages/tgui/interfaces/StripMenu.tsx index 0488b675895..c8e50c055c3 100644 --- a/tgui/packages/tgui/interfaces/StripMenu.tsx +++ b/tgui/packages/tgui/interfaces/StripMenu.tsx @@ -59,6 +59,11 @@ const ALTERNATE_ACTIONS: Record = { text: 'Unknot', }, + remove_item_cuffs: { + icon: 'handcuffs', + text: 'Remove Handcuffs', + }, + enable_internals: { icon: 'tg-air-tank', text: 'Enable internals', @@ -348,7 +353,7 @@ export const StripMenu = (props) => { ); tooltip = item.name; - if (item.alternate) { + if (item.alternate?.length) { alternateActions = item.alternate.map( (alternateKey, idx) => { const alternateAction = diff --git a/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss b/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss new file mode 100644 index 00000000000..74b2b985282 --- /dev/null +++ b/tgui/packages/tgui/styles/interfaces/AntagInfoHeretic.scss @@ -0,0 +1,193 @@ +.theme-Heretic { + --background-color: radial-gradient( + circle, + rgb(3, 3, 7) 54%, + rgb(9, 9, 26) 60%, + rgb(8, 5, 15) 80%, + rgb(13, 7, 26) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(3, 3, 7) 54%, + rgb(9, 9, 26) 60%, + rgb(8, 5, 15) 80%, + rgb(13, 7, 26) 100% + ); + + &--AshPath { + --background-color: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + } + + &--RustPath { + // brown like poop + --background-color: radial-gradient( + circle, + rgba(120, 48, 9) 54%, + rgba(139, 48, 9) 60%, + rgb(150, 48, 9) 80%, + rgba(160, 48, 9) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(107, 48, 48) 54%, + rgb(211, 19, 19) 60%, + rgb(221, 84, 25) 80%, + rgb(230, 81, 12) 100% + ); + } + + &--FleshPath { + --background-color: radial-gradient( + circle, + rgb(153, 26, 26) 54%, + rgba(130, 9, 9, 1) 60%, + rgb(150, 33, 30) 80%, + rgb(141, 30, 26) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(100, 0, 0) 54%, + rgb(100, 2, 2) 60%, + rgba(150, 8, 5, 1) 80%, + rgb(200, 34, 0) 100% + ); + } + + &--VoidPath { + --background-color: radial-gradient( + circle, + rgb(13, 13, 66) 54%, + rgb(22, 22, 66) 60%, + rgb(25, 25, 99) 80%, + rgb(42, 42, 192) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(13, 13, 66) 54%, + rgb(22, 22, 66) 60%, + rgb(25, 25, 99) 80%, + rgb(42, 42, 192) 100% + ); + } + + &--BladePath { + --background-color: radial-gradient( + circle, + rgb(139, 141, 137) 54%, + rgb(139, 141, 137) 60%, + rgb(170, 188, 186) 80%, + rgba(185, 188, 182) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(139, 141, 137) 54%, + rgb(139, 141, 137) 60%, + rgb(170, 188, 186) 80%, + rgba(185, 188, 182) 100% + ); + } + + &--CosmicPath { + --background-color: radial-gradient( + circle, + rgb(78, 38, 110) 54%, + rgb(78, 38, 110) 60%, + rgb(78, 38, 110) 80%, + rgb(78, 38, 110) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + &--LockPath { + --background-color: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgba(3, 3, 7, 1) 54%, + rgba(9, 9, 26, 1) 60%, + rgba(8, 5, 15, 1) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + &--MoonPath { + --background-color: radial-gradient( + circle, + rgb(215, 179, 218) 54%, + rgb(163, 139, 165) 60%, + rgb(108, 92, 109) 80%, + rgba(13, 7, 26, 1) 100% + ); + --background-color-title: radial-gradient( + circle, + rgb(215, 179, 218) 54%, + rgb(163, 139, 165) 60%, + rgb(108, 92, 109) 80%, + rgba(13, 7, 26, 1) 100% + ); + } + + .TitleBar { + background: var(--background-color); + } + + .Window { + background: var(--background-color); + + &__content { + background-image: none; + } + } + + &--ascended { + --background-color: radial-gradient( + circle, + rgba(24, 9, 9, 1) 54%, + rgba(31, 10, 10, 1) 60%, + rgba(46, 11, 11, 1) 80%, + rgba(47, 14, 14, 1) 100% + ); + } +} + +.path-title { + padding: 0; + margin: 0; + text-align: center; +} + +.Passive { + margin: 0.5em 0; + background-color: #808080; + border-radius: 5px; + width: 50%; + padding: 0.5em; + + &--Active { + background-color: #62cc67; + } +}